Working on UI drawing.
This commit is contained in:
parent
7a1e74fa35
commit
6cd89f37ac
|
|
@ -619,9 +619,6 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
|
||||||
|
|
||||||
// add light flares on lights that aren't obscured
|
// add light flares on lights that aren't obscured
|
||||||
RB_RenderFlares();
|
RB_RenderFlares();
|
||||||
|
|
||||||
// VULKAN
|
|
||||||
vulkan_demo->render_view();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -936,6 +933,7 @@ const void *RB_DrawBuffer( const void *data ) {
|
||||||
|
|
||||||
result = vkBeginCommandBuffer(vulkan_demo->command_buffer, &begin_info);
|
result = vkBeginCommandBuffer(vulkan_demo->command_buffer, &begin_info);
|
||||||
check_vk_result(result, "vkBeginCommandBuffer");
|
check_vk_result(result, "vkBeginCommandBuffer");
|
||||||
|
vulkan_demo->begin_frame();
|
||||||
|
|
||||||
return (const void *)(cmd + 1);
|
return (const void *)(cmd + 1);
|
||||||
}
|
}
|
||||||
|
|
@ -1053,14 +1051,15 @@ const void *RB_SwapBuffers( const void *data ) {
|
||||||
|
|
||||||
// VULKAN
|
// VULKAN
|
||||||
extern FILE* logfile;
|
extern FILE* logfile;
|
||||||
fprintf(logfile, "present\n");
|
|
||||||
fflush(logfile);
|
|
||||||
|
|
||||||
|
vulkan_demo->end_frame();
|
||||||
VkResult result = vkEndCommandBuffer(vulkan_demo->command_buffer);
|
VkResult result = vkEndCommandBuffer(vulkan_demo->command_buffer);
|
||||||
check_vk_result(result, "vkEndCommandBuffer");
|
check_vk_result(result, "vkEndCommandBuffer");
|
||||||
|
|
||||||
VkPipelineStageFlags wait_dst_stage_mask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
fprintf(logfile, "present\n");
|
||||||
|
fflush(logfile);
|
||||||
|
|
||||||
|
VkPipelineStageFlags wait_dst_stage_mask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||||
VkSubmitInfo submit_info;
|
VkSubmitInfo submit_info;
|
||||||
submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
||||||
submit_info.pNext = nullptr;
|
submit_info.pNext = nullptr;
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
#include "tr_local.h"
|
#include "tr_local.h"
|
||||||
|
|
||||||
|
// VULKAN
|
||||||
|
#include "vk_demo.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
THIS ENTIRE FILE IS BACK END
|
THIS ENTIRE FILE IS BACK END
|
||||||
|
|
@ -1186,6 +1189,9 @@ void RB_EndSurface( void ) {
|
||||||
//
|
//
|
||||||
tess.currentStageIteratorFunc();
|
tess.currentStageIteratorFunc();
|
||||||
|
|
||||||
|
// VULKAN
|
||||||
|
vulkan_demo->render_tess();
|
||||||
|
|
||||||
//
|
//
|
||||||
// draw debugging stuff
|
// draw debugging stuff
|
||||||
//
|
//
|
||||||
|
|
|
||||||
|
|
@ -514,7 +514,7 @@ void Vulkan_Demo::create_pipeline() {
|
||||||
depth_stencil_state.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
|
depth_stencil_state.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
|
||||||
depth_stencil_state.pNext = nullptr;
|
depth_stencil_state.pNext = nullptr;
|
||||||
depth_stencil_state.flags = 0;
|
depth_stencil_state.flags = 0;
|
||||||
depth_stencil_state.depthTestEnable = VK_TRUE;
|
depth_stencil_state.depthTestEnable = VK_FALSE /*VK_TRUE*/;
|
||||||
depth_stencil_state.depthWriteEnable = VK_TRUE;
|
depth_stencil_state.depthWriteEnable = VK_TRUE;
|
||||||
depth_stencil_state.depthCompareOp = VK_COMPARE_OP_LESS;
|
depth_stencil_state.depthCompareOp = VK_COMPARE_OP_LESS;
|
||||||
depth_stencil_state.depthBoundsTestEnable = VK_FALSE;
|
depth_stencil_state.depthBoundsTestEnable = VK_FALSE;
|
||||||
|
|
@ -607,53 +607,49 @@ void Vulkan_Demo::upload_geometry() {
|
||||||
vkCmdCopyBuffer(command_buffer, staging_buffer, index_buffer, 1, ®ion);
|
vkCmdCopyBuffer(command_buffer, staging_buffer, index_buffer, 1, ®ion);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
VkBufferCreateInfo desc;
|
||||||
|
desc.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
||||||
|
desc.pNext = nullptr;
|
||||||
|
desc.flags = 0;
|
||||||
|
desc.size = 16 * 1024 * 1024;
|
||||||
|
desc.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
|
||||||
|
desc.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||||
|
desc.queueFamilyIndexCount = 0;
|
||||||
|
desc.pQueueFamilyIndices = nullptr;
|
||||||
|
|
||||||
|
tess_vertex_buffer = get_resource_manager()->create_buffer(desc);
|
||||||
|
tess_vertex_buffer_memory = get_allocator()->allocate_staging_memory(tess_vertex_buffer);
|
||||||
|
VkResult result = vkBindBufferMemory(get_device(), tess_vertex_buffer, tess_vertex_buffer_memory, 0);
|
||||||
|
check_vk_result(result, "vkBindBufferMemory");
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
VkBufferCreateInfo desc;
|
||||||
|
desc.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
||||||
|
desc.pNext = nullptr;
|
||||||
|
desc.flags = 0;
|
||||||
|
desc.size = 16 * 1024 * 1024;
|
||||||
|
desc.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
|
||||||
|
desc.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||||
|
desc.queueFamilyIndexCount = 0;
|
||||||
|
desc.pQueueFamilyIndices = nullptr;
|
||||||
|
|
||||||
|
tess_index_buffer = get_resource_manager()->create_buffer(desc);
|
||||||
|
tess_index_buffer_memory = get_allocator()->allocate_staging_memory(tess_index_buffer);
|
||||||
|
VkResult result = vkBindBufferMemory(get_device(), tess_index_buffer, tess_index_buffer_memory, 0);
|
||||||
|
check_vk_result(result, "vkBindBufferMemory");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Vulkan_Demo::record_render_frame() {
|
void Vulkan_Demo::record_render_frame() {
|
||||||
VkBufferCopy region;
|
|
||||||
region.srcOffset = 0;
|
|
||||||
region.dstOffset = 0;
|
|
||||||
region.size = sizeof(Uniform_Buffer_Object);
|
|
||||||
vkCmdCopyBuffer(command_buffer, uniform_staging_buffer, uniform_buffer, 1, ®ion);
|
|
||||||
|
|
||||||
VkBufferMemoryBarrier barrier;
|
|
||||||
barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
|
|
||||||
barrier.pNext = nullptr;
|
|
||||||
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
|
|
||||||
barrier.dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT;
|
|
||||||
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
|
||||||
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
|
||||||
barrier.buffer = uniform_buffer;
|
|
||||||
barrier.offset = 0;
|
|
||||||
barrier.size = sizeof(Uniform_Buffer_Object);
|
|
||||||
|
|
||||||
vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, 0,
|
|
||||||
0, nullptr, 1, &barrier, 0, nullptr);
|
|
||||||
|
|
||||||
std::array<VkClearValue, 2> clear_values;
|
|
||||||
clear_values[0].color = {0.3f, 0.2f, 0.1f, 0.0f};
|
|
||||||
clear_values[1].depthStencil = {1.0, 0};
|
|
||||||
|
|
||||||
VkRenderPassBeginInfo render_pass_begin_info;
|
|
||||||
render_pass_begin_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
|
||||||
render_pass_begin_info.pNext = nullptr;
|
|
||||||
render_pass_begin_info.renderPass = render_pass;
|
|
||||||
render_pass_begin_info.framebuffer = framebuffers[swapchain_image_index];
|
|
||||||
render_pass_begin_info.renderArea.offset = {0, 0};
|
|
||||||
render_pass_begin_info.renderArea.extent = {(uint32_t)window_width, (uint32_t)window_height};
|
|
||||||
render_pass_begin_info.clearValueCount = static_cast<uint32_t>(clear_values.size());
|
|
||||||
render_pass_begin_info.pClearValues = clear_values.data();
|
|
||||||
|
|
||||||
vkCmdBeginRenderPass(command_buffer, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
|
|
||||||
|
|
||||||
const VkDeviceSize offset = 0;
|
const VkDeviceSize offset = 0;
|
||||||
vkCmdBindVertexBuffers(command_buffer, 0, 1, &vertex_buffer, &offset);
|
vkCmdBindVertexBuffers(command_buffer, 0, 1, &vertex_buffer, &offset);
|
||||||
vkCmdBindIndexBuffer(command_buffer, index_buffer, 0, VK_INDEX_TYPE_UINT32);
|
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);
|
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);
|
vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
|
||||||
vkCmdDrawIndexed(command_buffer, model_indices_count, 1, 0, 0, 0);
|
vkCmdDrawIndexed(command_buffer, model_indices_count, 1, 0, 0, 0);
|
||||||
|
|
||||||
vkCmdEndRenderPass(command_buffer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Vulkan_Demo::update_ubo_descriptor() {
|
void Vulkan_Demo::update_ubo_descriptor() {
|
||||||
|
|
@ -753,12 +749,91 @@ void Vulkan_Demo::update_uniform_buffer(bool cinematic) {
|
||||||
vkUnmapMemory(get_device(), uniform_staging_buffer_memory);
|
vkUnmapMemory(get_device(), uniform_staging_buffer_memory);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Vulkan_Demo::render_view() {
|
void Vulkan_Demo::begin_frame() {
|
||||||
fprintf(logfile, "render_view\n");
|
fprintf(logfile, "begin_frame\n");
|
||||||
|
fflush(logfile);
|
||||||
|
//update_image_descriptor(false);
|
||||||
|
|
||||||
|
VkBufferCopy region;
|
||||||
|
region.srcOffset = 0;
|
||||||
|
region.dstOffset = 0;
|
||||||
|
region.size = sizeof(Uniform_Buffer_Object);
|
||||||
|
vkCmdCopyBuffer(command_buffer, uniform_staging_buffer, uniform_buffer, 1, ®ion);
|
||||||
|
|
||||||
|
VkBufferMemoryBarrier barrier;
|
||||||
|
barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
|
||||||
|
barrier.pNext = nullptr;
|
||||||
|
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||||
|
barrier.dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT;
|
||||||
|
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
|
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
|
barrier.buffer = uniform_buffer;
|
||||||
|
barrier.offset = 0;
|
||||||
|
barrier.size = sizeof(Uniform_Buffer_Object);
|
||||||
|
|
||||||
|
vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, 0,
|
||||||
|
0, nullptr, 1, &barrier, 0, nullptr);
|
||||||
|
|
||||||
|
std::array<VkClearValue, 2> clear_values;
|
||||||
|
clear_values[0].color = {1.0f, 0.3f, 0.3f, 0.0f};
|
||||||
|
clear_values[1].depthStencil = {1.0, 0};
|
||||||
|
|
||||||
|
VkRenderPassBeginInfo render_pass_begin_info;
|
||||||
|
render_pass_begin_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
||||||
|
render_pass_begin_info.pNext = nullptr;
|
||||||
|
render_pass_begin_info.renderPass = render_pass;
|
||||||
|
render_pass_begin_info.framebuffer = framebuffers[swapchain_image_index];
|
||||||
|
render_pass_begin_info.renderArea.offset = {0, 0};
|
||||||
|
render_pass_begin_info.renderArea.extent = {(uint32_t)window_width, (uint32_t)window_height};
|
||||||
|
render_pass_begin_info.clearValueCount = static_cast<uint32_t>(clear_values.size());
|
||||||
|
render_pass_begin_info.pClearValues = clear_values.data();
|
||||||
|
|
||||||
|
vkCmdBeginRenderPass(command_buffer, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
|
||||||
|
|
||||||
|
tess_vertex_buffer_offset = 0;
|
||||||
|
tess_index_buffer_offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Vulkan_Demo::end_frame() {
|
||||||
|
fprintf(logfile, "end_frame (vb_size %d, ib_size %d)\n", (int)tess_vertex_buffer_offset, (int)tess_index_buffer_offset);
|
||||||
|
fflush(logfile);
|
||||||
|
vkCmdEndRenderPass(command_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Vulkan_Demo::render_tess() {
|
||||||
|
fprintf(logfile, "render_tess (vert %d, inds %d)\n", tess.numVertexes, tess.numIndexes);
|
||||||
fflush(logfile);
|
fflush(logfile);
|
||||||
|
|
||||||
update_image_descriptor(false);
|
void* data;
|
||||||
record_render_frame();
|
VkResult result = vkMapMemory(get_device(), tess_vertex_buffer_memory, tess_vertex_buffer_offset, tess.numVertexes * sizeof(Vertex), 0, &data);
|
||||||
|
check_vk_result(result, "vkMapMemory");
|
||||||
|
Vertex* v = (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->tex_coord[0] = tess.texCoords[i][0][0];
|
||||||
|
v->tex_coord[1] = tess.texCoords[i][0][1];
|
||||||
|
}
|
||||||
|
vkUnmapMemory(get_device(), tess_vertex_buffer_memory);
|
||||||
|
|
||||||
|
result = vkMapMemory(get_device(), tess_index_buffer_memory, tess_index_buffer_offset, tess.numIndexes * sizeof(uint32_t), 0, &data);
|
||||||
|
check_vk_result(result, "vkMapMemory");
|
||||||
|
uint32_t* ind = (uint32_t*)data;
|
||||||
|
for (int i = 0; i < tess.numIndexes; i++, ind++) {
|
||||||
|
*ind = tess.indexes[i];
|
||||||
|
}
|
||||||
|
vkUnmapMemory(get_device(), tess_index_buffer_memory);
|
||||||
|
|
||||||
|
const VkDeviceSize offset = 0;
|
||||||
|
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);
|
||||||
|
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, tess.numIndexes, 1, 0, 0, 0);
|
||||||
|
tess_vertex_buffer_offset += tess.numVertexes * sizeof(Vertex);
|
||||||
|
tess_index_buffer_offset += tess.numIndexes * sizeof(uint32_t);
|
||||||
|
|
||||||
update_uniform_buffer(false);
|
update_uniform_buffer(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,9 @@ public:
|
||||||
Vulkan_Demo(int window_width, int window_height, const SDL_SysWMinfo& window_sys_info);
|
Vulkan_Demo(int window_width, int window_height, const SDL_SysWMinfo& window_sys_info);
|
||||||
~Vulkan_Demo();
|
~Vulkan_Demo();
|
||||||
|
|
||||||
void render_view();
|
void begin_frame();
|
||||||
|
void end_frame();
|
||||||
|
void render_tess();
|
||||||
void render_cinematic_frame();
|
void render_cinematic_frame();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
@ -66,6 +68,13 @@ public:
|
||||||
VkBuffer index_buffer = VK_NULL_HANDLE;
|
VkBuffer index_buffer = VK_NULL_HANDLE;
|
||||||
uint32_t model_indices_count = 0;
|
uint32_t model_indices_count = 0;
|
||||||
|
|
||||||
|
VkBuffer tess_vertex_buffer = VK_NULL_HANDLE;
|
||||||
|
VkDeviceMemory tess_vertex_buffer_memory = VK_NULL_HANDLE;
|
||||||
|
VkDeviceSize tess_vertex_buffer_offset = 0;
|
||||||
|
VkBuffer tess_index_buffer = VK_NULL_HANDLE;
|
||||||
|
VkDeviceMemory tess_index_buffer_memory = VK_NULL_HANDLE;
|
||||||
|
VkDeviceSize tess_index_buffer_offset = 0;
|
||||||
|
|
||||||
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