Vk_Vertex, Vk_Vertex2 - vertex formats for single/multi textured geometry correspondingly.

This commit is contained in:
Artem Kharytoniuk 2017-04-10 11:46:36 +03:00
parent 8a4cce66ed
commit 886ea847ca
4 changed files with 101 additions and 67 deletions

View File

@ -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;

View File

@ -7,8 +7,11 @@
#include "vulkan/vulkan.h"
#include <array>
#include <vector>
#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<VkVertexInputBindingDescription, 1> 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<VkVertexInputAttributeDescription, 3> 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<VkVertexInputBindingDescription, 1> 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<VkVertexInputAttributeDescription, 4> get_attributes() {
auto vk_vertex_attribs = Vk_Vertex::get_attributes();
std::array<VkVertexInputAttributeDescription, 4> 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;

View File

@ -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);
}

View File

@ -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<VkVertexInputBindingDescription, 1> 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<VkVertexInputAttributeDescription, 4> 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);