rtx: improve shader binding indexing

This commit is contained in:
Ivan 'provod' Avdeev 2021-10-29 11:21:47 -07:00 committed by Ivan Avdeev
parent 24f11bccc7
commit b7e6581e29
3 changed files with 30 additions and 15 deletions

View File

@ -55,9 +55,7 @@ bool shadowed(vec3 pos, vec3 dir, float dist) {
traceRayEXT(tlas,
flags,
GEOMETRY_BIT_OPAQUE,
0, 0, 1 /* miss index */,
pos, 0., dir, dist - shadow_offset_fudge, 1 /* payload location */);
return shadow;
0, 0, SHADER_OFFSET_MISS_SHADOW,
}
const float color_factor = 1000.;

View File

@ -23,7 +23,12 @@ layout (constant_id = 3) const uint MAX_VISIBLE_SURFACE_LIGHTS = 255;
#define GEOMETRY_BIT_OPAQUE 0x01
#define GEOMETRY_BIT_ADDITIVE 0x02
#define GEOMETRY_BIT_ANY 0xff
#define SHADER_OFFSET_MISS_REGULAR 0
#define SHADER_OFFSET_MISS_SHADOW 1
#define SHADER_OFFSET_HIT_REGULAR 0
#define SHADER_OFFSET_HIT_ALPHA_TEST 1
struct Kusok {
uint index_offset;

View File

@ -22,10 +22,13 @@
enum {
ShaderBindingTable_RayGen,
ShaderBindingTable_Miss,
ShaderBindingTable_Miss_Shadow,
ShaderBindingTable_Hit,
ShaderBindingTable_HitWithAlphaMask,
ShaderBindingTable_Hit_WithAlphaTest,
ShaderBindingTable_COUNT
};
@ -362,12 +365,12 @@ static void createPipeline( void )
ShaderStageIndex_Miss,
ShaderStageIndex_Miss_Shadow,
ShaderStageIndex_ClosestHit,
ShaderStageIndex_AnyHit_AlphaMask,
ShaderStageIndex_AnyHit_AlphaTest,
ShaderStageIndex_COUNT,
};
#define DEFINE_SHADER(filename, bit, index) \
shaders[ShaderStageIndex_##index] = (VkPipelineShaderStageCreateInfo){ \
#define DEFINE_SHADER(filename, bit, sbt_index) \
shaders[sbt_index] = (VkPipelineShaderStageCreateInfo){ \
.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, \
.stage = VK_SHADER_STAGE_##bit##_BIT_KHR, \
.module = loadShader(filename), \
@ -389,11 +392,20 @@ static void createPipeline( void )
.layout = g_rtx.descriptors.pipeline_layout,
};
DEFINE_SHADER("ray.rgen.spv", RAYGEN, RayGen);
DEFINE_SHADER("ray.rmiss.spv", MISS, Miss);
DEFINE_SHADER("shadow.rmiss.spv", MISS, Miss_Shadow);
DEFINE_SHADER("ray.rchit.spv", CLOSEST_HIT, ClosestHit);
DEFINE_SHADER("alphamask.rahit.spv", ANY_HIT, AnyHit_AlphaMask);
DEFINE_SHADER("ray.rgen.spv", RAYGEN, ShaderStageIndex_RayGen);
DEFINE_SHADER("ray.rmiss.spv", MISS, ShaderStageIndex_Miss);
DEFINE_SHADER("shadow.rmiss.spv", MISS, ShaderStageIndex_Miss_Shadow);
DEFINE_SHADER("ray.rchit.spv", CLOSEST_HIT, ShaderStageIndex_ClosestHit);
DEFINE_SHADER("alphamask.rahit.spv", ANY_HIT, ShaderStageIndex_AnyHit_AlphaTest);
#define ASSERT_SHADER_OFFSET(sbt_kind, sbt_index, offset) \
ASSERT(offset == (sbt_index - sbt_kind))
ASSERT_SHADER_OFFSET(ShaderBindingTable_RayGen, ShaderBindingTable_RayGen, 0);
ASSERT_SHADER_OFFSET(ShaderBindingTable_Miss, ShaderBindingTable_Miss, SHADER_OFFSET_MISS_REGULAR);
ASSERT_SHADER_OFFSET(ShaderBindingTable_Miss, ShaderBindingTable_Miss_Shadow, SHADER_OFFSET_MISS_SHADOW);
ASSERT_SHADER_OFFSET(ShaderBindingTable_Hit, ShaderBindingTable_Hit, SHADER_OFFSET_HIT_REGULAR);
ASSERT_SHADER_OFFSET(ShaderBindingTable_Hit, ShaderBindingTable_Hit_WithAlphaTest, SHADER_OFFSET_HIT_ALPHA_TEST);
shader_groups[ShaderBindingTable_RayGen] = (VkRayTracingShaderGroupCreateInfoKHR) {
.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR,
@ -431,10 +443,10 @@ static void createPipeline( void )
.intersectionShader = VK_SHADER_UNUSED_KHR,
};
shader_groups[ShaderBindingTable_HitWithAlphaMask] = (VkRayTracingShaderGroupCreateInfoKHR) {
shader_groups[ShaderBindingTable_Hit_WithAlphaTest] = (VkRayTracingShaderGroupCreateInfoKHR) {
.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR,
.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR,
.anyHitShader = ShaderStageIndex_AnyHit_AlphaMask,
.anyHitShader = ShaderStageIndex_AnyHit_AlphaTest,
.closestHitShader = ShaderStageIndex_ClosestHit,
.generalShader = VK_SHADER_UNUSED_KHR,
.intersectionShader = VK_SHADER_UNUSED_KHR,