vk: force clean up vertex push constants

This commit is contained in:
Denis Pauk 2024-08-25 17:43:44 +03:00
parent 833932ce44
commit b685aa4683
6 changed files with 25 additions and 12 deletions

View file

@ -213,6 +213,8 @@ typedef enum
// Vulkan constants: command and dynamic buffer count // Vulkan constants: command and dynamic buffer count
#define NUM_CMDBUFFERS 32 #define NUM_CMDBUFFERS 32
#define NUM_DYNBUFFERS 2 #define NUM_DYNBUFFERS 2
#define PUSH_CONSTANT_VERTEX_SIZE 17
#define PUSH_CONSTANT_FRAGMENT_SIZE 11
// Vulkan instance // Vulkan instance
extern VkInstance vk_instance; extern VkInstance vk_instance;

View file

@ -2676,6 +2676,7 @@ QVk_Draw2DCallsRender(void)
uint8_t *vertData, *uboData; uint8_t *vertData, *uboData;
VkBuffer vbo; VkBuffer vbo;
uint32_t uboOffset; uint32_t uboOffset;
float dummy[PUSH_CONSTANT_VERTEX_SIZE] = {0};
float imgTransform[] = { float imgTransform[] = {
0, 0, 0, 0,
@ -2692,6 +2693,8 @@ QVk_Draw2DCallsRender(void)
memcpy(vertData, draw2dcolor_calls, vertSize); memcpy(vertData, draw2dcolor_calls, vertSize);
QVk_BindPipeline(&vk_drawColorQuadPipeline[draw2dcolor_rpType]); QVk_BindPipeline(&vk_drawColorQuadPipeline[draw2dcolor_rpType]);
vkCmdPushConstants(vk_activeCmdbuffer, vk_worldWarpPipeline.layout,
VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(dummy), dummy);
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
vk_drawColorQuadPipeline[draw2dcolor_rpType].layout, 0, 1, &uboDescriptorSet, 1, &uboOffset); vk_drawColorQuadPipeline[draw2dcolor_rpType].layout, 0, 1, &uboDescriptorSet, 1, &uboOffset);
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1, vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1,
@ -2708,6 +2711,7 @@ QVk_Draw2DCallsRender(void)
VkBuffer vbo; VkBuffer vbo;
uint32_t uboOffset; uint32_t uboOffset;
float gamma = 2.1F - vid_gamma->value; float gamma = 2.1F - vid_gamma->value;
float dummy[PUSH_CONSTANT_VERTEX_SIZE] = {0};
float imgTransform[] = { float imgTransform[] = {
0, 0, 1.0, 1.0, 0, 0, 1.0, 1.0,
@ -2723,8 +2727,10 @@ QVk_Draw2DCallsRender(void)
uboDescriptorSet uboDescriptorSet
}; };
vkCmdPushConstants(vk_activeCmdbuffer, vk_worldWarpPipeline.layout,
VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(dummy), dummy);
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout, vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout,
VK_SHADER_STAGE_FRAGMENT_BIT, 17 * sizeof(float), sizeof(gamma), &gamma); VK_SHADER_STAGE_FRAGMENT_BIT, PUSH_CONSTANT_VERTEX_SIZE * sizeof(float), sizeof(gamma), &gamma);
vertSize = draw2dcolor_num * 16 * sizeof(float); vertSize = draw2dcolor_num * 16 * sizeof(float);
vertData = QVk_GetVertexBuffer(vertSize, &vbo, &vboOffset); vertData = QVk_GetVertexBuffer(vertSize, &vbo, &vboOffset);

View file

@ -217,7 +217,7 @@ R_DrawSpriteModel(entity_t *currententity, const model_t *currentmodel)
float gamma = 2.1F - vid_gamma->value; float gamma = 2.1F - vid_gamma->value;
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout, vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout,
VK_SHADER_STAGE_FRAGMENT_BIT, 17 * sizeof(float), sizeof(gamma), &gamma); VK_SHADER_STAGE_FRAGMENT_BIT, PUSH_CONSTANT_VERTEX_SIZE * sizeof(float), sizeof(gamma), &gamma);
if (currententity->frame < currentmodel->numskins) if (currententity->frame < currentmodel->numskins)
{ {
@ -510,7 +510,7 @@ Vk_DrawParticles(int num_particles, const particle_t particles[])
float gamma = 2.1F - vid_gamma->value; float gamma = 2.1F - vid_gamma->value;
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout, vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout,
VK_SHADER_STAGE_FRAGMENT_BIT, 17 * sizeof(float), sizeof(gamma), &gamma); VK_SHADER_STAGE_FRAGMENT_BIT, PUSH_CONSTANT_VERTEX_SIZE * sizeof(float), sizeof(gamma), &gamma);
if (vk_custom_particles->value == 2) if (vk_custom_particles->value == 2)
{ {
@ -898,7 +898,8 @@ R_SetupVulkan (void)
// precalculate view-projection matrix // precalculate view-projection matrix
Mat_Mul(r_view_matrix, r_projection_matrix, r_viewproj_matrix); Mat_Mul(r_view_matrix, r_projection_matrix, r_viewproj_matrix);
// view-projection matrix will always be stored as the first push constant item, so set no offset // view-projection matrix will always be stored as the first push constant item, so set no offset
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(r_viewproj_matrix), r_viewproj_matrix); vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout,
VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(r_viewproj_matrix), r_viewproj_matrix);
} }
static void R_Flash( void ) static void R_Flash( void )
@ -989,6 +990,8 @@ RE_RenderView(refdef_t *fd)
qboolean RE_EndWorldRenderpass(void) qboolean RE_EndWorldRenderpass(void)
{ {
float dummy[PUSH_CONSTANT_VERTEX_SIZE] = {0};
// still some issues? // still some issues?
if (!vk_frameStarted) if (!vk_frameStarted)
{ {
@ -1035,7 +1038,9 @@ qboolean RE_EndWorldRenderpass(void)
r_newrefdef.height, r_newrefdef.height,
}; };
vkCmdPushConstants(vk_activeCmdbuffer, vk_worldWarpPipeline.layout, vkCmdPushConstants(vk_activeCmdbuffer, vk_worldWarpPipeline.layout,
VK_SHADER_STAGE_FRAGMENT_BIT, 17 * sizeof(float), sizeof(pushConsts), pushConsts); VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(dummy), dummy);
vkCmdPushConstants(vk_activeCmdbuffer, vk_worldWarpPipeline.layout,
VK_SHADER_STAGE_FRAGMENT_BIT, PUSH_CONSTANT_VERTEX_SIZE * sizeof(float), sizeof(pushConsts), pushConsts);
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vk_worldWarpPipeline.layout, 0, 1, &vk_colorbuffer.descriptorSet, 0, NULL); vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vk_worldWarpPipeline.layout, 0, 1, &vk_colorbuffer.descriptorSet, 0, NULL);
QVk_BindPipeline(&vk_worldWarpPipeline); QVk_BindPipeline(&vk_worldWarpPipeline);
// Restore full viewport for future steps. // Restore full viewport for future steps.
@ -1068,7 +1073,7 @@ R_SetVulkan2D(const VkViewport* viewport, const VkRect2D* scissor)
{ {
float pushConsts[] = { vk_postprocess->value, (2.1 - vid_gamma->value)}; float pushConsts[] = { vk_postprocess->value, (2.1 - vid_gamma->value)};
vkCmdPushConstants(vk_activeCmdbuffer, vk_postprocessPipeline.layout, vkCmdPushConstants(vk_activeCmdbuffer, vk_postprocessPipeline.layout,
VK_SHADER_STAGE_FRAGMENT_BIT, 17 * sizeof(float), sizeof(pushConsts), pushConsts); VK_SHADER_STAGE_FRAGMENT_BIT, PUSH_CONSTANT_VERTEX_SIZE * sizeof(float), sizeof(pushConsts), pushConsts);
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vk_postprocessPipeline.layout, 0, 1, &vk_colorbufferWarp.descriptorSet, 0, NULL); vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vk_postprocessPipeline.layout, 0, 1, &vk_colorbufferWarp.descriptorSet, 0, NULL);
QVk_BindPipeline(&vk_postprocessPipeline); QVk_BindPipeline(&vk_postprocessPipeline);
vkCmdDraw(vk_activeCmdbuffer, 3, 1, 0, 0); vkCmdDraw(vk_activeCmdbuffer, 3, 1, 0, 0);

View file

@ -164,12 +164,12 @@ void QVk_CreatePipeline(const VkDescriptorSetLayout *descriptorLayout,
{ {
.stageFlags = VK_SHADER_STAGE_VERTEX_BIT, .stageFlags = VK_SHADER_STAGE_VERTEX_BIT,
.offset = 0, .offset = 0,
.size = 17 * sizeof(float) .size = PUSH_CONSTANT_VERTEX_SIZE * sizeof(float)
}, },
{ {
.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT, .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT,
.offset = 17 * sizeof(float), .offset = PUSH_CONSTANT_VERTEX_SIZE * sizeof(float),
.size = 11 * sizeof(float) .size = PUSH_CONSTANT_FRAGMENT_SIZE * sizeof(float)
}}; }};
VkPipelineLayoutCreateInfo plCreateInfo = { VkPipelineLayoutCreateInfo plCreateInfo = {

View file

@ -78,7 +78,7 @@ DrawVkPoly(msurface_t *fa, image_t *texture, const float *color)
float gamma = 2.1F - vid_gamma->value; float gamma = 2.1F - vid_gamma->value;
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout, vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout,
VK_SHADER_STAGE_FRAGMENT_BIT, 17 * sizeof(float), sizeof(gamma), &gamma); VK_SHADER_STAGE_FRAGMENT_BIT, PUSH_CONSTANT_VERTEX_SIZE * sizeof(float), sizeof(gamma), &gamma);
Mesh_VertsRealloc((p->numverts - 2) * 3); Mesh_VertsRealloc((p->numverts - 2) * 3);
GenFanIndexes(vertIdxData, 0, p->numverts - 2); GenFanIndexes(vertIdxData, 0, p->numverts - 2);

View file

@ -109,7 +109,7 @@ EmitWaterPolys(msurface_t *fa, image_t *texture, const float *modelMatrix,
float gamma = 2.1F - vid_gamma->value; float gamma = 2.1F - vid_gamma->value;
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout, vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout,
VK_SHADER_STAGE_FRAGMENT_BIT, 17 * sizeof(float), sizeof(gamma), &gamma); VK_SHADER_STAGE_FRAGMENT_BIT, PUSH_CONSTANT_VERTEX_SIZE * sizeof(float), sizeof(gamma), &gamma);
if (solid_surface) if (solid_surface)
{ {
@ -253,7 +253,7 @@ R_DrawSkyBox(void)
float gamma = 2.1F - vid_gamma->value; float gamma = 2.1F - vid_gamma->value;
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout, vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout,
VK_SHADER_STAGE_FRAGMENT_BIT, 17 * sizeof(float), sizeof(gamma), &gamma); VK_SHADER_STAGE_FRAGMENT_BIT, PUSH_CONSTANT_VERTEX_SIZE * sizeof(float), sizeof(gamma), &gamma);
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
vk_drawSkyboxPipeline.layout, 0, 2, descriptorSets, 1, &uboOffset); vk_drawSkyboxPipeline.layout, 0, 2, descriptorSets, 1, &uboOffset);