Merge pull request #1655 from attilaz/37-gdr-ogl
37-gpudrivenrendering fix for OpenGL
This commit is contained in:
commit
0997b034ed
26
examples/37-gpudrivenrendering/cs_gdr_copy_z.sc
Normal file
26
examples/37-gpudrivenrendering/cs_gdr_copy_z.sc
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 Kostas Anagnostou. All rights reserved.
|
||||||
|
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "bgfx_compute.sh"
|
||||||
|
|
||||||
|
SAMPLER2D(s_texOcclusionDepth, 0);
|
||||||
|
IMAGE2D_WR(s_texOcclusionDepthOut, r32f, 1);
|
||||||
|
|
||||||
|
uniform vec4 u_inputRTSize;
|
||||||
|
|
||||||
|
NUM_THREADS(16, 16, 1)
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
// this shader can be used to both copy a mip over to the output and downscale it.
|
||||||
|
|
||||||
|
ivec2 coord = ivec2(gl_GlobalInvocationID.xy);
|
||||||
|
|
||||||
|
if (all(lessThan(coord.xy, u_inputRTSize.xy) ) )
|
||||||
|
{
|
||||||
|
float maxDepth = texelFetch(s_texOcclusionDepth, coord.xy, 0).x;
|
||||||
|
|
||||||
|
imageStore(s_texOcclusionDepthOut, coord, vec4(maxDepth,0,0,1) );
|
||||||
|
}
|
||||||
|
}
|
@ -21,26 +21,18 @@ void main()
|
|||||||
{
|
{
|
||||||
float maxDepth = 1.0;
|
float maxDepth = 1.0;
|
||||||
|
|
||||||
if (u_inputRTSize.z > 1)
|
vec4 depths = vec4(
|
||||||
{
|
imageLoad(s_texOcclusionDepthIn, ivec2(u_inputRTSize.zw * coord.xy ) ).x
|
||||||
vec4 depths = vec4(
|
, imageLoad(s_texOcclusionDepthIn, ivec2(u_inputRTSize.zw * coord.xy + ivec2(1.0, 0.0) ) ).x
|
||||||
imageLoad(s_texOcclusionDepthIn, ivec2(u_inputRTSize.zw * coord.xy ) ).x
|
, imageLoad(s_texOcclusionDepthIn, ivec2(u_inputRTSize.zw * coord.xy + ivec2(0.0, 1.0) ) ).x
|
||||||
, imageLoad(s_texOcclusionDepthIn, ivec2(u_inputRTSize.zw * coord.xy + ivec2(1.0, 0.0) ) ).x
|
, imageLoad(s_texOcclusionDepthIn, ivec2(u_inputRTSize.zw * coord.xy + ivec2(1.0, 1.0) ) ).x
|
||||||
, imageLoad(s_texOcclusionDepthIn, ivec2(u_inputRTSize.zw * coord.xy + ivec2(0.0, 1.0) ) ).x
|
);
|
||||||
, imageLoad(s_texOcclusionDepthIn, ivec2(u_inputRTSize.zw * coord.xy + ivec2(1.0, 1.0) ) ).x
|
|
||||||
);
|
|
||||||
|
|
||||||
// find and return max depth
|
// find and return max depth
|
||||||
maxDepth = max(
|
maxDepth = max(
|
||||||
max(depths.x, depths.y)
|
max(depths.x, depths.y)
|
||||||
, max(depths.z, depths.w)
|
, max(depths.z, depths.w)
|
||||||
);
|
);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// do not downscale, just copy the value over to the output rendertarget
|
|
||||||
maxDepth = imageLoad(s_texOcclusionDepthIn, coord.xy).x;
|
|
||||||
}
|
|
||||||
|
|
||||||
imageStore(s_texOcclusionDepthOut, coord, vec4(maxDepth,0,0,1) );
|
imageStore(s_texOcclusionDepthOut, coord, vec4(maxDepth,0,0,1) );
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,9 @@ void main()
|
|||||||
//transform World space aaBox to NDC
|
//transform World space aaBox to NDC
|
||||||
vec4 clipPos = mul( u_viewProj, vec4(boxCorners[i], 1) );
|
vec4 clipPos = mul( u_viewProj, vec4(boxCorners[i], 1) );
|
||||||
|
|
||||||
|
#if BGFX_SHADER_LANGUAGE_GLSL
|
||||||
|
clipPos.z = 0.5 * ( clipPos.z + clipPos.w );
|
||||||
|
#endif
|
||||||
clipPos.z = max(clipPos.z, 0);
|
clipPos.z = max(clipPos.z, 0);
|
||||||
|
|
||||||
clipPos.xyz = clipPos.xyz / clipPos.w;
|
clipPos.xyz = clipPos.xyz / clipPos.w;
|
||||||
@ -83,6 +86,10 @@ void main()
|
|||||||
if (dims.x <= 2 && dims.y <= 2)
|
if (dims.x <= 2 && dims.y <= 2)
|
||||||
mip = level_lower;
|
mip = level_lower;
|
||||||
|
|
||||||
|
#if BGFX_SHADER_LANGUAGE_GLSL
|
||||||
|
boxUVs.y = 1.0 - boxUVs.y;
|
||||||
|
boxUVs.w = 1.0 - boxUVs.w;
|
||||||
|
#endif
|
||||||
//load depths from high z buffer
|
//load depths from high z buffer
|
||||||
vec4 depth =
|
vec4 depth =
|
||||||
{
|
{
|
||||||
|
@ -32,8 +32,8 @@ void main()
|
|||||||
int NoofDrawcalls = int(u_cullingConfig.w);
|
int NoofDrawcalls = int(u_cullingConfig.w);
|
||||||
|
|
||||||
int offset = 1;
|
int offset = 1;
|
||||||
temp[2 * tID ] = uint(instancePredicates[2 * tID ]); // load input into shared memory
|
temp[2 * tID ] = uint(instancePredicates[2 * tID ] ? 1 : 0); // load input into shared memory
|
||||||
temp[2 * tID + 1] = uint(instancePredicates[2 * tID + 1]);
|
temp[2 * tID + 1] = uint(instancePredicates[2 * tID + 1] ? 1 : 0);
|
||||||
|
|
||||||
int d;
|
int d;
|
||||||
|
|
||||||
|
@ -604,6 +604,7 @@ public:
|
|||||||
|
|
||||||
// Create programs from shaders for occlusion pass.
|
// Create programs from shaders for occlusion pass.
|
||||||
m_programOcclusionPass = loadProgram("vs_gdr_render_occlusion", NULL);
|
m_programOcclusionPass = loadProgram("vs_gdr_render_occlusion", NULL);
|
||||||
|
m_programCopyZ = loadProgram("cs_gdr_copy_z", NULL);
|
||||||
m_programDownscaleHiZ = loadProgram("cs_gdr_downscale_hi_z", NULL);
|
m_programDownscaleHiZ = loadProgram("cs_gdr_downscale_hi_z", NULL);
|
||||||
m_programOccludeProps = loadProgram("cs_gdr_occlude_props", NULL);
|
m_programOccludeProps = loadProgram("cs_gdr_occlude_props", NULL);
|
||||||
m_programStreamCompaction = loadProgram("cs_gdr_stream_compaction", NULL);
|
m_programStreamCompaction = loadProgram("cs_gdr_stream_compaction", NULL);
|
||||||
@ -706,6 +707,7 @@ public:
|
|||||||
|
|
||||||
bgfx::destroy(m_programMainPass);
|
bgfx::destroy(m_programMainPass);
|
||||||
bgfx::destroy(m_programOcclusionPass);
|
bgfx::destroy(m_programOcclusionPass);
|
||||||
|
bgfx::destroy(m_programCopyZ);
|
||||||
bgfx::destroy(m_programDownscaleHiZ);
|
bgfx::destroy(m_programDownscaleHiZ);
|
||||||
bgfx::destroy(m_programOccludeProps);
|
bgfx::destroy(m_programOccludeProps);
|
||||||
bgfx::destroy(m_programStreamCompaction);
|
bgfx::destroy(m_programStreamCompaction);
|
||||||
@ -813,29 +815,29 @@ public:
|
|||||||
uint32_t width = m_hiZwidth;
|
uint32_t width = m_hiZwidth;
|
||||||
uint32_t height = m_hiZheight;
|
uint32_t height = m_hiZheight;
|
||||||
|
|
||||||
for (uint8_t lod = 0; lod < m_noofHiZMips; ++lod)
|
// copy mip zero over to the hi Z buffer.
|
||||||
|
// We can't currently use blit as it requires same format and CopyResource is not exposed.
|
||||||
{
|
{
|
||||||
float coordinateScale = lod > 0 ? 2.0f : 1.0f;
|
float inputRendertargetSize[4] = { (float)width, (float)height, 0.0f, 0.0f };
|
||||||
|
|
||||||
float inputRendertargetSize[4] = { (float)width, (float)height, coordinateScale, coordinateScale };
|
|
||||||
bgfx::setUniform(u_inputRTSize, inputRendertargetSize);
|
bgfx::setUniform(u_inputRTSize, inputRendertargetSize);
|
||||||
|
|
||||||
if (lod > 0)
|
bgfx::setTexture(0, s_texOcclusionDepth, getTexture(m_hiZDepthBuffer, 0));
|
||||||
{
|
bgfx::setImage(1, getTexture(m_hiZBuffer, 0), 0, bgfx::Access::Write);
|
||||||
// down scale mip 1 onwards
|
|
||||||
width /= 2;
|
|
||||||
height /= 2;
|
|
||||||
|
|
||||||
bgfx::setImage(0, getTexture(m_hiZBuffer, 0), lod - 1, bgfx::Access::Read);
|
bgfx::dispatch(RENDER_PASS_HIZ_DOWNSCALE_ID, m_programCopyZ, width/16, height/16);
|
||||||
bgfx::setImage(1, getTexture(m_hiZBuffer, 0), lod, bgfx::Access::Write);
|
}
|
||||||
}
|
|
||||||
else
|
for (uint8_t lod = 1; lod < m_noofHiZMips; ++lod)
|
||||||
{
|
{
|
||||||
// copy mip zero over to the hi Z buffer.
|
float inputRendertargetSize[4] = { (float)width, (float)height, 2.0f, 2.0f };
|
||||||
// We can't currently use blit as it requires same format and CopyResource is not exposed.
|
bgfx::setUniform(u_inputRTSize, inputRendertargetSize);
|
||||||
bgfx::setImage(0, getTexture(m_hiZDepthBuffer, 0), 0, bgfx::Access::Read);
|
|
||||||
bgfx::setImage(1, getTexture(m_hiZBuffer, 0), 0, bgfx::Access::Write);
|
// down scale mip 1 onwards
|
||||||
}
|
width /= 2;
|
||||||
|
height /= 2;
|
||||||
|
|
||||||
|
bgfx::setImage(0, getTexture(m_hiZBuffer, 0), lod - 1, bgfx::Access::Read);
|
||||||
|
bgfx::setImage(1, getTexture(m_hiZBuffer, 0), lod, bgfx::Access::Write);
|
||||||
|
|
||||||
bgfx::dispatch(RENDER_PASS_HIZ_DOWNSCALE_ID, m_programDownscaleHiZ, width/16, height/16);
|
bgfx::dispatch(RENDER_PASS_HIZ_DOWNSCALE_ID, m_programDownscaleHiZ, width/16, height/16);
|
||||||
}
|
}
|
||||||
@ -1086,6 +1088,7 @@ public:
|
|||||||
|
|
||||||
bgfx::ProgramHandle m_programMainPass;
|
bgfx::ProgramHandle m_programMainPass;
|
||||||
bgfx::ProgramHandle m_programOcclusionPass;
|
bgfx::ProgramHandle m_programOcclusionPass;
|
||||||
|
bgfx::ProgramHandle m_programCopyZ;
|
||||||
bgfx::ProgramHandle m_programDownscaleHiZ;
|
bgfx::ProgramHandle m_programDownscaleHiZ;
|
||||||
bgfx::ProgramHandle m_programOccludeProps;
|
bgfx::ProgramHandle m_programOccludeProps;
|
||||||
bgfx::ProgramHandle m_programStreamCompaction;
|
bgfx::ProgramHandle m_programStreamCompaction;
|
||||||
|
Loading…
Reference in New Issue
Block a user