From 44a5f950adcb3aae09ee3c59d87ef3f1505cd4ef Mon Sep 17 00:00:00 2001 From: Artem Kharytoniuk Date: Mon, 10 Apr 2017 14:42:52 +0300 Subject: [PATCH] Logic to specify face culling during pipeline creation. --- src/engine/renderer/tr_shader.c | 1 + src/engine/renderer/vk.cpp | 14 ++++++++++++-- src/engine/renderer/vk.h | 8 +++++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/engine/renderer/tr_shader.c b/src/engine/renderer/tr_shader.c index 8a4a995..11e7d4c 100644 --- a/src/engine/renderer/tr_shader.c +++ b/src/engine/renderer/tr_shader.c @@ -2162,6 +2162,7 @@ static shader_t *FinishShader( void ) { // VULKAN Vk_Pipeline_Desc desc; + desc.face_culling = shader.cullType; desc.polygon_offset = (shader.polygonOffset == qtrue); for (int i = 0; i < stage; i++) { diff --git a/src/engine/renderer/vk.cpp b/src/engine/renderer/vk.cpp index 1ebb085..111b325 100644 --- a/src/engine/renderer/vk.cpp +++ b/src/engine/renderer/vk.cpp @@ -527,8 +527,18 @@ static VkPipeline create_pipeline(const Vk_Pipeline_Desc& desc) { rasterization_state.depthClampEnable = VK_FALSE; rasterization_state.rasterizerDiscardEnable = VK_FALSE; rasterization_state.polygonMode = (desc.state_bits & GLS_POLYMODE_LINE) ? VK_POLYGON_MODE_LINE : VK_POLYGON_MODE_FILL; - rasterization_state.cullMode = VK_CULL_MODE_NONE/*VK_CULL_MODE_BACK_BIT*/; - rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; + + if (desc.face_culling == CT_TWO_SIDED) + rasterization_state.cullMode = VK_CULL_MODE_NONE; + else if (desc.face_culling == CT_FRONT_SIDED) + rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT; + else if (desc.face_culling == CT_BACK_SIDED) + rasterization_state.cullMode = VK_CULL_MODE_FRONT_BIT; + else + ri.Error(ERR_DROP, "create_pipeline: invalid face culling mode\n"); + + rasterization_state.frontFace = VK_FRONT_FACE_CLOCKWISE; // Q3 defaults to clockwise vertex order + rasterization_state.depthBiasEnable = desc.polygon_offset ? VK_TRUE : VK_FALSE; rasterization_state.depthBiasConstantFactor = 0.0f; // dynamic depth bias state rasterization_state.depthBiasClamp = 0.0f; // dynamic depth bias state diff --git a/src/engine/renderer/vk.h b/src/engine/renderer/vk.h index a1642d7..010b7c4 100644 --- a/src/engine/renderer/vk.h +++ b/src/engine/renderer/vk.h @@ -41,14 +41,16 @@ enum class Vk_Shader_Type { }; struct Vk_Pipeline_Desc { - Vk_Shader_Type shader_type; - unsigned int state_bits; // GLS_XXX flags - bool polygon_offset; + Vk_Shader_Type shader_type = Vk_Shader_Type::single_texture; + unsigned int state_bits = 0; // GLS_XXX flags + int face_culling = 0;// cullType_t + bool polygon_offset = false; bool operator==(const Vk_Pipeline_Desc& other) const { return shader_type == other.shader_type && state_bits == other.state_bits && + face_culling == other.face_culling && polygon_offset == other.polygon_offset; } };