diff --git a/src/engine/renderer/vk.cpp b/src/engine/renderer/vk.cpp index 78d25cb..1ebb085 100644 --- a/src/engine/renderer/vk.cpp +++ b/src/engine/renderer/vk.cpp @@ -488,12 +488,21 @@ static VkPipeline create_pipeline(const Vk_Pipeline_Desc& desc) { vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; vertex_input_state.pNext = nullptr; vertex_input_state.flags = 0; - auto bindings = Vertex::get_bindings(); - vertex_input_state.vertexBindingDescriptionCount = (uint32_t)bindings.size(); - vertex_input_state.pVertexBindingDescriptions = bindings.data(); - auto attribs = Vertex::get_attributes(); - vertex_input_state.vertexAttributeDescriptionCount = (uint32_t)attribs.size(); - vertex_input_state.pVertexAttributeDescriptions = attribs.data(); + if (desc.shader_type == Vk_Shader_Type::single_texture) { + auto bindings = Vk_Vertex::get_bindings(); + vertex_input_state.vertexBindingDescriptionCount = (uint32_t)bindings.size(); + vertex_input_state.pVertexBindingDescriptions = bindings.data(); + auto attribs = Vk_Vertex::get_attributes(); + vertex_input_state.vertexAttributeDescriptionCount = (uint32_t)attribs.size(); + vertex_input_state.pVertexAttributeDescriptions = attribs.data(); + } else { + auto bindings = Vk_Vertex2::get_bindings(); + vertex_input_state.vertexBindingDescriptionCount = (uint32_t)bindings.size(); + vertex_input_state.pVertexBindingDescriptions = bindings.data(); + auto attribs = Vk_Vertex2::get_attributes(); + vertex_input_state.vertexAttributeDescriptionCount = (uint32_t)attribs.size(); + vertex_input_state.pVertexAttributeDescriptions = attribs.data(); + } VkPipelineInputAssemblyStateCreateInfo input_assembly_state; input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; diff --git a/src/engine/renderer/vk.h b/src/engine/renderer/vk.h index 350676e..a1642d7 100644 --- a/src/engine/renderer/vk.h +++ b/src/engine/renderer/vk.h @@ -7,8 +7,11 @@ #include "vulkan/vulkan.h" +#include #include +#include "../../game/q_shared.h" + bool initialize_vulkan(HWND hwnd); void deinitialize_vulkan(); @@ -53,6 +56,71 @@ struct Vk_Pipeline_Desc { VkPipeline vk_find_pipeline(const Vk_Pipeline_Desc& desc); void vk_destroy_pipelines(); +// Vertex formats +struct Vk_Vertex { + vec3_t pos; + vec4_t color; + vec2_t st; + + static std::array get_bindings() { + VkVertexInputBindingDescription binding_desc; + binding_desc.binding = 0; + binding_desc.stride = sizeof(Vk_Vertex); + binding_desc.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; + return {binding_desc}; + } + static std::array get_attributes() { + VkVertexInputAttributeDescription position_attrib; + position_attrib.location = 0; + position_attrib.binding = 0; + position_attrib.format = VK_FORMAT_R32G32B32_SFLOAT; + position_attrib.offset = offsetof(struct Vk_Vertex, pos); + + VkVertexInputAttributeDescription color_attrib; + color_attrib.location = 1; + color_attrib.binding = 0; + color_attrib.format = VK_FORMAT_R32G32B32A32_SFLOAT; + color_attrib.offset = offsetof(struct Vk_Vertex, color); + + VkVertexInputAttributeDescription st_attrib; + st_attrib.location = 2; + st_attrib.binding = 0; + st_attrib.format = VK_FORMAT_R32G32_SFLOAT; + st_attrib.offset = offsetof(struct Vk_Vertex, st); + + return {position_attrib, color_attrib, st_attrib}; + } +}; + +struct Vk_Vertex2 : Vk_Vertex { + vec2_t st2; + + static std::array get_bindings() { + VkVertexInputBindingDescription binding_desc; + binding_desc.binding = 0; + binding_desc.stride = sizeof(Vk_Vertex2); + binding_desc.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; + return {binding_desc}; + } + static std::array get_attributes() { + auto vk_vertex_attribs = Vk_Vertex::get_attributes(); + + std::array result; + result[0] = vk_vertex_attribs[0]; + result[1] = vk_vertex_attribs[1]; + result[2] = vk_vertex_attribs[2]; + + VkVertexInputAttributeDescription st2_attrib; + st2_attrib.location = 3; + st2_attrib.binding = 0; + st2_attrib.format = VK_FORMAT_R32G32_SFLOAT; + st2_attrib.offset = offsetof(struct Vk_Vertex2, st2); + result[3] = st2_attrib; + + return result; + } +}; + // Shaders. extern unsigned char single_texture_vert_spv[]; extern long long single_texture_vert_spv_size; diff --git a/src/engine/renderer/vk_demo.cpp b/src/engine/renderer/vk_demo.cpp index 687d0be..f2db6df 100644 --- a/src/engine/renderer/vk_demo.cpp +++ b/src/engine/renderer/vk_demo.cpp @@ -583,19 +583,19 @@ void Vulkan_Demo::render_tess(const shaderStage_t* stage) { fflush(logfile); void* data; - VkResult result = vkMapMemory(get_device(), tess_vertex_buffer_memory, tess_vertex_buffer_offset, tess.numVertexes * sizeof(Vertex), 0, &data); + VkResult result = vkMapMemory(get_device(), tess_vertex_buffer_memory, tess_vertex_buffer_offset, tess.numVertexes * sizeof(Vk_Vertex), 0, &data); check_vk_result(result, "vkMapMemory"); - Vertex* v = (Vertex*)data; + Vk_Vertex* v = (Vk_Vertex*)data; for (int i = 0; i < tess.numVertexes; i++, v++) { - v->pos.x = tess.xyz[i][0]; - v->pos.y = tess.xyz[i][1]; - v->pos.z = tess.xyz[i][2]; + v->pos[0] = tess.xyz[i][0]; + v->pos[1] = tess.xyz[i][1]; + v->pos[2] = tess.xyz[i][2]; v->color[0] = tess.svars.colors[i][0] / 255.0f; v->color[1] = tess.svars.colors[i][1] / 255.0f; v->color[2] = tess.svars.colors[i][2] / 255.0f; v->color[3] = tess.svars.colors[i][3] / 255.0f; - v->tex_coord[0] = tess.svars.texcoords[0][i][0]; - v->tex_coord[1] = tess.svars.texcoords[0][i][1]; + v->st[0] = tess.svars.texcoords[0][i][0]; + v->st[1] = tess.svars.texcoords[0][i][1]; } vkUnmapMemory(get_device(), tess_vertex_buffer_memory); @@ -653,7 +653,7 @@ void Vulkan_Demo::render_tess(const shaderStage_t* stage) { vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, stage->vk_pipeline); vkCmdDrawIndexed(command_buffer, tess.numIndexes, 1, 0, 0, 0); - tess_vertex_buffer_offset += tess.numVertexes * sizeof(Vertex); + tess_vertex_buffer_offset += tess.numVertexes * sizeof(Vk_Vertex); tess_index_buffer_offset += tess.numIndexes * sizeof(uint32_t); } @@ -662,21 +662,21 @@ void Vulkan_Demo::render_tess_multi(const shaderStage_t* stage) { fflush(logfile); void* data; - VkResult result = vkMapMemory(get_device(), tess_vertex_buffer_memory, tess_vertex_buffer_offset, tess.numVertexes * sizeof(Vertex), 0, &data); + VkResult result = vkMapMemory(get_device(), tess_vertex_buffer_memory, tess_vertex_buffer_offset, tess.numVertexes * sizeof(Vk_Vertex2), 0, &data); check_vk_result(result, "vkMapMemory"); - Vertex* v = (Vertex*)data; + Vk_Vertex2* v = (Vk_Vertex2*)data; for (int i = 0; i < tess.numVertexes; i++, v++) { - v->pos.x = tess.xyz[i][0]; - v->pos.y = tess.xyz[i][1]; - v->pos.z = tess.xyz[i][2]; + v->pos[0] = tess.xyz[i][0]; + v->pos[1] = tess.xyz[i][1]; + v->pos[2] = tess.xyz[i][2]; v->color[0] = tess.svars.colors[i][0] / 255.0f; v->color[1] = tess.svars.colors[i][1] / 255.0f; v->color[2] = tess.svars.colors[i][2] / 255.0f; v->color[3] = tess.svars.colors[i][3] / 255.0f; - v->tex_coord[0] = tess.svars.texcoords[0][i][0]; - v->tex_coord[1] = tess.svars.texcoords[0][i][1]; - v->tex_coord2[0] = tess.svars.texcoords[1][i][0]; - v->tex_coord2[1] = tess.svars.texcoords[1][i][1]; + v->st[0] = tess.svars.texcoords[0][i][0]; + v->st[1] = tess.svars.texcoords[0][i][1]; + v->st2[0] = tess.svars.texcoords[1][i][0]; + v->st2[1] = tess.svars.texcoords[1][i][1]; } vkUnmapMemory(get_device(), tess_vertex_buffer_memory); @@ -741,6 +741,6 @@ void Vulkan_Demo::render_tess_multi(const shaderStage_t* stage) { vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, stage->vk_pipeline); vkCmdDrawIndexed(command_buffer, tess.numIndexes, 1, 0, 0, 0); - tess_vertex_buffer_offset += tess.numVertexes * sizeof(Vertex); + tess_vertex_buffer_offset += tess.numVertexes * sizeof(Vk_Vertex2); tess_index_buffer_offset += tess.numIndexes * sizeof(uint32_t); } diff --git a/src/engine/renderer/vk_demo.h b/src/engine/renderer/vk_demo.h index 16cd25e..e06c431 100644 --- a/src/engine/renderer/vk_demo.h +++ b/src/engine/renderer/vk_demo.h @@ -12,49 +12,6 @@ #include "vk.h" #include "tr_local.h" -struct Vertex { - glm::vec3 pos; - glm::vec4 color; - glm::vec2 tex_coord; - glm::vec2 tex_coord2; - - static std::array get_bindings() { - VkVertexInputBindingDescription binding_desc; - binding_desc.binding = 0; - binding_desc.stride = sizeof(Vertex); - binding_desc.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; - return {binding_desc}; - } - - static std::array get_attributes() { - VkVertexInputAttributeDescription position_attrib; - position_attrib.location = 0; - position_attrib.binding = 0; - position_attrib.format = VK_FORMAT_R32G32B32_SFLOAT; - position_attrib.offset = offsetof(struct Vertex, pos); - - VkVertexInputAttributeDescription color_attrib; - color_attrib.location = 1; - color_attrib.binding = 0; - color_attrib.format = VK_FORMAT_R32G32B32A32_SFLOAT; - color_attrib.offset = offsetof(struct Vertex, color); - - VkVertexInputAttributeDescription tex_coord_attrib; - tex_coord_attrib.location = 2; - tex_coord_attrib.binding = 0; - tex_coord_attrib.format = VK_FORMAT_R32G32_SFLOAT; - tex_coord_attrib.offset = offsetof(struct Vertex, tex_coord); - - VkVertexInputAttributeDescription tex_coord2_attrib; - tex_coord2_attrib.location = 3; - tex_coord2_attrib.binding = 0; - tex_coord2_attrib.format = VK_FORMAT_R32G32_SFLOAT; - tex_coord2_attrib.offset = offsetof(struct Vertex, tex_coord2); - - return {position_attrib, color_attrib, tex_coord_attrib, tex_coord2_attrib}; - } -}; - class Vulkan_Demo { public: Vulkan_Demo(int window_width, int window_height);