Compare commits
4 Commits
53c439ef04
...
db1455ceb0
Author | SHA1 | Date |
---|---|---|
|
db1455ceb0 | |
|
39b97dec27 | |
|
b5dcddea49 | |
|
7297eba889 |
|
@ -1,4 +1,4 @@
|
|||
/* Refresh - XNA-inspired 3D Graphics Library with modern capabilities
|
||||
/* Refresh - XNA-inspired 3D Graphics Library with modern capabilities
|
||||
*
|
||||
* Copyright (c) 2020 Evan Hemsley
|
||||
*
|
||||
|
@ -79,7 +79,8 @@ typedef struct VulkanExtensions
|
|||
#define ALLOCATION_INCREMENT 16000000 /* 16MB */
|
||||
#define TRANSFER_BUFFER_STARTING_SIZE 8000000 /* 8MB */
|
||||
#define POOLED_TRANSFER_BUFFER_SIZE 16000000 /* 16MB */
|
||||
#define UBO_BUFFER_SIZE 16000 /* 16KB */
|
||||
#define UBO_BUFFER_SIZE 16000000 /* 16MB */
|
||||
#define UBO_SECTION_SIZE 4000 /* 4KB */
|
||||
#define DESCRIPTOR_POOL_STARTING_SIZE 128
|
||||
#define DEFRAG_TIME 200
|
||||
#define WINDOW_DATA "Refresh_VulkanWindowData"
|
||||
|
@ -560,8 +561,8 @@ static const VulkanResourceAccessInfo AccessMap[RESOURCE_ACCESS_TYPES_COUNT] =
|
|||
|
||||
/* RESOURCE_ACCESS_ANY_SHADER_READ_SAMPLED_IMAGE */
|
||||
{
|
||||
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
|
||||
VK_ACCESS_SHADER_READ_BIT,
|
||||
VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
|
||||
VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
|
||||
},
|
||||
|
||||
|
@ -719,8 +720,8 @@ typedef struct VulkanUniformBufferPool VulkanUniformBufferPool;
|
|||
typedef struct VulkanUniformBuffer
|
||||
{
|
||||
VulkanUniformBufferPool *pool;
|
||||
VulkanBufferContainer *vulkanBufferContainer; /* use container to avoid defrag issues */
|
||||
VkDeviceSize offset;
|
||||
VkDeviceSize poolOffset; /* memory offset relative to the pool buffer */
|
||||
VkDeviceSize offset; /* based on uniform pushes */
|
||||
VkDescriptorSet descriptorSet;
|
||||
} VulkanUniformBuffer;
|
||||
|
||||
|
@ -746,10 +747,13 @@ typedef struct VulkanUniformDescriptorPool
|
|||
uint32_t availableDescriptorSetCount;
|
||||
} VulkanUniformDescriptorPool;
|
||||
|
||||
/* This is actually just one buffer that we carve slices out of. */
|
||||
struct VulkanUniformBufferPool
|
||||
{
|
||||
VulkanUniformBufferType type;
|
||||
VulkanUniformDescriptorPool descriptorPool;
|
||||
VulkanBuffer *buffer;
|
||||
VkDeviceSize nextAvailableOffset;
|
||||
SDL_mutex *lock;
|
||||
|
||||
VulkanUniformBuffer **availableBuffers;
|
||||
|
@ -1011,6 +1015,7 @@ typedef struct RenderPassHash
|
|||
uint32_t colorAttachmentCount;
|
||||
RenderPassDepthStencilTargetDescription depthStencilTargetDescription;
|
||||
Refresh_SampleCount colorAttachmentSampleCount;
|
||||
VkImageLayout finalLayout;
|
||||
} RenderPassHash;
|
||||
|
||||
typedef struct RenderPassHashMap
|
||||
|
@ -1042,6 +1047,11 @@ static inline uint8_t RenderPassHash_Compare(
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (a->finalLayout != b->finalLayout)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < a->colorAttachmentCount; i += 1)
|
||||
{
|
||||
if (a->colorTargetDescriptions[i].format != b->colorTargetDescriptions[i].format)
|
||||
|
@ -1776,6 +1786,8 @@ typedef struct VulkanRenderer
|
|||
VkDescriptorSetLayout vertexUniformDescriptorSetLayout;
|
||||
VkDescriptorSetLayout fragmentUniformDescriptorSetLayout;
|
||||
VkDescriptorSetLayout computeUniformDescriptorSetLayout;
|
||||
|
||||
VulkanBuffer *dummyBuffer;
|
||||
VulkanUniformBuffer *dummyVertexUniformBuffer;
|
||||
VulkanUniformBuffer *dummyFragmentUniformBuffer;
|
||||
VulkanUniformBuffer *dummyComputeUniformBuffer;
|
||||
|
@ -4197,6 +4209,36 @@ static VulkanUniformBufferPool* VULKAN_INTERNAL_CreateUniformBufferPool(
|
|||
VulkanUniformBufferType uniformBufferType
|
||||
) {
|
||||
VulkanUniformBufferPool* uniformBufferPool = SDL_malloc(sizeof(VulkanUniformBufferPool));
|
||||
VulkanResourceAccessType resourceAccessType;
|
||||
|
||||
if (uniformBufferType == UNIFORM_BUFFER_VERTEX)
|
||||
{
|
||||
resourceAccessType = RESOURCE_ACCESS_VERTEX_SHADER_READ_UNIFORM_BUFFER;
|
||||
}
|
||||
else if (uniformBufferType == UNIFORM_BUFFER_FRAGMENT)
|
||||
{
|
||||
resourceAccessType = RESOURCE_ACCESS_FRAGMENT_SHADER_READ_UNIFORM_BUFFER;
|
||||
}
|
||||
else if (uniformBufferType == UNIFORM_BUFFER_COMPUTE)
|
||||
{
|
||||
resourceAccessType = RESOURCE_ACCESS_COMPUTE_SHADER_READ_UNIFORM_BUFFER;
|
||||
}
|
||||
else
|
||||
{
|
||||
Refresh_LogError("Unrecognized uniform buffer type!");
|
||||
return 0;
|
||||
}
|
||||
|
||||
uniformBufferPool->buffer = VULKAN_INTERNAL_CreateBuffer(
|
||||
renderer,
|
||||
UBO_BUFFER_SIZE,
|
||||
resourceAccessType,
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||
0,
|
||||
1
|
||||
);
|
||||
|
||||
uniformBufferPool->nextAvailableOffset = 0;
|
||||
|
||||
uniformBufferPool->type = uniformBufferType;
|
||||
uniformBufferPool->lock = SDL_CreateMutex();
|
||||
|
@ -4230,12 +4272,6 @@ static void VULKAN_INTERNAL_BindUniformBuffer(
|
|||
|
||||
commandBuffer->boundUniformBuffers[commandBuffer->boundUniformBufferCount] = uniformBuffer;
|
||||
commandBuffer->boundUniformBufferCount += 1;
|
||||
|
||||
VULKAN_INTERNAL_TrackBuffer(
|
||||
renderer,
|
||||
commandBuffer,
|
||||
uniformBuffer->vulkanBufferContainer->vulkanBuffer
|
||||
);
|
||||
}
|
||||
|
||||
/* Buffer indirection so we can cleanly defrag */
|
||||
|
@ -4304,22 +4340,18 @@ static uint8_t VULKAN_INTERNAL_CreateUniformBuffer(
|
|||
|
||||
VulkanUniformBuffer *uniformBuffer = SDL_malloc(sizeof(VulkanUniformBuffer));
|
||||
uniformBuffer->pool = bufferPool;
|
||||
uniformBuffer->vulkanBufferContainer = VULKAN_INTERNAL_CreateBufferContainer(
|
||||
renderer,
|
||||
UBO_BUFFER_SIZE,
|
||||
resourceAccessType,
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||
0
|
||||
);
|
||||
uniformBuffer->poolOffset = bufferPool->nextAvailableOffset;
|
||||
uniformBuffer->offset = 0;
|
||||
|
||||
if (uniformBuffer->vulkanBufferContainer == NULL)
|
||||
bufferPool->nextAvailableOffset += UBO_SECTION_SIZE;
|
||||
|
||||
if (bufferPool->nextAvailableOffset >= UBO_BUFFER_SIZE)
|
||||
{
|
||||
Refresh_LogError("Failed to create buffer for uniform buffer!");
|
||||
Refresh_LogError("Uniform buffer overflow!");
|
||||
SDL_free(uniformBuffer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
uniformBuffer->offset = 0;
|
||||
|
||||
/* Allocate a descriptor set for the uniform buffer */
|
||||
|
||||
if (bufferPool->descriptorPool.availableDescriptorSetCount == 0)
|
||||
|
@ -4329,6 +4361,7 @@ static uint8_t VULKAN_INTERNAL_CreateUniformBuffer(
|
|||
&bufferPool->descriptorPool
|
||||
)) {
|
||||
Refresh_LogError("Failed to add uniform descriptor pool!");
|
||||
SDL_free(uniformBuffer);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -4393,15 +4426,7 @@ static VulkanUniformBuffer* VULKAN_INTERNAL_CreateDummyUniformBuffer(
|
|||
}
|
||||
|
||||
VulkanUniformBuffer *uniformBuffer = SDL_malloc(sizeof(VulkanUniformBuffer));
|
||||
uniformBuffer->pool = NULL;
|
||||
uniformBuffer->vulkanBufferContainer = VULKAN_INTERNAL_CreateBufferContainer(
|
||||
renderer,
|
||||
1,
|
||||
resourceAccessType,
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||
1
|
||||
);
|
||||
|
||||
uniformBuffer->poolOffset = 0;
|
||||
uniformBuffer->offset = 0;
|
||||
|
||||
/* Allocate a descriptor set for the uniform buffer */
|
||||
|
@ -4416,7 +4441,7 @@ static VulkanUniformBuffer* VULKAN_INTERNAL_CreateDummyUniformBuffer(
|
|||
|
||||
/* Update the descriptor set for the first and last time! */
|
||||
|
||||
descriptorBufferInfo.buffer = uniformBuffer->vulkanBufferContainer->vulkanBuffer->buffer;
|
||||
descriptorBufferInfo.buffer = renderer->dummyBuffer->buffer;
|
||||
descriptorBufferInfo.offset = 0;
|
||||
descriptorBufferInfo.range = VK_WHOLE_SIZE;
|
||||
|
||||
|
@ -4463,11 +4488,11 @@ static void VULKAN_INTERNAL_DestroyUniformBufferPool(
|
|||
/* This is always destroyed after submissions, so all buffers are available */
|
||||
for (i = 0; i < uniformBufferPool->availableBufferCount; i += 1)
|
||||
{
|
||||
VULKAN_INTERNAL_DestroyBuffer(renderer, uniformBufferPool->availableBuffers[i]->vulkanBufferContainer->vulkanBuffer);
|
||||
SDL_free(uniformBufferPool->availableBuffers[i]->vulkanBufferContainer);
|
||||
SDL_free(uniformBufferPool->availableBuffers[i]);
|
||||
}
|
||||
|
||||
VULKAN_INTERNAL_DestroyBuffer(renderer, uniformBufferPool->buffer);
|
||||
|
||||
SDL_DestroyMutex(uniformBufferPool->lock);
|
||||
SDL_free(uniformBufferPool->availableBuffers);
|
||||
SDL_free(uniformBufferPool);
|
||||
|
@ -4502,8 +4527,8 @@ static VulkanUniformBuffer* VULKAN_INTERNAL_AcquireUniformBufferFromPool(
|
|||
|
||||
/* Update the descriptor set with the correct range */
|
||||
|
||||
descriptorBufferInfo.buffer = uniformBuffer->vulkanBufferContainer->vulkanBuffer->buffer;
|
||||
descriptorBufferInfo.offset = 0;
|
||||
descriptorBufferInfo.buffer = uniformBuffer->pool->buffer->buffer;
|
||||
descriptorBufferInfo.offset = uniformBuffer->poolOffset;
|
||||
descriptorBufferInfo.range = blockSize;
|
||||
|
||||
writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
|
@ -5183,13 +5208,7 @@ static void VULKAN_DestroyDevice(
|
|||
|
||||
SDL_free(renderer->submittedCommandBuffers);
|
||||
|
||||
VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyVertexUniformBuffer->vulkanBufferContainer->vulkanBuffer);
|
||||
VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyFragmentUniformBuffer->vulkanBufferContainer->vulkanBuffer);
|
||||
VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyComputeUniformBuffer->vulkanBufferContainer->vulkanBuffer);
|
||||
|
||||
SDL_free(renderer->dummyVertexUniformBuffer->vulkanBufferContainer);
|
||||
SDL_free(renderer->dummyFragmentUniformBuffer->vulkanBufferContainer);
|
||||
SDL_free(renderer->dummyComputeUniformBuffer->vulkanBufferContainer);
|
||||
VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyBuffer);
|
||||
|
||||
SDL_free(renderer->dummyVertexUniformBuffer);
|
||||
SDL_free(renderer->dummyFragmentUniformBuffer);
|
||||
|
@ -5942,6 +5961,41 @@ static VulkanRenderTarget* VULKAN_INTERNAL_FetchRenderTarget(
|
|||
return renderTarget;
|
||||
}
|
||||
|
||||
static VkImageLayout VULKAN_INTERNAL_GetRenderPassFinalLayout(
|
||||
VulkanTexture *texture
|
||||
) {
|
||||
VkImageLayout finalLayout;
|
||||
|
||||
if (IsDepthFormat(texture->format))
|
||||
{
|
||||
if (texture->usageFlags & VK_IMAGE_USAGE_SAMPLED_BIT)
|
||||
{
|
||||
finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||
}
|
||||
else
|
||||
{
|
||||
finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (texture->usageFlags & VK_IMAGE_USAGE_SAMPLED_BIT)
|
||||
{
|
||||
finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||
}
|
||||
else if (texture->usageFlags & VK_IMAGE_USAGE_STORAGE_BIT)
|
||||
{
|
||||
finalLayout = VK_IMAGE_LAYOUT_GENERAL;
|
||||
}
|
||||
else
|
||||
{
|
||||
finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
}
|
||||
}
|
||||
|
||||
return finalLayout;
|
||||
}
|
||||
|
||||
static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
||||
VulkanRenderer *renderer,
|
||||
VulkanCommandBuffer *commandBuffer,
|
||||
|
@ -5956,6 +6010,7 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
|||
VkAttachmentReference depthStencilAttachmentReference;
|
||||
VkRenderPassCreateInfo renderPassCreateInfo;
|
||||
VkSubpassDescription subpass;
|
||||
VkSubpassDependency dep[2];
|
||||
VkRenderPass renderPass;
|
||||
uint32_t i;
|
||||
|
||||
|
@ -6008,7 +6063,7 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
|||
attachmentDescriptions[attachmentDescriptionCount].initialLayout =
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
attachmentDescriptions[attachmentDescriptionCount].finalLayout =
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
VULKAN_INTERNAL_GetRenderPassFinalLayout(texture);
|
||||
|
||||
resolveReferences[resolveReferenceCount].attachment =
|
||||
attachmentDescriptionCount;
|
||||
|
@ -6064,8 +6119,7 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
|||
attachmentDescriptions[attachmentDescriptionCount].initialLayout =
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
attachmentDescriptions[attachmentDescriptionCount].finalLayout =
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
|
||||
VULKAN_INTERNAL_GetRenderPassFinalLayout(texture);
|
||||
|
||||
colorAttachmentReferences[colorAttachmentReferenceCount].attachment = attachmentDescriptionCount;
|
||||
colorAttachmentReferences[colorAttachmentReferenceCount].layout =
|
||||
|
@ -6113,7 +6167,7 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
|||
attachmentDescriptions[attachmentDescriptionCount].initialLayout =
|
||||
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||
attachmentDescriptions[attachmentDescriptionCount].finalLayout =
|
||||
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||
VULKAN_INTERNAL_GetRenderPassFinalLayout(texture);
|
||||
|
||||
depthStencilAttachmentReference.attachment =
|
||||
attachmentDescriptionCount;
|
||||
|
@ -6135,6 +6189,37 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
|||
subpass.pResolveAttachments = NULL;
|
||||
}
|
||||
|
||||
const VkPipelineStageFlags graphicsStages = 0
|
||||
| VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
|
||||
| VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
|
||||
| VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
|
||||
| VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
|
||||
| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
|
||||
| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
|
||||
| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
|
||||
;
|
||||
const VkPipelineStageFlags outsideStages = 0
|
||||
| graphicsStages
|
||||
| VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
|
||||
| VK_PIPELINE_STAGE_TRANSFER_BIT
|
||||
;
|
||||
|
||||
dep[0].srcSubpass = VK_SUBPASS_EXTERNAL;
|
||||
dep[0].dstSubpass = 0;
|
||||
dep[0].srcStageMask = outsideStages;
|
||||
dep[0].dstStageMask = graphicsStages;
|
||||
dep[0].srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT;
|
||||
dep[0].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT;
|
||||
dep[0].dependencyFlags = 0;
|
||||
|
||||
dep[1].srcSubpass = 0;
|
||||
dep[1].dstSubpass = VK_SUBPASS_EXTERNAL;
|
||||
dep[1].srcStageMask = graphicsStages;
|
||||
dep[1].dstStageMask = outsideStages;
|
||||
dep[1].srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT;
|
||||
dep[1].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT;
|
||||
dep[1].dependencyFlags = 0;
|
||||
|
||||
renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
||||
renderPassCreateInfo.pNext = NULL;
|
||||
renderPassCreateInfo.flags = 0;
|
||||
|
@ -6142,8 +6227,8 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
|||
renderPassCreateInfo.attachmentCount = attachmentDescriptionCount;
|
||||
renderPassCreateInfo.subpassCount = 1;
|
||||
renderPassCreateInfo.pSubpasses = &subpass;
|
||||
renderPassCreateInfo.dependencyCount = 0;
|
||||
renderPassCreateInfo.pDependencies = NULL;
|
||||
renderPassCreateInfo.dependencyCount = 2;
|
||||
renderPassCreateInfo.pDependencies = dep;
|
||||
|
||||
vulkanResult = renderer->vkCreateRenderPass(
|
||||
renderer->logicalDevice,
|
||||
|
@ -6172,6 +6257,7 @@ static VkRenderPass VULKAN_INTERNAL_CreateTransientRenderPass(
|
|||
VkAttachmentReference depthStencilAttachmentReference;
|
||||
Refresh_ColorAttachmentDescription attachmentDescription;
|
||||
VkSubpassDescription subpass;
|
||||
VkSubpassDependency dep[2];
|
||||
VkRenderPassCreateInfo renderPassCreateInfo;
|
||||
VkRenderPass renderPass;
|
||||
VkResult result;
|
||||
|
@ -6182,6 +6268,7 @@ static VkRenderPass VULKAN_INTERNAL_CreateTransientRenderPass(
|
|||
uint32_t resolveReferenceCount = 0;
|
||||
uint32_t i;
|
||||
|
||||
/* Note: Render pass compatibility does not care about layout */
|
||||
for (i = 0; i < attachmentInfo.colorAttachmentCount; i += 1)
|
||||
{
|
||||
attachmentDescription = attachmentInfo.colorAttachmentDescriptions[i];
|
||||
|
@ -6315,6 +6402,37 @@ static VkRenderPass VULKAN_INTERNAL_CreateTransientRenderPass(
|
|||
subpass.pResolveAttachments = NULL;
|
||||
}
|
||||
|
||||
const VkPipelineStageFlags graphicsStages = 0
|
||||
| VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
|
||||
| VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
|
||||
| VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
|
||||
| VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
|
||||
| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
|
||||
| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
|
||||
| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
|
||||
;
|
||||
const VkPipelineStageFlags outsideStages = 0
|
||||
| graphicsStages
|
||||
| VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
|
||||
| VK_PIPELINE_STAGE_TRANSFER_BIT
|
||||
;
|
||||
|
||||
dep[0].srcSubpass = VK_SUBPASS_EXTERNAL;
|
||||
dep[0].dstSubpass = 0;
|
||||
dep[0].srcStageMask = outsideStages;
|
||||
dep[0].dstStageMask = graphicsStages;
|
||||
dep[0].srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT;
|
||||
dep[0].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT;
|
||||
dep[0].dependencyFlags = 0;
|
||||
|
||||
dep[1].srcSubpass = 0;
|
||||
dep[1].dstSubpass = VK_SUBPASS_EXTERNAL;
|
||||
dep[1].srcStageMask = graphicsStages;
|
||||
dep[1].dstStageMask = outsideStages;
|
||||
dep[1].srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT;
|
||||
dep[1].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT;
|
||||
dep[1].dependencyFlags = 0;
|
||||
|
||||
renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
||||
renderPassCreateInfo.pNext = NULL;
|
||||
renderPassCreateInfo.flags = 0;
|
||||
|
@ -6322,8 +6440,8 @@ static VkRenderPass VULKAN_INTERNAL_CreateTransientRenderPass(
|
|||
renderPassCreateInfo.attachmentCount = attachmentDescriptionCount;
|
||||
renderPassCreateInfo.subpassCount = 1;
|
||||
renderPassCreateInfo.pSubpasses = &subpass;
|
||||
renderPassCreateInfo.dependencyCount = 0;
|
||||
renderPassCreateInfo.pDependencies = NULL;
|
||||
renderPassCreateInfo.dependencyCount = 2;
|
||||
renderPassCreateInfo.pDependencies = dep;
|
||||
|
||||
result = renderer->vkCreateRenderPass(
|
||||
renderer->logicalDevice,
|
||||
|
@ -7764,6 +7882,14 @@ static void VULKAN_SetBufferData(
|
|||
vulkanBuffer
|
||||
);
|
||||
|
||||
// this janky call will wait for transfer writes to finish!
|
||||
VULKAN_INTERNAL_BufferMemoryBarrier(
|
||||
renderer,
|
||||
vulkanCommandBuffer->commandBuffer,
|
||||
RESOURCE_ACCESS_TRANSFER_WRITE,
|
||||
vulkanBuffer
|
||||
);
|
||||
|
||||
bufferCopy.srcOffset = transferBuffer->offset;
|
||||
bufferCopy.dstOffset = offsetInBytes;
|
||||
bufferCopy.size = (VkDeviceSize) dataLength;
|
||||
|
@ -7815,7 +7941,7 @@ static uint32_t VULKAN_PushVertexShaderUniforms(
|
|||
if (
|
||||
vulkanCommandBuffer->vertexUniformBuffer->offset +
|
||||
graphicsPipeline->vertexUniformBlockSize >=
|
||||
UBO_BUFFER_SIZE
|
||||
UBO_SECTION_SIZE
|
||||
) {
|
||||
/* We're out of space in this buffer, bind the old one and acquire a new one */
|
||||
VULKAN_INTERNAL_BindUniformBuffer(
|
||||
|
@ -7833,8 +7959,8 @@ static uint32_t VULKAN_PushVertexShaderUniforms(
|
|||
offset = vulkanCommandBuffer->vertexUniformBuffer->offset;
|
||||
|
||||
VULKAN_INTERNAL_SetBufferData(
|
||||
vulkanCommandBuffer->vertexUniformBuffer->vulkanBufferContainer->vulkanBuffer,
|
||||
vulkanCommandBuffer->vertexUniformBuffer->offset,
|
||||
vulkanCommandBuffer->vertexUniformBuffer->pool->buffer,
|
||||
vulkanCommandBuffer->vertexUniformBuffer->poolOffset + vulkanCommandBuffer->vertexUniformBuffer->offset,
|
||||
data,
|
||||
dataLengthInBytes
|
||||
);
|
||||
|
@ -7859,7 +7985,7 @@ static uint32_t VULKAN_PushFragmentShaderUniforms(
|
|||
if (
|
||||
vulkanCommandBuffer->fragmentUniformBuffer->offset +
|
||||
graphicsPipeline->fragmentUniformBlockSize >=
|
||||
UBO_BUFFER_SIZE
|
||||
UBO_SECTION_SIZE
|
||||
) {
|
||||
/* We're out of space in this buffer, bind the old one and acquire a new one */
|
||||
VULKAN_INTERNAL_BindUniformBuffer(
|
||||
|
@ -7877,8 +8003,8 @@ static uint32_t VULKAN_PushFragmentShaderUniforms(
|
|||
offset = vulkanCommandBuffer->fragmentUniformBuffer->offset;
|
||||
|
||||
VULKAN_INTERNAL_SetBufferData(
|
||||
vulkanCommandBuffer->fragmentUniformBuffer->vulkanBufferContainer->vulkanBuffer,
|
||||
vulkanCommandBuffer->fragmentUniformBuffer->offset,
|
||||
vulkanCommandBuffer->fragmentUniformBuffer->pool->buffer,
|
||||
vulkanCommandBuffer->fragmentUniformBuffer->poolOffset + vulkanCommandBuffer->fragmentUniformBuffer->offset,
|
||||
data,
|
||||
dataLengthInBytes
|
||||
);
|
||||
|
@ -7902,7 +8028,7 @@ static uint32_t VULKAN_PushComputeShaderUniforms(
|
|||
if (
|
||||
vulkanCommandBuffer->computeUniformBuffer->offset +
|
||||
computePipeline->uniformBlockSize >=
|
||||
UBO_BUFFER_SIZE
|
||||
UBO_SECTION_SIZE
|
||||
) {
|
||||
/* We're out of space in this buffer, bind the old one and acquire a new one */
|
||||
VULKAN_INTERNAL_BindUniformBuffer(
|
||||
|
@ -7920,8 +8046,8 @@ static uint32_t VULKAN_PushComputeShaderUniforms(
|
|||
offset = vulkanCommandBuffer->computeUniformBuffer->offset;
|
||||
|
||||
VULKAN_INTERNAL_SetBufferData(
|
||||
vulkanCommandBuffer->computeUniformBuffer->vulkanBufferContainer->vulkanBuffer,
|
||||
vulkanCommandBuffer->computeUniformBuffer->offset,
|
||||
vulkanCommandBuffer->computeUniformBuffer->pool->buffer,
|
||||
vulkanCommandBuffer->computeUniformBuffer->poolOffset + vulkanCommandBuffer->computeUniformBuffer->offset,
|
||||
data,
|
||||
dataLengthInBytes
|
||||
);
|
||||
|
@ -8468,6 +8594,8 @@ static VkRenderPass VULKAN_INTERNAL_FetchRenderPass(
|
|||
hash.depthStencilTargetDescription.stencilStoreOp = depthStencilAttachmentInfo->stencilStoreOp;
|
||||
}
|
||||
|
||||
hash.finalLayout = VULKAN_INTERNAL_GetRenderPassFinalLayout(texture);
|
||||
|
||||
renderPass = RenderPassHashArray_Fetch(
|
||||
&renderer->renderPassHashArray,
|
||||
&hash
|
||||
|
@ -9026,35 +9154,11 @@ static void VULKAN_EndRenderPass(
|
|||
|
||||
if (currentTexture->usageFlags & VK_IMAGE_USAGE_SAMPLED_BIT)
|
||||
{
|
||||
VULKAN_INTERNAL_ImageMemoryBarrier(
|
||||
renderer,
|
||||
vulkanCommandBuffer->commandBuffer,
|
||||
RESOURCE_ACCESS_ANY_SHADER_READ_SAMPLED_IMAGE,
|
||||
currentTexture->aspectFlags,
|
||||
0,
|
||||
currentTexture->layerCount,
|
||||
0,
|
||||
currentTexture->levelCount,
|
||||
0,
|
||||
currentTexture->image,
|
||||
¤tTexture->resourceAccessType
|
||||
);
|
||||
currentTexture->resourceAccessType = RESOURCE_ACCESS_ANY_SHADER_READ_SAMPLED_IMAGE;
|
||||
}
|
||||
else if (currentTexture->usageFlags & VK_IMAGE_USAGE_STORAGE_BIT)
|
||||
{
|
||||
VULKAN_INTERNAL_ImageMemoryBarrier(
|
||||
renderer,
|
||||
vulkanCommandBuffer->commandBuffer,
|
||||
RESOURCE_ACCESS_COMPUTE_SHADER_STORAGE_IMAGE_READ_WRITE,
|
||||
currentTexture->aspectFlags,
|
||||
0,
|
||||
currentTexture->layerCount,
|
||||
0,
|
||||
currentTexture->levelCount,
|
||||
0,
|
||||
currentTexture->image,
|
||||
¤tTexture->resourceAccessType
|
||||
);
|
||||
currentTexture->resourceAccessType = RESOURCE_ACCESS_COMPUTE_SHADER_STORAGE_IMAGE_READ_WRITE;
|
||||
}
|
||||
}
|
||||
vulkanCommandBuffer->renderPassColorTargetCount = 0;
|
||||
|
@ -9065,19 +9169,7 @@ static void VULKAN_EndRenderPass(
|
|||
|
||||
if (currentTexture->usageFlags & VK_IMAGE_USAGE_SAMPLED_BIT)
|
||||
{
|
||||
VULKAN_INTERNAL_ImageMemoryBarrier(
|
||||
renderer,
|
||||
vulkanCommandBuffer->commandBuffer,
|
||||
RESOURCE_ACCESS_ANY_SHADER_READ_SAMPLED_IMAGE,
|
||||
currentTexture->aspectFlags,
|
||||
0,
|
||||
currentTexture->layerCount,
|
||||
0,
|
||||
currentTexture->levelCount,
|
||||
0,
|
||||
currentTexture->image,
|
||||
¤tTexture->resourceAccessType
|
||||
);
|
||||
currentTexture->resourceAccessType = RESOURCE_ACCESS_ANY_SHADER_READ_SAMPLED_IMAGE;
|
||||
}
|
||||
}
|
||||
vulkanCommandBuffer->renderPassDepthTexture = NULL;
|
||||
|
@ -11992,6 +12084,15 @@ static Refresh_Device* VULKAN_CreateDevice(
|
|||
|
||||
/* Dummy Uniform Buffers */
|
||||
|
||||
renderer->dummyBuffer = VULKAN_INTERNAL_CreateBuffer(
|
||||
renderer,
|
||||
1,
|
||||
RESOURCE_ACCESS_GENERAL,
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||
0,
|
||||
1
|
||||
);
|
||||
|
||||
renderer->dummyVertexUniformBuffer = VULKAN_INTERNAL_CreateDummyUniformBuffer(
|
||||
renderer,
|
||||
UNIFORM_BUFFER_VERTEX
|
||||
|
|
Loading…
Reference in New Issue