(wip) rt: add uploading kusochki on every frame
disabled due to severe glitches
This commit is contained in:
parent
501c3d15ad
commit
9a335a1e56
|
@ -153,7 +153,7 @@ void XVK_RayModel_Validate( void ) {
|
|||
}
|
||||
}
|
||||
|
||||
static void applyMaterialToKusok( vk_kusok_data_t* kusok, const vk_render_geometry_t *geom, const vec3_t color) {
|
||||
static void applyMaterialToKusok( vk_kusok_data_t* kusok, const vk_render_geometry_t *geom, const vec3_t color, qboolean HACK_reflective) {
|
||||
const xvk_material_t *const mat = XVK_GetMaterialForTextureIndex( geom->texture );
|
||||
ASSERT(mat);
|
||||
|
||||
|
@ -168,7 +168,6 @@ static void applyMaterialToKusok( vk_kusok_data_t* kusok, const vk_render_geomet
|
|||
kusok->roughness = mat->roughness;
|
||||
kusok->metalness = mat->metalness;
|
||||
|
||||
/* FIXME
|
||||
// HACK until there is a proper mechanism for patching materials, see https://github.com/w23/xash3d-fwgs/issues/213
|
||||
// FIXME also this erases previous roughness unconditionally
|
||||
if (HACK_reflective) {
|
||||
|
@ -176,7 +175,6 @@ static void applyMaterialToKusok( vk_kusok_data_t* kusok, const vk_render_geomet
|
|||
} else if (!mat->set && geom->material == kXVkMaterialChrome) {
|
||||
kusok->tex_roughness = tglob.grayTexture;
|
||||
}
|
||||
*/
|
||||
|
||||
if (geom->material == kXVkMaterialSky)
|
||||
kusok->tex_base_color |= KUSOK_MATERIAL_FLAG_SKYBOX;
|
||||
|
@ -196,7 +194,7 @@ static void applyMaterialToKusok( vk_kusok_data_t* kusok, const vk_render_geomet
|
|||
RT_GetEmissiveForTexture( kusok->emissive, geom->texture );
|
||||
}
|
||||
|
||||
/* FIXME
|
||||
/* FIXME these should be done in a different way
|
||||
if (geom->material == kXVkMaterialConveyor) {
|
||||
computeConveyorSpeed( entcolor, geom->texture, kusok->uv_speed );
|
||||
} else */ {
|
||||
|
@ -294,9 +292,7 @@ vk_ray_model_t* VK_RayModelCreate( VkCommandBuffer cmdbuf, vk_ray_model_init_t a
|
|||
VectorSet(kusochki[i].emissive, 0, 0, 0 );
|
||||
|
||||
vec3_t color = {1, 1, 1};
|
||||
applyMaterialToKusok(kusochki + i, mg, color);
|
||||
|
||||
mg->kusok_index = i + kusochki_count_offset;
|
||||
applyMaterialToKusok(kusochki + i, mg, color, false);
|
||||
}
|
||||
|
||||
R_VkStagingUnlock(kusok_staging.handle);
|
||||
|
@ -421,6 +417,7 @@ void VK_RayFrameAddModel( vk_ray_model_t *model, const vk_render_model_t *render
|
|||
|
||||
ASSERT(vk_core.rtx);
|
||||
ASSERT(g_ray_model_state.frame.num_models <= ARRAYSIZE(g_ray_model_state.frame.models));
|
||||
ASSERT(model->num_geoms == render_model->num_geometries);
|
||||
|
||||
if (g_ray_model_state.freeze_models)
|
||||
return;
|
||||
|
@ -434,7 +431,6 @@ void VK_RayFrameAddModel( vk_ray_model_t *model, const vk_render_model_t *render
|
|||
ASSERT(model->as != VK_NULL_HANDLE);
|
||||
draw_model->model = model;
|
||||
memcpy(draw_model->transform_row, *transform_row, sizeof(draw_model->transform_row));
|
||||
g_ray_model_state.frame.num_models++;
|
||||
}
|
||||
|
||||
switch (render_model->render_mode) {
|
||||
|
@ -464,61 +460,42 @@ void VK_RayFrameAddModel( vk_ray_model_t *model, const vk_render_model_t *render
|
|||
gEngine.Host_Error("Unexpected render mode %d\n", render_model->render_mode);
|
||||
}
|
||||
|
||||
#if 0 // FIXME implement staging:
|
||||
// TODO optimize:
|
||||
// - collect list of geoms for which we could update anything (animated textues, uvs, etc)
|
||||
// - update only those through staging
|
||||
// - also consider tracking whether the main model color has changed (that'd need to update everything yay)
|
||||
for (int i = 0; i < render_model->num_geometries; ++i) {
|
||||
const vk_render_geometry_t *geom = render_model->geometries + i;
|
||||
vk_kusok_data_t *kusok = (vk_kusok_data_t*)(g_ray_model_state.kusochki_buffer.mapped) + geom->kusok_index;
|
||||
const xvk_material_t *const mat = XVK_GetMaterialForTextureIndex( geom->texture );
|
||||
ASSERT(mat);
|
||||
if (0)
|
||||
{
|
||||
const vk_staging_buffer_args_t staging_args = {
|
||||
.buffer = g_ray_model_state.kusochki_buffer.buffer,
|
||||
.offset = model->kusochki_offset * sizeof(vk_kusok_data_t),
|
||||
.size = render_model->num_geometries * sizeof(vk_kusok_data_t),
|
||||
.alignment = 16,
|
||||
};
|
||||
const vk_staging_region_t kusok_staging = R_VkStagingLockForBuffer(staging_args);
|
||||
|
||||
/* if (!render_model->static_map) */
|
||||
/* VK_LightsAddEmissiveSurface( geom, transform_row, false ); */
|
||||
|
||||
kusok->tex_base_color = mat->tex_base_color;
|
||||
kusok->tex_roughness = mat->tex_roughness;
|
||||
kusok->tex_metalness = mat->tex_metalness;
|
||||
kusok->tex_normalmap = mat->tex_normalmap;
|
||||
|
||||
kusok->roughness = mat->roughness;
|
||||
kusok->metalness = mat->metalness;
|
||||
|
||||
// HACK until there is a proper mechanism for patching materials, see https://github.com/w23/xash3d-fwgs/issues/213
|
||||
// FIXME also this erases previous roughness unconditionally
|
||||
if (HACK_reflective) {
|
||||
kusok->tex_roughness = tglob.blackTexture;
|
||||
} else if (!mat->set && geom->material == kXVkMaterialChrome) {
|
||||
kusok->tex_roughness = tglob.grayTexture;
|
||||
if (!kusok_staging.ptr) {
|
||||
gEngine.Con_Printf(S_ERROR "Couldn't allocate staging for %d kusochkov for model %s\n", model->num_geoms, render_model->debug_name);
|
||||
return;
|
||||
}
|
||||
|
||||
if (geom->material == kXVkMaterialSky) {
|
||||
kusok->tex_base_color |= KUSOK_MATERIAL_FLAG_SKYBOX;
|
||||
vk_kusok_data_t *const kusochki = kusok_staging.ptr;
|
||||
|
||||
for (int i = 0; i < render_model->num_geometries; ++i) {
|
||||
const vk_render_geometry_t *geom = render_model->geometries + i;
|
||||
applyMaterialToKusok( kusochki + i, geom, color, HACK_reflective );
|
||||
}
|
||||
|
||||
{
|
||||
vec4_t gcolor;
|
||||
gcolor[0] = color[0] * mat->base_color[0];
|
||||
gcolor[1] = color[1] * mat->base_color[1];
|
||||
gcolor[2] = color[2] * mat->base_color[2];
|
||||
gcolor[3] = color[3];
|
||||
Vector4Copy(gcolor, kusok->color);
|
||||
}
|
||||
gEngine.Con_Reportf("model %s: geom=%d kind=%d ko=%d ks=%d handle=%d\n",
|
||||
render_model->debug_name,
|
||||
render_model->num_geometries,
|
||||
model->kusochki_offset,
|
||||
staging_args.offset, staging_args.size,
|
||||
kusok_staging.handle
|
||||
);
|
||||
|
||||
if (geom->material == kXVkMaterialEmissive) {
|
||||
VectorCopy( geom->emissive, kusok->emissive );
|
||||
} else {
|
||||
RT_GetEmissiveForTexture( kusok->emissive, geom->texture );
|
||||
}
|
||||
|
||||
if (geom->material == kXVkMaterialConveyor) {
|
||||
computeConveyorSpeed( entcolor, geom->texture, kusok->uv_speed );
|
||||
} else {
|
||||
kusok->uv_speed[0] = kusok->uv_speed[1] = 0.f;
|
||||
}
|
||||
R_VkStagingUnlock(kusok_staging.handle);
|
||||
}
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < render_model->polylights_count; ++i) {
|
||||
rt_light_add_polygon_t *const polylight = render_model->polylights + i;
|
||||
|
@ -526,6 +503,8 @@ void VK_RayFrameAddModel( vk_ray_model_t *model, const vk_render_model_t *render
|
|||
polylight->dynamic = true;
|
||||
RT_LightAddPolygon(polylight);
|
||||
}
|
||||
|
||||
g_ray_model_state.frame.num_models++;
|
||||
}
|
||||
|
||||
void RT_RayModel_Clear(void) {
|
||||
|
|
|
@ -57,9 +57,6 @@ typedef struct vk_render_geometry_s {
|
|||
// - updating dynamic lights (TODO: can decouple from surface/brush models by providing texture_id and aabb directly here)
|
||||
const struct msurface_s *surf;
|
||||
|
||||
// Index into kusochki buffer for current frame
|
||||
uint32_t kusok_index;
|
||||
|
||||
// for kXVkMaterialEmissive
|
||||
vec3_t emissive;
|
||||
} vk_render_geometry_t;
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include "vk_common.h"
|
||||
#include "vk_buffer.h"
|
||||
#include "vk_pipeline.h"
|
||||
#include "vk_staging.h"
|
||||
#include "vk_cvar.h"
|
||||
#include "vk_textures.h"
|
||||
#include "vk_light.h"
|
||||
|
@ -35,9 +36,12 @@
|
|||
#if 1
|
||||
#define FRAME_WIDTH 1280
|
||||
#define FRAME_HEIGHT 720
|
||||
#else
|
||||
#elif 0
|
||||
#define FRAME_WIDTH 2560
|
||||
#define FRAME_HEIGHT 1440
|
||||
#else
|
||||
#define FRAME_WIDTH 1920
|
||||
#define FRAME_HEIGHT 1080
|
||||
#endif
|
||||
|
||||
// TODO sync with shaders
|
||||
|
@ -590,14 +594,31 @@ static void performTracing(VkCommandBuffer cmdbuf, const perform_tracing_args_t*
|
|||
},
|
||||
};
|
||||
|
||||
// Upload kusochki updates
|
||||
{
|
||||
R_VkStagingCommit(cmdbuf);
|
||||
const VkBufferMemoryBarrier bmb[] = { {
|
||||
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
|
||||
.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR,
|
||||
.buffer = g_ray_model_state.kusochki_buffer.buffer,
|
||||
.offset = 0,
|
||||
.size = VK_WHOLE_SIZE,
|
||||
} };
|
||||
|
||||
vkCmdPipelineBarrier(cmdbuf,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR | VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR,
|
||||
0, 0, NULL, ARRAYSIZE(bmb), bmb, 0, NULL);
|
||||
}
|
||||
|
||||
DEBUG_BEGIN(cmdbuf, "yay tracing");
|
||||
prepareTlas(cmdbuf);
|
||||
prepareUniformBuffer(args->render_args, args->frame_index, args->fov_angle_y);
|
||||
|
||||
// 4. Barrier for TLAS build and dest image layout transfer
|
||||
// 4. Barrier for TLAS build
|
||||
{
|
||||
VkBufferMemoryBarrier bmb[] = { {
|
||||
const VkBufferMemoryBarrier bmb[] = { {
|
||||
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
|
||||
.srcAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,
|
||||
.dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
|
||||
|
|
Loading…
Reference in New Issue