Adds UAV support for D3D12, Vulkan and reworked for OpenGL, D3D11 (#2119)

* Adds UAV support for D3D12, Vulkan and reworked support for OpenGL, D3D11

UAV support is now uniform across compute and draw.
To set a UAV you just use bgfx::setImage() and IMAGE2D in the shader, just like in compute.
Due to these changes shaders will have to be recompiled.

The changes include:
	- D3D11 requires patching of the UAV slot number (which is now done by modifying the DXBC instead of using a macro)
	- If the DXBC binary includes a debug chunk, that is also patched to match the new slot number
	- All the other renderers don't need any kind of patching
	- There are some shader annotations to better convert the UAV format used in hlsl to spirv

Possibility of further enhancements:
	- bgfx::setViewFrameBuffer() only supports binding to a framebuffer or, using BGFX_INVALID_HANDLE, to bind the default backbuffer. This doesn't allow for the case where there is no need to bind to either one of them, for example when using a fragment shader only to read and write to an UAV.

* Bump shader version, because they need to be recompiled.
This commit is contained in:
kingscallop
2020-10-05 05:51:41 +01:00
committed by GitHub
parent 32aa281147
commit 436b7fab9e
22 changed files with 587 additions and 259 deletions

View File

@@ -11,7 +11,7 @@ $input v_texcoord0
SAMPLER2D(s_normal, 0);
SAMPLER2D(s_depth, 1);
FRAMEBUFFER_IMAGE2D_RW(s_light, rgba8, 0);
IMAGE2D_RW(i_light, rgba8, 3);
uniform vec4 u_lightPosRadius[1];
uniform vec4 u_lightRgbInnerR[1];
@@ -35,6 +35,6 @@ void main()
ivec2 coord = ivec2(gl_FragCoord.xy);
vec3 lightColor = calcLight(wpos, normal, view, u_lightPosRadius[0].xyz, u_lightPosRadius[0].w, u_lightRgbInnerR[0].xyz, u_lightRgbInnerR[0].w);
vec4 color = imageLoad(s_light, coord);
imageStore(s_light, coord, color + vec4(toGamma(lightColor.xyz), 1.0));
vec4 color = imageLoad(i_light, coord);
imageStore(i_light, coord, color + vec4(toGamma(lightColor.xyz), 1.0));
}