rt: cosolidate pass args in a central structure
This commit is contained in:
parent
e295f39c2b
commit
202eccb3d1
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
|
136
ref_vk/vk_rtx.c
136
ref_vk/vk_rtx.c
|
@ -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[] = {
|
||||
|
|
Loading…
Reference in New Issue