Make scaled down view borders work with MSAA
The pipeline used to draw a texture quad was only created compatible with the RP_UI render pass, which has a single-sample color attachment. This made the pipeline work when MSAA was disabled, but it did not work properly with it enabled. To fix the issue, create a set of pipelines, instead of a single one, with compatibility with the different types of render passes, as the pipeline is used for both the scaled down view borders as well as UI elements in the third render pass.
This commit is contained in:
parent
9a17eb9ac3
commit
9661ce0ba0
|
@ -230,7 +230,7 @@ extern VkRect2D vk_scissor;
|
|||
extern VkDescriptorSetLayout vk_samplerDescSetLayout;
|
||||
|
||||
// *** pipelines ***
|
||||
extern qvkpipeline_t vk_drawTexQuadPipeline;
|
||||
extern qvkpipeline_t vk_drawTexQuadPipeline[RP_COUNT];
|
||||
extern qvkpipeline_t vk_drawColorQuadPipeline[RP_COUNT];
|
||||
extern qvkpipeline_t vk_drawModelPipelineStrip[RP_COUNT];
|
||||
extern qvkpipeline_t vk_drawModelPipelineFan[RP_COUNT];
|
||||
|
|
|
@ -123,7 +123,8 @@ static int vk_activeStagingBuffer = 0;
|
|||
qboolean vk_frameStarted = false;
|
||||
|
||||
// render pipelines
|
||||
qvkpipeline_t vk_drawTexQuadPipeline = QVKPIPELINE_INIT;
|
||||
qvkpipeline_t vk_drawTexQuadPipeline[RP_COUNT] = {
|
||||
QVKPIPELINE_INIT, QVKPIPELINE_INIT, QVKPIPELINE_INIT };
|
||||
qvkpipeline_t vk_drawColorQuadPipeline[RP_COUNT] = {
|
||||
QVKPIPELINE_INIT, QVKPIPELINE_INIT, QVKPIPELINE_INIT };
|
||||
qvkpipeline_t vk_drawModelPipelineStrip[RP_COUNT] = {
|
||||
|
@ -1268,10 +1269,15 @@ static void CreatePipelines()
|
|||
|
||||
// textured quad pipeline
|
||||
VK_LOAD_VERTFRAG_SHADERS(shaders, basic, basic);
|
||||
vk_drawTexQuadPipeline.depthTestEnable = VK_FALSE;
|
||||
QVk_CreatePipeline(samplerUboDsLayouts, 2, &vertInfoRG_RG, &vk_drawTexQuadPipeline, &vk_renderpasses[RP_UI], shaders, 2);
|
||||
QVk_DebugSetObjectName((uint64_t)vk_drawTexQuadPipeline.layout, VK_OBJECT_TYPE_PIPELINE_LAYOUT, "Pipeline Layout: textured quad");
|
||||
QVk_DebugSetObjectName((uint64_t)vk_drawTexQuadPipeline.pl, VK_OBJECT_TYPE_PIPELINE, "Pipeline: textured quad");
|
||||
for (int i = 0; i < RP_COUNT; ++i)
|
||||
{
|
||||
vk_drawTexQuadPipeline[i].depthTestEnable = VK_FALSE;
|
||||
QVk_CreatePipeline(samplerUboDsLayouts, 2, &vertInfoRG_RG, &vk_drawTexQuadPipeline[i], &vk_renderpasses[i], shaders, 2);
|
||||
QVk_DebugSetObjectName((uint64_t)vk_drawTexQuadPipeline[i].layout, VK_OBJECT_TYPE_PIPELINE_LAYOUT,
|
||||
va("Pipeline Layout: textured quad (%s)", renderpassObjectNames[i]));
|
||||
QVk_DebugSetObjectName((uint64_t)vk_drawTexQuadPipeline[i].pl, VK_OBJECT_TYPE_PIPELINE,
|
||||
va("Pipeline: textured quad (%s)", renderpassObjectNames[i]));
|
||||
}
|
||||
|
||||
// draw particles pipeline (using a texture)
|
||||
VK_LOAD_VERTFRAG_SHADERS(shaders, particle, basic);
|
||||
|
@ -1499,8 +1505,8 @@ void QVk_Shutdown( void )
|
|||
QVk_DestroyPipeline(&vk_drawColorQuadPipeline[i]);
|
||||
QVk_DestroyPipeline(&vk_drawModelPipelineStrip[i]);
|
||||
QVk_DestroyPipeline(&vk_drawModelPipelineFan[i]);
|
||||
QVk_DestroyPipeline(&vk_drawTexQuadPipeline[i]);
|
||||
}
|
||||
QVk_DestroyPipeline(&vk_drawTexQuadPipeline);
|
||||
QVk_DestroyPipeline(&vk_drawNullModelPipeline);
|
||||
QVk_DestroyPipeline(&vk_drawNoDepthModelPipelineStrip);
|
||||
QVk_DestroyPipeline(&vk_drawNoDepthModelPipelineFan);
|
||||
|
@ -2469,16 +2475,16 @@ void QVk_DrawTexRect(const float *ubo, VkDeviceSize uboSize, qvktexture_t *textu
|
|||
uint8_t *uboData = QVk_GetUniformBuffer(uboSize, &uboOffset, &uboDescriptorSet);
|
||||
memcpy(uboData, ubo, uboSize);
|
||||
|
||||
QVk_BindPipeline(&vk_drawTexQuadPipeline);
|
||||
QVk_BindPipeline(&vk_drawTexQuadPipeline[vk_state.current_renderpass]);
|
||||
VkDeviceSize offsets = 0;
|
||||
VkDescriptorSet descriptorSets[] = { texture->descriptorSet, uboDescriptorSet };
|
||||
|
||||
float gamma = 2.1F - vid_gamma->value;
|
||||
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline.layout,
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout,
|
||||
VK_SHADER_STAGE_FRAGMENT_BIT, 17 * sizeof(float), sizeof(gamma), &gamma);
|
||||
|
||||
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vk_drawTexQuadPipeline.layout, 0, 2, descriptorSets, 1, &uboOffset);
|
||||
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout, 0, 2, descriptorSets, 1, &uboOffset);
|
||||
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1,
|
||||
&vk_texRectVbo.resource.buffer, &offsets);
|
||||
vkCmdBindIndexBuffer(vk_activeCmdbuffer,
|
||||
|
|
|
@ -704,13 +704,13 @@ void R_DrawAliasModel (entity_t *currententity, model_t *currentmodel)
|
|||
Mat_Perspective(r_projection_matrix, r_vulkan_correction_dh, r_gunfov->value, r_proj_aspect, 4, dist);
|
||||
}
|
||||
Mat_Mul(r_view_matrix, r_projection_matrix, r_viewproj_matrix);
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline.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);
|
||||
}
|
||||
|
||||
if ( ( currententity->flags & RF_WEAPONMODEL ) && ( r_lefthand->value == 1.0F ) )
|
||||
{
|
||||
Mat_Scale(r_viewproj_matrix, -1.f, 1.f, 1.f);
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline.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);
|
||||
leftHandOffset = 2;
|
||||
}
|
||||
|
||||
|
@ -767,13 +767,13 @@ void R_DrawAliasModel (entity_t *currententity, model_t *currentmodel)
|
|||
if ( ( currententity->flags & RF_WEAPONMODEL ) && ( r_lefthand->value == 1.0F ) )
|
||||
{
|
||||
Mat_Scale(r_viewproj_matrix, -1.f, 1.f, 1.f);
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline.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);
|
||||
}
|
||||
|
||||
if (currententity->flags & RF_DEPTHHACK || r_newrefdef.rdflags & RDF_NOWORLDMODEL)
|
||||
{
|
||||
memcpy(r_viewproj_matrix, prev_viewproj, sizeof(prev_viewproj));
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline.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);
|
||||
}
|
||||
|
||||
if (vk_shadows->value && !(currententity->flags & (RF_TRANSLUCENT | RF_WEAPONMODEL)))
|
||||
|
|
|
@ -232,7 +232,7 @@ void R_DrawSpriteModel (entity_t *currententity, model_t *currentmodel)
|
|||
|
||||
float gamma = 2.1F - vid_gamma->value;
|
||||
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline.layout,
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout,
|
||||
VK_SHADER_STAGE_FRAGMENT_BIT, 17 * sizeof(float), sizeof(gamma), &gamma);
|
||||
|
||||
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vk_drawSpritePipeline.layout, 0, 1, ¤tmodel->skins[currententity->frame]->vk_texture.descriptorSet, 0, NULL);
|
||||
|
@ -494,7 +494,7 @@ void Vk_DrawParticles(int num_particles, const particle_t particles[], const uns
|
|||
|
||||
float gamma = 2.1F - vid_gamma->value;
|
||||
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline.layout,
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout,
|
||||
VK_SHADER_STAGE_FRAGMENT_BIT, 17 * sizeof(float), sizeof(gamma), &gamma);
|
||||
|
||||
if (vk_custom_particles->value == 2)
|
||||
|
@ -910,7 +910,7 @@ R_SetupVulkan (void)
|
|||
// precalculate view-projection 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
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline.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 )
|
||||
|
|
|
@ -135,7 +135,7 @@ static void DrawVkPoly (vkpoly_t *p, image_t *texture, float *color)
|
|||
|
||||
float gamma = 2.1F - vid_gamma->value;
|
||||
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline.layout,
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout,
|
||||
VK_SHADER_STAGE_FRAGMENT_BIT, 17 * sizeof(float), sizeof(gamma), &gamma);
|
||||
|
||||
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vk_drawPolyPipeline.layout, 0, 2, descriptorSets, 1, &uboOffset);
|
||||
|
@ -196,7 +196,7 @@ static void DrawVkFlowingPoly (msurface_t *fa, image_t *texture, float *color)
|
|||
|
||||
float gamma = 2.1F - vid_gamma->value;
|
||||
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline.layout,
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout,
|
||||
VK_SHADER_STAGE_FRAGMENT_BIT, 17 * sizeof(float), sizeof(gamma), &gamma);
|
||||
|
||||
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vk_drawPolyPipeline.layout, 0, 2, descriptorSets, 1, &uboOffset);
|
||||
|
|
|
@ -252,7 +252,7 @@ void EmitWaterPolys (msurface_t *fa, image_t *texture, float *modelMatrix, float
|
|||
|
||||
float gamma = 2.1F - vid_gamma->value;
|
||||
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline.layout,
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout,
|
||||
VK_SHADER_STAGE_FRAGMENT_BIT, 17 * sizeof(float), sizeof(gamma), &gamma);
|
||||
|
||||
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vk_drawPolyWarpPipeline.layout, 0, 2, descriptorSets, 1, &uboOffset);
|
||||
|
@ -649,7 +649,7 @@ void R_DrawSkyBox (void)
|
|||
|
||||
float gamma = 2.1F - vid_gamma->value;
|
||||
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline.layout,
|
||||
vkCmdPushConstants(vk_activeCmdbuffer, vk_drawTexQuadPipeline[vk_state.current_renderpass].layout,
|
||||
VK_SHADER_STAGE_FRAGMENT_BIT, 17 * sizeof(float), sizeof(gamma), &gamma);
|
||||
|
||||
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
|
||||
|
|
Loading…
Reference in New Issue