rt: cosolidate pass args in a central structure

This commit is contained in:
Ivan Avdeev 2022-01-21 20:55:43 -08:00
parent e295f39c2b
commit 202eccb3d1
7 changed files with 109 additions and 159 deletions

View File

@ -120,7 +120,7 @@ void computeLighting(vec3 P, vec3 N, vec3 throughput, vec3 view_dir, MaterialPro
sampleEmissiveSurfaces(P, N, throughput, view_dir, material, cluster_index, diffuse, specular);
#endif
#if 1
#if 0
vec3 ldiffuse = vec3(0.), lspecular = vec3(0.);
computePointLights(P, N, cluster_index, throughput, view_dir, material, ldiffuse, lspecular);
diffuse += ldiffuse;

View File

@ -93,11 +93,11 @@ static void initDescriptors( void ) {
VK_DescriptorsCreate(&g_ray_light_direct.desc.riptors);
}
static void updateDescriptors( const xvk_ray_trace_light_direct_t* args ) {
static void updateDescriptors( const vk_ray_resources_t *res ) {
#define X(index, name, ...) \
g_ray_light_direct.desc.values[RtLDir_Desc_##name].image = (VkDescriptorImageInfo){ \
.sampler = VK_NULL_HANDLE, \
.imageView = args->in.name, \
.imageView = res->primary.name, \
.imageLayout = VK_IMAGE_LAYOUT_GENERAL, \
};
RAY_LIGHT_DIRECT_INPUTS(X)
@ -106,7 +106,7 @@ static void updateDescriptors( const xvk_ray_trace_light_direct_t* args ) {
#define X(index, name, ...) \
g_ray_light_direct.desc.values[RtLDir_Desc_##name].image = (VkDescriptorImageInfo){ \
.sampler = VK_NULL_HANDLE, \
.imageView = args->out.name, \
.imageView = res->light_direct_polygon.name, \
.imageLayout = VK_IMAGE_LAYOUT_GENERAL, \
};
RAY_LIGHT_DIRECT_OUTPUTS(X)
@ -115,14 +115,14 @@ static void updateDescriptors( const xvk_ray_trace_light_direct_t* args ) {
g_ray_light_direct.desc.values[RtLDir_Desc_TLAS].accel = (VkWriteDescriptorSetAccelerationStructureKHR){
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,
.accelerationStructureCount = 1,
.pAccelerationStructures = &args->in.tlas,
.pAccelerationStructures = &res->scene.tlas,
};
#define DESC_SET_BUFFER(index, buffer_) \
g_ray_light_direct.desc.values[index].buffer = (VkDescriptorBufferInfo){ \
.buffer = args->in.buffer_.buffer, \
.offset = args->in.buffer_.offset, \
.range = args->in.buffer_.size, \
.buffer = res->scene.buffer_.buffer, \
.offset = res->scene.buffer_.offset, \
.range = res->scene.buffer_.size, \
}
DESC_SET_BUFFER(RtLDir_Desc_UBO, ubo);
@ -134,7 +134,7 @@ static void updateDescriptors( const xvk_ray_trace_light_direct_t* args ) {
#undef DESC_SET_BUFFER
g_ray_light_direct.desc.values[RtLDir_Desc_Textures].image_array = args->in.all_textures;
g_ray_light_direct.desc.values[RtLDir_Desc_Textures].image_array = res->scene.all_textures;
VK_DescriptorsWrite(&g_ray_light_direct.desc.riptors);
}
@ -225,11 +225,11 @@ void XVK_RayTraceLightDirectReloadPipeline( void ) {
g_ray_light_direct.pipeline = new_pipeline;
}
void XVK_RayTraceLightDirect( VkCommandBuffer cmdbuf, const xvk_ray_trace_light_direct_t *args ) {
updateDescriptors( args );
void XVK_RayTraceLightDirect( VkCommandBuffer cmdbuf, const vk_ray_resources_t *res ) {
updateDescriptors( res );
vkCmdBindPipeline(cmdbuf, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, g_ray_light_direct.pipeline.pipeline);
vkCmdBindDescriptorSets(cmdbuf, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, g_ray_light_direct.desc.riptors.pipeline_layout, 0, 1, g_ray_light_direct.desc.riptors.desc_sets + 0, 0, NULL);
VK_PipelineRayTracingTrace(cmdbuf, &g_ray_light_direct.pipeline, args->width, args->height);
VK_PipelineRayTracingTrace(cmdbuf, &g_ray_light_direct.pipeline, res->width, res->height);
}

View File

@ -1,35 +1,8 @@
#pragma once
#include "vk_core.h"
#include "vk_rtx.h"
#include "shaders/ray_light_direct_iface.h"
#include "vk_ray_resources.h"
qboolean XVK_RayTraceLightDirectInit( void );
void XVK_RayTraceLightDirectDestroy( void );
void XVK_RayTraceLightDirectReloadPipeline( void );
typedef struct {
uint32_t width, height;
struct {
// TODO separate desc set
VkAccelerationStructureKHR tlas;
// needed for alpha testing :(
vk_buffer_region_t ubo;
vk_buffer_region_t kusochki, indices, vertices;
VkDescriptorImageInfo *all_textures; // [MAX_TEXTURES]
vk_buffer_region_t lights;
vk_buffer_region_t light_clusters;
#define X(index, name, ...) VkImageView name;
RAY_LIGHT_DIRECT_INPUTS(X)
} in;
struct {
RAY_LIGHT_DIRECT_OUTPUTS(X)
#undef X
} out;
} xvk_ray_trace_light_direct_t;
void XVK_RayTraceLightDirect( VkCommandBuffer cmdbuf, const xvk_ray_trace_light_direct_t *args );
void XVK_RayTraceLightDirect( VkCommandBuffer cmdbuf, const vk_ray_resources_t *res );

View File

@ -75,11 +75,11 @@ RAY_PRIMARY_OUTPUTS(X)
VK_DescriptorsCreate(&g_ray_primary.desc.riptors);
}
static void updateDescriptors( const xvk_ray_trace_primary_t* args ) {
static void updateDescriptors( const vk_ray_resources_t* res ) {
#define X(index, name, ...) \
g_ray_primary.desc.values[RtPrim_Desc_Out_##name].image = (VkDescriptorImageInfo){ \
.sampler = VK_NULL_HANDLE, \
.imageView = args->out.name, \
.imageView = res->primary.name, \
.imageLayout = VK_IMAGE_LAYOUT_GENERAL, \
};
RAY_PRIMARY_OUTPUTS(X)
@ -88,14 +88,14 @@ RAY_PRIMARY_OUTPUTS(X)
g_ray_primary.desc.values[RtPrim_Desc_TLAS].accel = (VkWriteDescriptorSetAccelerationStructureKHR){
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,
.accelerationStructureCount = 1,
.pAccelerationStructures = &args->in.tlas,
.pAccelerationStructures = &res->scene.tlas,
};
#define DESC_SET_BUFFER(index, buffer_) \
g_ray_primary.desc.values[index].buffer = (VkDescriptorBufferInfo){ \
.buffer = args->in.buffer_.buffer, \
.offset = args->in.buffer_.offset, \
.range = args->in.buffer_.size, \
.buffer = res->scene.buffer_.buffer, \
.offset = res->scene.buffer_.offset, \
.range = res->scene.buffer_.size, \
}
DESC_SET_BUFFER(RtPrim_Desc_UBO, ubo);
@ -105,7 +105,7 @@ RAY_PRIMARY_OUTPUTS(X)
#undef DESC_SET_BUFFER
g_ray_primary.desc.values[RtPrim_Desc_Textures].image_array = args->in.all_textures;
g_ray_primary.desc.values[RtPrim_Desc_Textures].image_array = res->scene.all_textures;
VK_DescriptorsWrite(&g_ray_primary.desc.riptors);
}
@ -203,11 +203,11 @@ void XVK_RayTracePrimaryReloadPipeline( void ) {
g_ray_primary.pipeline = new_pipeline;
}
void XVK_RayTracePrimary( VkCommandBuffer cmdbuf, const xvk_ray_trace_primary_t *args ) {
updateDescriptors( args );
void XVK_RayTracePrimary( VkCommandBuffer cmdbuf, const vk_ray_resources_t *res ) {
updateDescriptors( res );
vkCmdBindPipeline(cmdbuf, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, g_ray_primary.pipeline.pipeline);
vkCmdBindDescriptorSets(cmdbuf, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, g_ray_primary.desc.riptors.pipeline_layout, 0, 1, g_ray_primary.desc.riptors.desc_sets + 0, 0, NULL);
VK_PipelineRayTracingTrace(cmdbuf, &g_ray_primary.pipeline, args->width, args->height);
VK_PipelineRayTracingTrace(cmdbuf, &g_ray_primary.pipeline, res->width, res->height);
}

View File

@ -1,28 +1,9 @@
#pragma once
#include "vk_core.h"
#include "vk_rtx.h"
#include "shaders/ray_primary_iface.h"
#include "vk_ray_resources.h"
qboolean XVK_RayTracePrimaryInit( void );
void XVK_RayTracePrimaryDestroy( void );
void XVK_RayTracePrimaryReloadPipeline( void );
typedef struct {
uint32_t width, height;
struct {
// TODO separate desc set
VkAccelerationStructureKHR tlas;
vk_buffer_region_t ubo;
vk_buffer_region_t kusochki, indices, vertices;
VkDescriptorImageInfo *all_textures; // [MAX_TEXTURES]
} in;
struct {
#define X(index, name, ...) VkImageView name;
RAY_PRIMARY_OUTPUTS(X)
#undef X
} out;
} xvk_ray_trace_primary_t;
void XVK_RayTracePrimary( VkCommandBuffer cmdbuf, const xvk_ray_trace_primary_t *args );
void XVK_RayTracePrimary( VkCommandBuffer cmdbuf, const vk_ray_resources_t *res );

32
ref_vk/vk_ray_resources.h Normal file
View File

@ -0,0 +1,32 @@
#pragma once
#include "vk_rtx.h"
#include "shaders/ray_primary_iface.h"
#include "shaders/ray_light_direct_iface.h"
typedef struct {
uint32_t width, height;
struct {
VkAccelerationStructureKHR tlas;
vk_buffer_region_t ubo;
vk_buffer_region_t kusochki, indices, vertices;
VkDescriptorImageInfo *all_textures; // [MAX_TEXTURES]
vk_buffer_region_t lights;
vk_buffer_region_t light_clusters;
} scene;
#define X(index, name, ...) VkImageView name;
struct {
RAY_PRIMARY_OUTPUTS(X)
} primary;
struct {
RAY_LIGHT_DIRECT_OUTPUTS(X)
} light_direct_polygon;
#undef X
} vk_ray_resources_t;

View File

@ -968,6 +968,54 @@ static void prepareUniformBuffer( const vk_ray_frame_render_args_t *args, int fr
}
static void performTracing( VkCommandBuffer cmdbuf, const vk_ray_frame_render_args_t* args, int frame_index, const xvk_ray_frame_images_t *current_frame, float fov_angle_y) {
const vk_ray_resources_t res = {
.width = FRAME_WIDTH,
.height = FRAME_HEIGHT,
.scene = {
.tlas = g_rtx.tlas,
.ubo = {
.buffer = g_rtx.uniform_buffer.buffer,
.offset = frame_index * g_rtx.uniform_unit_size,
.size = sizeof(struct UniformBuffer),
},
.kusochki = {
.buffer = g_ray_model_state.kusochki_buffer.buffer,
.offset = 0,
.size = g_ray_model_state.kusochki_buffer.size,
},
.indices = {
.buffer = args->geometry_data.buffer,
.offset = 0,
.size = args->geometry_data.size,
},
.vertices = {
.buffer = args->geometry_data.buffer,
.offset = 0,
.size = args->geometry_data.size,
},
.all_textures = tglob.dii_all_textures,
.lights = {
.buffer = g_ray_model_state.lights_buffer.buffer,
.offset = 0,
.size = VK_WHOLE_SIZE, // TODO multiple frames
},
.light_clusters = {
.buffer = g_rtx.light_grid_buffer.buffer,
.offset = 0,
.size = VK_WHOLE_SIZE, // TODO multiple frames
},
},
#define X(index, name, ...) .name = current_frame->name.view,
.primary = {
RAY_PRIMARY_OUTPUTS(X)
},
.light_direct_polygon = {
RAY_LIGHT_DIRECT_OUTPUTS(X)
}
#undef X
};
DEBUG_BEGIN(cmdbuf, "yay tracing");
uploadLights();
prepareTlas(cmdbuf);
@ -1030,44 +1078,7 @@ static void performTracing( VkCommandBuffer cmdbuf, const vk_ray_frame_render_ar
0, 0, NULL, ARRAYSIZE(bmb), bmb, ARRAYSIZE(image_barrier), image_barrier);
}
{
const xvk_ray_trace_primary_t primary_args = {
.width = FRAME_WIDTH,
.height = FRAME_HEIGHT,
.in = {
.tlas = g_rtx.tlas,
.ubo = {
.buffer = g_rtx.uniform_buffer.buffer,
.offset = frame_index * g_rtx.uniform_unit_size,
.size = sizeof(struct UniformBuffer),
},
.kusochki = {
.buffer = g_ray_model_state.kusochki_buffer.buffer,
.offset = 0,
.size = g_ray_model_state.kusochki_buffer.size,
},
.indices = {
.buffer = args->geometry_data.buffer,
.offset = 0,
.size = args->geometry_data.size,
},
.vertices = {
.buffer = args->geometry_data.buffer,
.offset = 0,
.size = args->geometry_data.size,
},
.all_textures = tglob.dii_all_textures,
},
.out = {
#define X(index, name, ...) .name = current_frame->name.view,
RAY_PRIMARY_OUTPUTS(X)
#undef X
},
};
XVK_RayTracePrimary( cmdbuf, &primary_args );
}
//rayTrace(cmdbuf, current_frame, fov_angle_y);
XVK_RayTracePrimary( cmdbuf, &res );
{
const VkImageMemoryBarrier image_barriers[] = {
@ -1082,54 +1093,7 @@ RAY_PRIMARY_OUTPUTS(X)
0, 0, NULL, 0, NULL, ARRAYSIZE(image_barriers), image_barriers);
}
{
const xvk_ray_trace_light_direct_t light_direct_args = {
.width = FRAME_WIDTH,
.height = FRAME_HEIGHT,
.in = {
.tlas = g_rtx.tlas,
.ubo = {
.buffer = g_rtx.uniform_buffer.buffer,
.offset = frame_index * g_rtx.uniform_unit_size,
.size = sizeof(struct UniformBuffer),
},
.kusochki = {
.buffer = g_ray_model_state.kusochki_buffer.buffer,
.offset = 0,
.size = g_ray_model_state.kusochki_buffer.size,
},
.indices = {
.buffer = args->geometry_data.buffer,
.offset = 0,
.size = args->geometry_data.size,
},
.vertices = {
.buffer = args->geometry_data.buffer,
.offset = 0,
.size = args->geometry_data.size,
},
.lights = {
.buffer = g_ray_model_state.lights_buffer.buffer,
.offset = 0,
.size = VK_WHOLE_SIZE, // TODO multiple frames
},
.light_clusters = {
.buffer = g_rtx.light_grid_buffer.buffer,
.offset = 0,
.size = VK_WHOLE_SIZE, // TODO multiple frames
},
.all_textures = tglob.dii_all_textures,
#define X(index, name, ...) .name = current_frame->name.view,
RAY_LIGHT_DIRECT_INPUTS(X)
},
.out = {
RAY_LIGHT_DIRECT_OUTPUTS(X)
#undef X
},
};
XVK_RayTraceLightDirect( cmdbuf, &light_direct_args );
}
XVK_RayTraceLightDirect( cmdbuf, &res );
{
const VkImageMemoryBarrier image_barriers[] = {