Quick prototyping of 2d mode rendering (UI).
This commit is contained in:
parent
6cd89f37ac
commit
d0700752eb
|
|
@ -779,6 +779,7 @@ image_t *R_CreateImage( const char *name, const byte *pic, int width, int height
|
||||||
|
|
||||||
// VULKAN
|
// VULKAN
|
||||||
image->vk_image = vulkan_demo->create_texture(pic, 4, width, height, image->vk_image_view);
|
image->vk_image = vulkan_demo->create_texture(pic, 4, width, height, image->vk_image_view);
|
||||||
|
vulkan_demo->create_image_descriptor_set(image);
|
||||||
|
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1190,7 +1190,7 @@ void RB_EndSurface( void ) {
|
||||||
tess.currentStageIteratorFunc();
|
tess.currentStageIteratorFunc();
|
||||||
|
|
||||||
// VULKAN
|
// VULKAN
|
||||||
vulkan_demo->render_tess();
|
vulkan_demo->render_tess(tess.shader->stages[0]->bundle[0].image[0]);
|
||||||
|
|
||||||
//
|
//
|
||||||
// draw debugging stuff
|
// draw debugging stuff
|
||||||
|
|
|
||||||
|
|
@ -155,7 +155,7 @@ Vulkan_Demo::Vulkan_Demo(int window_width, int window_height, const SDL_SysWMinf
|
||||||
create_pipeline();
|
create_pipeline();
|
||||||
|
|
||||||
upload_geometry();
|
upload_geometry();
|
||||||
update_ubo_descriptor();
|
update_ubo_descriptor(descriptor_set);
|
||||||
|
|
||||||
{
|
{
|
||||||
VkCommandBufferAllocateInfo alloc_info;
|
VkCommandBufferAllocateInfo alloc_info;
|
||||||
|
|
@ -192,15 +192,15 @@ void Vulkan_Demo::create_command_pool() {
|
||||||
void Vulkan_Demo::create_descriptor_pool() {
|
void Vulkan_Demo::create_descriptor_pool() {
|
||||||
std::array<VkDescriptorPoolSize, 2> pool_sizes;
|
std::array<VkDescriptorPoolSize, 2> pool_sizes;
|
||||||
pool_sizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
pool_sizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||||
pool_sizes[0].descriptorCount = 1;
|
pool_sizes[0].descriptorCount = 1024;
|
||||||
pool_sizes[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
pool_sizes[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||||
pool_sizes[1].descriptorCount = 1;
|
pool_sizes[1].descriptorCount = 1024;
|
||||||
|
|
||||||
VkDescriptorPoolCreateInfo desc;
|
VkDescriptorPoolCreateInfo desc;
|
||||||
desc.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
desc.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
||||||
desc.pNext = nullptr;
|
desc.pNext = nullptr;
|
||||||
desc.flags = 0;
|
desc.flags = 0;
|
||||||
desc.maxSets = 1;
|
desc.maxSets = 1024;
|
||||||
desc.poolSizeCount = static_cast<uint32_t>(pool_sizes.size());
|
desc.poolSizeCount = static_cast<uint32_t>(pool_sizes.size());
|
||||||
desc.pPoolSizes = pool_sizes.data();
|
desc.pPoolSizes = pool_sizes.data();
|
||||||
|
|
||||||
|
|
@ -332,6 +332,42 @@ void Vulkan_Demo::create_descriptor_set() {
|
||||||
check_vk_result(result, "vkAllocateDescriptorSets");
|
check_vk_result(result, "vkAllocateDescriptorSets");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Vulkan_Demo::create_image_descriptor_set(const image_t* image) {
|
||||||
|
VkDescriptorSetAllocateInfo desc;
|
||||||
|
desc.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||||
|
desc.pNext = nullptr;
|
||||||
|
desc.descriptorPool = descriptor_pool;
|
||||||
|
desc.descriptorSetCount = 1;
|
||||||
|
desc.pSetLayouts = &descriptor_set_layout;
|
||||||
|
|
||||||
|
VkDescriptorSet set;
|
||||||
|
VkResult result = vkAllocateDescriptorSets(get_device(), &desc, &set);
|
||||||
|
check_vk_result(result, "vkAllocateDescriptorSets");
|
||||||
|
|
||||||
|
VkDescriptorImageInfo image_info;
|
||||||
|
image_info.sampler = texture_image_sampler;
|
||||||
|
image_info.imageView = image->vk_image_view;
|
||||||
|
image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||||
|
|
||||||
|
std::array<VkWriteDescriptorSet, 1> descriptor_writes;
|
||||||
|
descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||||
|
descriptor_writes[0].dstSet = set;
|
||||||
|
descriptor_writes[0].dstBinding = 1;
|
||||||
|
descriptor_writes[0].dstArrayElement = 0;
|
||||||
|
descriptor_writes[0].descriptorCount = 1;
|
||||||
|
descriptor_writes[0].pNext = nullptr;
|
||||||
|
descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||||
|
descriptor_writes[0].pImageInfo = &image_info;
|
||||||
|
descriptor_writes[0].pBufferInfo = nullptr;
|
||||||
|
descriptor_writes[0].pTexelBufferView = nullptr;
|
||||||
|
|
||||||
|
vkUpdateDescriptorSets(get_device(), (uint32_t)descriptor_writes.size(), descriptor_writes.data(), 0, nullptr);
|
||||||
|
|
||||||
|
update_ubo_descriptor(set);
|
||||||
|
|
||||||
|
image_descriptor_sets[image] = set;
|
||||||
|
}
|
||||||
|
|
||||||
void Vulkan_Demo::create_render_pass() {
|
void Vulkan_Demo::create_render_pass() {
|
||||||
VkAttachmentDescription color_attachment;
|
VkAttachmentDescription color_attachment;
|
||||||
color_attachment.flags = 0;
|
color_attachment.flags = 0;
|
||||||
|
|
@ -643,16 +679,7 @@ void Vulkan_Demo::upload_geometry() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Vulkan_Demo::record_render_frame() {
|
void Vulkan_Demo::update_ubo_descriptor(VkDescriptorSet set) {
|
||||||
const VkDeviceSize offset = 0;
|
|
||||||
vkCmdBindVertexBuffers(command_buffer, 0, 1, &vertex_buffer, &offset);
|
|
||||||
vkCmdBindIndexBuffer(command_buffer, index_buffer, 0, VK_INDEX_TYPE_UINT32);
|
|
||||||
vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_set, 0, nullptr);
|
|
||||||
vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
|
|
||||||
vkCmdDrawIndexed(command_buffer, model_indices_count, 1, 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Vulkan_Demo::update_ubo_descriptor() {
|
|
||||||
VkDescriptorBufferInfo buffer_info;
|
VkDescriptorBufferInfo buffer_info;
|
||||||
buffer_info.buffer = uniform_buffer;
|
buffer_info.buffer = uniform_buffer;
|
||||||
buffer_info.offset = 0;
|
buffer_info.offset = 0;
|
||||||
|
|
@ -661,7 +688,7 @@ void Vulkan_Demo::update_ubo_descriptor() {
|
||||||
std::array<VkWriteDescriptorSet, 1> descriptor_writes;
|
std::array<VkWriteDescriptorSet, 1> descriptor_writes;
|
||||||
descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||||
descriptor_writes[0].pNext = nullptr;
|
descriptor_writes[0].pNext = nullptr;
|
||||||
descriptor_writes[0].dstSet = descriptor_set;
|
descriptor_writes[0].dstSet = set;
|
||||||
descriptor_writes[0].dstBinding = 0;
|
descriptor_writes[0].dstBinding = 0;
|
||||||
descriptor_writes[0].dstArrayElement = 0;
|
descriptor_writes[0].dstArrayElement = 0;
|
||||||
descriptor_writes[0].descriptorCount = 1;
|
descriptor_writes[0].descriptorCount = 1;
|
||||||
|
|
@ -752,7 +779,7 @@ void Vulkan_Demo::update_uniform_buffer(bool cinematic) {
|
||||||
void Vulkan_Demo::begin_frame() {
|
void Vulkan_Demo::begin_frame() {
|
||||||
fprintf(logfile, "begin_frame\n");
|
fprintf(logfile, "begin_frame\n");
|
||||||
fflush(logfile);
|
fflush(logfile);
|
||||||
//update_image_descriptor(false);
|
update_image_descriptor(false);
|
||||||
|
|
||||||
VkBufferCopy region;
|
VkBufferCopy region;
|
||||||
region.srcOffset = 0;
|
region.srcOffset = 0;
|
||||||
|
|
@ -800,7 +827,7 @@ void Vulkan_Demo::end_frame() {
|
||||||
vkCmdEndRenderPass(command_buffer);
|
vkCmdEndRenderPass(command_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Vulkan_Demo::render_tess() {
|
void Vulkan_Demo::render_tess(const image_t* image) {
|
||||||
fprintf(logfile, "render_tess (vert %d, inds %d)\n", tess.numVertexes, tess.numIndexes);
|
fprintf(logfile, "render_tess (vert %d, inds %d)\n", tess.numVertexes, tess.numIndexes);
|
||||||
fflush(logfile);
|
fflush(logfile);
|
||||||
|
|
||||||
|
|
@ -828,7 +855,15 @@ void Vulkan_Demo::render_tess() {
|
||||||
const VkDeviceSize offset = 0;
|
const VkDeviceSize offset = 0;
|
||||||
vkCmdBindVertexBuffers(command_buffer, 0, 1, &tess_vertex_buffer, &tess_vertex_buffer_offset);
|
vkCmdBindVertexBuffers(command_buffer, 0, 1, &tess_vertex_buffer, &tess_vertex_buffer_offset);
|
||||||
vkCmdBindIndexBuffer(command_buffer, tess_index_buffer, tess_index_buffer_offset, VK_INDEX_TYPE_UINT32);
|
vkCmdBindIndexBuffer(command_buffer, tess_index_buffer, tess_index_buffer_offset, VK_INDEX_TYPE_UINT32);
|
||||||
vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_set, 0, nullptr);
|
|
||||||
|
VkDescriptorSet* set = &descriptor_set;
|
||||||
|
VkDescriptorSet image_set;
|
||||||
|
if (image != nullptr) {
|
||||||
|
image_set = image_descriptor_sets[image];
|
||||||
|
set = &image_set;
|
||||||
|
}
|
||||||
|
|
||||||
|
vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, set, 0, nullptr);
|
||||||
vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
|
vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
|
||||||
vkCmdDrawIndexed(command_buffer, tess.numIndexes, 1, 0, 0, 0);
|
vkCmdDrawIndexed(command_buffer, tess.numIndexes, 1, 0, 0, 0);
|
||||||
tess_vertex_buffer_offset += tess.numVertexes * sizeof(Vertex);
|
tess_vertex_buffer_offset += tess.numVertexes * sizeof(Vertex);
|
||||||
|
|
@ -842,6 +877,13 @@ void Vulkan_Demo::render_cinematic_frame() {
|
||||||
fflush(logfile);
|
fflush(logfile);
|
||||||
|
|
||||||
update_image_descriptor(true);
|
update_image_descriptor(true);
|
||||||
record_render_frame();
|
|
||||||
|
const VkDeviceSize offset = 0;
|
||||||
|
vkCmdBindVertexBuffers(command_buffer, 0, 1, &vertex_buffer, &offset);
|
||||||
|
vkCmdBindIndexBuffer(command_buffer, index_buffer, 0, VK_INDEX_TYPE_UINT32);
|
||||||
|
vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptor_set, 0, nullptr);
|
||||||
|
vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
|
||||||
|
vkCmdDrawIndexed(command_buffer, model_indices_count, 1, 0, 0, 0);
|
||||||
|
|
||||||
update_uniform_buffer(true);
|
update_uniform_buffer(true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,12 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "vk.h"
|
#include "vk.h"
|
||||||
|
|
||||||
|
#include "tr_local.h"
|
||||||
|
|
||||||
struct SDL_SysWMinfo;
|
struct SDL_SysWMinfo;
|
||||||
|
|
||||||
class Vulkan_Demo {
|
class Vulkan_Demo {
|
||||||
|
|
@ -13,7 +16,7 @@ public:
|
||||||
|
|
||||||
void begin_frame();
|
void begin_frame();
|
||||||
void end_frame();
|
void end_frame();
|
||||||
void render_tess();
|
void render_tess(const image_t* image);
|
||||||
void render_cinematic_frame();
|
void render_cinematic_frame();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
@ -27,14 +30,14 @@ public:
|
||||||
|
|
||||||
void create_descriptor_set_layout();
|
void create_descriptor_set_layout();
|
||||||
void create_descriptor_set();
|
void create_descriptor_set();
|
||||||
|
void create_image_descriptor_set(const image_t* image);
|
||||||
void create_render_pass();
|
void create_render_pass();
|
||||||
void create_framebuffers();
|
void create_framebuffers();
|
||||||
void create_pipeline_layout();
|
void create_pipeline_layout();
|
||||||
void create_pipeline();
|
void create_pipeline();
|
||||||
|
|
||||||
void upload_geometry();
|
void upload_geometry();
|
||||||
void record_render_frame();
|
void update_ubo_descriptor(VkDescriptorSet set);
|
||||||
void update_ubo_descriptor();
|
|
||||||
void update_image_descriptor(bool cinematic);
|
void update_image_descriptor(bool cinematic);
|
||||||
void update_uniform_buffer(bool cinematic);
|
void update_uniform_buffer(bool cinematic);
|
||||||
|
|
||||||
|
|
@ -75,6 +78,8 @@ public:
|
||||||
VkDeviceMemory tess_index_buffer_memory = VK_NULL_HANDLE;
|
VkDeviceMemory tess_index_buffer_memory = VK_NULL_HANDLE;
|
||||||
VkDeviceSize tess_index_buffer_offset = 0;
|
VkDeviceSize tess_index_buffer_offset = 0;
|
||||||
|
|
||||||
|
std::map<const image_t*, VkDescriptorSet> image_descriptor_sets; // quick UI prototyping
|
||||||
|
|
||||||
VkCommandBuffer command_buffer = VK_NULL_HANDLE;
|
VkCommandBuffer command_buffer = VK_NULL_HANDLE;
|
||||||
|
|
||||||
uint32_t swapchain_image_index = -1;
|
uint32_t swapchain_image_index = -1;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user