diff --git a/src/engine/renderer/tr_shade.c b/src/engine/renderer/tr_shade.c index 2b6f1db..967f6cf 100644 --- a/src/engine/renderer/tr_shade.c +++ b/src/engine/renderer/tr_shade.c @@ -152,6 +152,36 @@ static void DrawNormals (shaderCommands_t *input) { qglEnd (); qglDepthRange( 0, 1 ); + + // VULKAN + if (vk.active) { + vec4_t xyz[SHADER_MAX_VERTEXES]; + Com_Memcpy(xyz, tess.xyz, tess.numVertexes * sizeof(vec4_t)); + Com_Memset(tess.svars.colors, tr.identityLightByte, SHADER_MAX_VERTEXES * sizeof(color4ub_t)); + + int numVertexes = tess.numVertexes; + i = 0; + while (i < numVertexes) { + int count = numVertexes - i; + if (count >= SHADER_MAX_VERTEXES/2 - 1) + count = SHADER_MAX_VERTEXES/2 - 1; + + for (int k = 0; k < count; k++) { + VectorCopy(xyz[i + k], tess.xyz[2*k]); + VectorMA(xyz[i + k], 2, input->normal[i + k], tess.xyz[2*k + 1]); + } + tess.numVertexes = 2 * count; + tess.numIndexes = 0; + + vk_bind_resources_shared_between_stages(); + vk_bind_stage_specific_resources(vk.normals_debug_pipeline, false, Vk_Depth_Range::force_zero); + vkCmdDraw(vk.command_buffer, tess.numVertexes, 1, 0, 0); + vk_resources.dirty_attachments = true; + vk.xyz_elements += tess.numVertexes; + + i += count; + } + } } /* diff --git a/src/engine/renderer/vk.cpp b/src/engine/renderer/vk.cpp index 4c58abb..34c473e 100644 --- a/src/engine/renderer/vk.cpp +++ b/src/engine/renderer/vk.cpp @@ -577,6 +577,7 @@ static void init_vulkan_library() { INIT_DEVICE_FUNCTION(vkCmdClearAttachments) INIT_DEVICE_FUNCTION(vkCmdCopyBufferToImage) INIT_DEVICE_FUNCTION(vkCmdCopyImage) + INIT_DEVICE_FUNCTION(vkCmdDraw) INIT_DEVICE_FUNCTION(vkCmdDrawIndexed) INIT_DEVICE_FUNCTION(vkCmdEndRenderPass) INIT_DEVICE_FUNCTION(vkCmdPipelineBarrier) @@ -675,6 +676,7 @@ static void deinit_vulkan_library() { vkCmdClearAttachments = nullptr; vkCmdCopyBufferToImage = nullptr; vkCmdCopyImage = nullptr; + vkCmdDraw = nullptr; vkCmdDrawIndexed = nullptr; vkCmdEndRenderPass = nullptr; vkCmdPipelineBarrier = nullptr; @@ -1167,14 +1169,15 @@ void vk_initialize() { // debug pipelines { Vk_Pipeline_Def def; - def.face_culling = CT_FRONT_SIDED; - def.polygon_offset = false; def.state_bits = GLS_POLYMODE_LINE | GLS_DEPTHMASK_TRUE; - def.shader_type = Vk_Shader_Type::single_texture; - def.clipping_plane = false; - def.mirror = false; vk.tris_debug_pipeline = create_pipeline(def); } + { + Vk_Pipeline_Def def; + def.state_bits = GLS_DEPTHMASK_TRUE; + def.line_primitives = true; + vk.normals_debug_pipeline = create_pipeline(def); + } } vk.active = true; } @@ -1228,6 +1231,7 @@ void vk_shutdown() { vkDestroyPipeline(vk.device, vk.dlight_pipelines[i][j][k], nullptr); } vkDestroyPipeline(vk.device, vk.tris_debug_pipeline, nullptr); + vkDestroyPipeline(vk.device, vk.normals_debug_pipeline, nullptr); vkDestroySwapchainKHR(vk.device, vk.swapchain, nullptr); vkDestroyDevice(vk.device, nullptr); @@ -1571,7 +1575,7 @@ static VkPipeline create_pipeline(const Vk_Pipeline_Def& def) { input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; input_assembly_state.pNext = nullptr; input_assembly_state.flags = 0; - input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + input_assembly_state.topology = def.line_primitives ? VK_PRIMITIVE_TOPOLOGY_LINE_LIST : VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; input_assembly_state.primitiveRestartEnable = VK_FALSE; // @@ -1896,6 +1900,7 @@ VkPipeline vk_find_pipeline(const Vk_Pipeline_Def& def) { cur_def.polygon_offset == def.polygon_offset && cur_def.clipping_plane == def.clipping_plane && cur_def.mirror == def.mirror && + cur_def.line_primitives == def.line_primitives && cur_def.shadow_phase == def.shadow_phase) { return vk_resources.pipelines[i]; @@ -2448,6 +2453,7 @@ PFN_vkCmdBlitImage vkCmdBlitImage; PFN_vkCmdClearAttachments vkCmdClearAttachments; PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; PFN_vkCmdCopyImage vkCmdCopyImage; +PFN_vkCmdDraw vkCmdDraw; PFN_vkCmdDrawIndexed vkCmdDrawIndexed; PFN_vkCmdEndRenderPass vkCmdEndRenderPass; PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier; diff --git a/src/engine/renderer/vk.h b/src/engine/renderer/vk.h index ca57c5f..165f878 100644 --- a/src/engine/renderer/vk.h +++ b/src/engine/renderer/vk.h @@ -54,6 +54,7 @@ struct Vk_Pipeline_Def { bool polygon_offset = false; bool clipping_plane = false; bool mirror = false; + bool line_primitives = false; Vk_Shadow_Phase shadow_phase = Vk_Shadow_Phase::disabled; }; @@ -177,6 +178,7 @@ struct Vk_Instance { VkPipeline dlight_pipelines[2][3][2]; VkPipeline tris_debug_pipeline; + VkPipeline normals_debug_pipeline; }; struct Vk_Resources { @@ -260,6 +262,7 @@ extern PFN_vkCmdBlitImage vkCmdBlitImage; extern PFN_vkCmdClearAttachments vkCmdClearAttachments; extern PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; extern PFN_vkCmdCopyImage vkCmdCopyImage; +extern PFN_vkCmdDraw vkCmdDraw; extern PFN_vkCmdDrawIndexed vkCmdDrawIndexed; extern PFN_vkCmdEndRenderPass vkCmdEndRenderPass; extern PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;