- add render pass manager and setup a pipeline for VkRenderState
This commit is contained in:
parent
fbfcc30d00
commit
9ed1c7f40b
15 changed files with 360 additions and 87 deletions
|
|
@ -2,6 +2,7 @@
|
|||
#include "vk_buffers.h"
|
||||
#include "vk_builders.h"
|
||||
#include "vk_framebuffer.h"
|
||||
#include "vulkan/renderer/vk_renderstate.h"
|
||||
#include "doomerrors.h"
|
||||
|
||||
void VKBuffer::SetData(size_t size, const void *data, bool staticdata)
|
||||
|
|
@ -112,8 +113,10 @@ void VKVertexBuffer::SetFormat(int numBindingPoints, int numAttributes, size_t s
|
|||
|
||||
void VKDataBuffer::BindRange(size_t start, size_t length)
|
||||
{
|
||||
GetVulkanFrameBuffer()->GetRenderState()->Bind(bindingpoint, (uint32_t)start);
|
||||
}
|
||||
|
||||
void VKDataBuffer::BindBase()
|
||||
{
|
||||
GetVulkanFrameBuffer()->GetRenderState()->Bind(bindingpoint, 0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -170,7 +170,7 @@ std::unique_ptr<VulkanShader> ShaderBuilder::create(VulkanDevice *device)
|
|||
|
||||
VkShaderModuleCreateInfo createInfo = {};
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
||||
createInfo.codeSize = spirv.size();
|
||||
createInfo.codeSize = spirv.size() * sizeof(unsigned int);
|
||||
createInfo.pCode = spirv.data();
|
||||
|
||||
VkShaderModule shaderModule;
|
||||
|
|
|
|||
|
|
@ -285,10 +285,8 @@ private:
|
|||
class WriteDescriptors
|
||||
{
|
||||
public:
|
||||
void addUniformBuffer(VulkanDescriptorSet *descriptorSet, int binding, VulkanBuffer *buffer);
|
||||
void addUniformBuffer(VulkanDescriptorSet *descriptorSet, int binding, VulkanBuffer *buffer, size_t offset, size_t range);
|
||||
void addStorageBuffer(VulkanDescriptorSet *descriptorSet, int binding, VulkanBuffer *buffer);
|
||||
void addStorageBuffer(VulkanDescriptorSet *descriptorSet, int binding, VulkanBuffer *buffer, size_t offset, size_t range);
|
||||
void addBuffer(VulkanDescriptorSet *descriptorSet, int binding, VkDescriptorType type, VulkanBuffer *buffer);
|
||||
void addBuffer(VulkanDescriptorSet *descriptorSet, int binding, VkDescriptorType type, VulkanBuffer *buffer, size_t offset, size_t range);
|
||||
void addStorageImage(VulkanDescriptorSet *descriptorSet, int binding, VulkanImageView *view, VkImageLayout imageLayout);
|
||||
void addCombinedImageSampler(VulkanDescriptorSet *descriptorSet, int binding, VulkanImageView *view, VulkanSampler *sampler, VkImageLayout imageLayout);
|
||||
|
||||
|
|
@ -1041,12 +1039,12 @@ inline void PipelineBarrier::execute(VulkanCommandBuffer *commandBuffer, VkPipel
|
|||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline void WriteDescriptors::addUniformBuffer(VulkanDescriptorSet *descriptorSet, int binding, VulkanBuffer *buffer)
|
||||
inline void WriteDescriptors::addBuffer(VulkanDescriptorSet *descriptorSet, int binding, VkDescriptorType type, VulkanBuffer *buffer)
|
||||
{
|
||||
addUniformBuffer(descriptorSet, binding, buffer, 0, buffer->size);
|
||||
addBuffer(descriptorSet, binding, type, buffer, 0, buffer->size);
|
||||
}
|
||||
|
||||
inline void WriteDescriptors::addUniformBuffer(VulkanDescriptorSet *descriptorSet, int binding, VulkanBuffer *buffer, size_t offset, size_t range)
|
||||
inline void WriteDescriptors::addBuffer(VulkanDescriptorSet *descriptorSet, int binding, VkDescriptorType type, VulkanBuffer *buffer, size_t offset, size_t range)
|
||||
{
|
||||
VkDescriptorBufferInfo bufferInfo = {};
|
||||
bufferInfo.buffer = buffer->buffer;
|
||||
|
|
@ -1061,34 +1059,7 @@ inline void WriteDescriptors::addUniformBuffer(VulkanDescriptorSet *descriptorSe
|
|||
descriptorWrite.dstSet = descriptorSet->set;
|
||||
descriptorWrite.dstBinding = binding;
|
||||
descriptorWrite.dstArrayElement = 0;
|
||||
descriptorWrite.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
descriptorWrite.descriptorCount = 1;
|
||||
descriptorWrite.pBufferInfo = &extra->bufferInfo;
|
||||
writes.push_back(descriptorWrite);
|
||||
writeExtras.push_back(std::move(extra));
|
||||
}
|
||||
|
||||
inline void WriteDescriptors::addStorageBuffer(VulkanDescriptorSet *descriptorSet, int binding, VulkanBuffer *buffer)
|
||||
{
|
||||
addStorageBuffer(descriptorSet, binding, buffer, 0, buffer->size);
|
||||
}
|
||||
|
||||
inline void WriteDescriptors::addStorageBuffer(VulkanDescriptorSet *descriptorSet, int binding, VulkanBuffer *buffer, size_t offset, size_t range)
|
||||
{
|
||||
VkDescriptorBufferInfo bufferInfo = {};
|
||||
bufferInfo.buffer = buffer->buffer;
|
||||
bufferInfo.offset = offset;
|
||||
bufferInfo.range = range;
|
||||
|
||||
auto extra = std::make_unique<WriteExtra>();
|
||||
extra->bufferInfo = bufferInfo;
|
||||
|
||||
VkWriteDescriptorSet descriptorWrite = {};
|
||||
descriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
descriptorWrite.dstSet = descriptorSet->set;
|
||||
descriptorWrite.dstBinding = binding;
|
||||
descriptorWrite.dstArrayElement = 0;
|
||||
descriptorWrite.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
|
||||
descriptorWrite.descriptorType = type;
|
||||
descriptorWrite.descriptorCount = 1;
|
||||
descriptorWrite.pBufferInfo = &extra->bufferInfo;
|
||||
writes.push_back(descriptorWrite);
|
||||
|
|
|
|||
|
|
@ -127,6 +127,8 @@ void VulkanDevice::presentFrame()
|
|||
vkQueuePresentKHR(presentQueue, &presentInfo);
|
||||
}
|
||||
|
||||
//FString allVulkanOutput;
|
||||
|
||||
VkBool32 VulkanDevice::debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT* callbackData, void* userData)
|
||||
{
|
||||
VulkanDevice *device = (VulkanDevice*)userData;
|
||||
|
|
@ -143,6 +145,8 @@ VkBool32 VulkanDevice::debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT mess
|
|||
|
||||
Printf("Vulkan validation layer %s: %s\n", prefix, callbackData->pMessage);
|
||||
|
||||
//allVulkanOutput.AppendFormat("Vulkan validation layer %s: %s\n", prefix, callbackData->pMessage);
|
||||
|
||||
return VK_FALSE;
|
||||
}
|
||||
|
||||
|
|
@ -178,7 +182,6 @@ void VulkanDevice::createInstance()
|
|||
if (layer.layerName == debugLayer)
|
||||
{
|
||||
validationLayers.push_back(debugLayer.c_str());
|
||||
//enabledExtensions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
|
||||
enabledExtensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
|
||||
debugLayerFound = true;
|
||||
}
|
||||
|
|
@ -203,23 +206,20 @@ void VulkanDevice::createInstance()
|
|||
{
|
||||
VkDebugUtilsMessengerCreateInfoEXT createInfo = {};
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
|
||||
createInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
|
||||
createInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
|
||||
createInfo.messageSeverity =
|
||||
//VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
|
||||
//VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT |
|
||||
VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
|
||||
VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
|
||||
createInfo.messageType =
|
||||
VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
|
||||
VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
|
||||
VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
|
||||
createInfo.pfnUserCallback = debugCallback;
|
||||
createInfo.pUserData = this;
|
||||
result = vkCreateDebugUtilsMessengerEXT(instance, &createInfo, nullptr, &debugMessenger);
|
||||
if (result != VK_SUCCESS)
|
||||
throw std::runtime_error("vkCreateDebugUtilsMessengerEXT failed");
|
||||
|
||||
/*
|
||||
VkDebugReportCallbackCreateInfoEXT createInfo = {};
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
|
||||
createInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
|
||||
createInfo.pfnCallback = debugCallback;
|
||||
result = vkCreateDebugReportCallbackEXT(instance, &createInfo, nullptr, &vkCallback);
|
||||
if (result != VK_SUCCESS)
|
||||
throw std::runtime_error("vkCreateDebugReportCallbackEXT failed");
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -397,15 +397,15 @@ void VulkanDevice::releaseResources()
|
|||
if (device)
|
||||
vkDeviceWaitIdle(device);
|
||||
|
||||
if (!imageAvailableSemaphore)
|
||||
if (imageAvailableSemaphore)
|
||||
vkDestroySemaphore(device, imageAvailableSemaphore, nullptr);
|
||||
imageAvailableSemaphore = 0;
|
||||
|
||||
if (!renderFinishedSemaphore)
|
||||
if (renderFinishedSemaphore)
|
||||
vkDestroySemaphore(device, renderFinishedSemaphore, nullptr);
|
||||
renderFinishedSemaphore = 0;
|
||||
|
||||
if (!renderFinishedFence)
|
||||
if (renderFinishedFence)
|
||||
vkDestroyFence(device, renderFinishedFence, nullptr);
|
||||
renderFinishedFence = 0;
|
||||
|
||||
|
|
@ -419,6 +419,9 @@ void VulkanDevice::releaseResources()
|
|||
vkDestroySurfaceKHR(instance, surface, nullptr);
|
||||
surface = 0;
|
||||
|
||||
if (debugMessenger)
|
||||
vkDestroyDebugUtilsMessengerEXT(instance, debugMessenger, nullptr);
|
||||
|
||||
if (instance)
|
||||
vkDestroyInstance(instance, nullptr);
|
||||
instance = nullptr;
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ private:
|
|||
void createSemaphores();
|
||||
void releaseResources();
|
||||
|
||||
VkDebugUtilsMessengerEXT debugMessenger;
|
||||
VkDebugUtilsMessengerEXT debugMessenger = VK_NULL_HANDLE;
|
||||
static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData);
|
||||
|
||||
std::vector<const char *> requiredExtensions = { VK_KHR_SWAPCHAIN_EXTENSION_NAME };
|
||||
|
|
|
|||
|
|
@ -34,11 +34,13 @@
|
|||
#include "hwrenderer/scene/hw_skydome.h"
|
||||
#include "hwrenderer/data/hw_viewpointbuffer.h"
|
||||
#include "hwrenderer/data/flatvertices.h"
|
||||
#include "hwrenderer/data/shaderuniforms.h"
|
||||
#include "hwrenderer/dynlights/hw_lightbuffer.h"
|
||||
|
||||
#include "vk_framebuffer.h"
|
||||
#include "vk_buffers.h"
|
||||
#include "vulkan/renderer/vk_renderstate.h"
|
||||
#include "vulkan/renderer/vk_renderpass.h"
|
||||
#include "vulkan/shaders/vk_shader.h"
|
||||
#include "vulkan/textures/vk_samplers.h"
|
||||
#include "vulkan/system/vk_builders.h"
|
||||
|
|
@ -73,6 +75,7 @@ void VulkanFrameBuffer::InitializeState()
|
|||
|
||||
mShaderManager.reset(new VkShaderManager(device));
|
||||
mSamplerManager.reset(new VkSamplerManager(device));
|
||||
mRenderPassManager.reset(new VkRenderPassManager());
|
||||
mRenderState.reset(new VkRenderState());
|
||||
}
|
||||
|
||||
|
|
@ -99,6 +102,9 @@ void VulkanFrameBuffer::Update()
|
|||
|
||||
Draw2D();
|
||||
Clear2D();
|
||||
|
||||
mRenderState->EndRenderPass();
|
||||
|
||||
//DrawPresentTexture(mOutputLetterbox, true);
|
||||
|
||||
mPresentCommands->end();
|
||||
|
|
@ -194,7 +200,16 @@ IIndexBuffer *VulkanFrameBuffer::CreateIndexBuffer()
|
|||
|
||||
IDataBuffer *VulkanFrameBuffer::CreateDataBuffer(int bindingpoint, bool ssbo)
|
||||
{
|
||||
return new VKDataBuffer(bindingpoint, ssbo);
|
||||
auto buffer = new VKDataBuffer(bindingpoint, ssbo);
|
||||
if (bindingpoint == VIEWPOINT_BINDINGPOINT)
|
||||
{
|
||||
ViewpointUBO = buffer;
|
||||
}
|
||||
else if (bindingpoint == LIGHTBUF_BINDINGPOINT)
|
||||
{
|
||||
LightBufferSSO = buffer;
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void VulkanFrameBuffer::UnbindTexUnit(int no)
|
||||
|
|
@ -215,6 +230,7 @@ void VulkanFrameBuffer::UpdatePalette()
|
|||
|
||||
void VulkanFrameBuffer::BeginFrame()
|
||||
{
|
||||
mRenderPassManager->BeginFrame();
|
||||
}
|
||||
|
||||
void VulkanFrameBuffer::Draw2D()
|
||||
|
|
|
|||
|
|
@ -6,7 +6,9 @@
|
|||
|
||||
class VkSamplerManager;
|
||||
class VkShaderManager;
|
||||
class VkRenderPassManager;
|
||||
class VkRenderState;
|
||||
class VKDataBuffer;
|
||||
|
||||
class VulkanFrameBuffer : public SystemBaseFrameBuffer
|
||||
{
|
||||
|
|
@ -18,6 +20,12 @@ public:
|
|||
|
||||
VulkanCommandBuffer *GetUploadCommands();
|
||||
VulkanCommandBuffer *GetDrawCommands();
|
||||
VkShaderManager *GetShaderManager() { return mShaderManager.get(); }
|
||||
VkRenderPassManager *GetRenderPassManager() { return mRenderPassManager.get(); }
|
||||
VkRenderState *GetRenderState() { return mRenderState.get(); }
|
||||
|
||||
VKDataBuffer *ViewpointUBO = nullptr;
|
||||
VKDataBuffer *LightBufferSSO = nullptr;
|
||||
|
||||
VulkanFrameBuffer(void *hMonitor, bool fullscreen, VulkanDevice *dev);
|
||||
~VulkanFrameBuffer();
|
||||
|
|
@ -56,6 +64,7 @@ public:
|
|||
private:
|
||||
std::unique_ptr<VkShaderManager> mShaderManager;
|
||||
std::unique_ptr<VkSamplerManager> mSamplerManager;
|
||||
std::unique_ptr<VkRenderPassManager> mRenderPassManager;
|
||||
std::unique_ptr<VulkanCommandPool> mGraphicsCommandPool;
|
||||
std::unique_ptr<VulkanCommandBuffer> mUploadCommands;
|
||||
std::unique_ptr<VulkanCommandBuffer> mPresentCommands;
|
||||
|
|
|
|||
|
|
@ -229,7 +229,7 @@ public:
|
|||
void setStencilCompareMask(VkStencilFaceFlags faceMask, uint32_t compareMask);
|
||||
void setStencilWriteMask(VkStencilFaceFlags faceMask, uint32_t writeMask);
|
||||
void setStencilReference(VkStencilFaceFlags faceMask, uint32_t reference);
|
||||
void bindDescriptorSet(VkPipelineBindPoint pipelineBindPoint, VulkanPipelineLayout *layout, VulkanDescriptorSet *descriptorSet, uint32_t dynamicOffsetCount = 0, const uint32_t* pDynamicOffsets = nullptr);
|
||||
void bindDescriptorSet(VkPipelineBindPoint pipelineBindPoint, VulkanPipelineLayout *layout, uint32_t setIndex, VulkanDescriptorSet *descriptorSet, uint32_t dynamicOffsetCount = 0, const uint32_t* pDynamicOffsets = nullptr);
|
||||
void bindDescriptorSets(VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets);
|
||||
void bindIndexBuffer(VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType);
|
||||
void bindVertexBuffers(uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets);
|
||||
|
|
@ -545,9 +545,9 @@ inline void VulkanCommandBuffer::setStencilReference(VkStencilFaceFlags faceMask
|
|||
vkCmdSetStencilReference(buffer, faceMask, reference);
|
||||
}
|
||||
|
||||
inline void VulkanCommandBuffer::bindDescriptorSet(VkPipelineBindPoint pipelineBindPoint, VulkanPipelineLayout *layout, VulkanDescriptorSet *descriptorSet, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets)
|
||||
inline void VulkanCommandBuffer::bindDescriptorSet(VkPipelineBindPoint pipelineBindPoint, VulkanPipelineLayout *layout, uint32_t setIndex, VulkanDescriptorSet *descriptorSet, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets)
|
||||
{
|
||||
bindDescriptorSets(pipelineBindPoint, layout->layout, 0, 1, &descriptorSet->set, dynamicOffsetCount, pDynamicOffsets);
|
||||
bindDescriptorSets(pipelineBindPoint, layout->layout, setIndex, 1, &descriptorSet->set, dynamicOffsetCount, pDynamicOffsets);
|
||||
}
|
||||
|
||||
inline void VulkanCommandBuffer::bindDescriptorSets(VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue