continue rewrite
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
44d510892c
commit
8d41e2a64a
|
@ -553,17 +553,18 @@ typedef struct Refresh_ComputePipelineCreateInfo
|
||||||
Refresh_ComputePipelineLayoutCreateInfo pipelineLayoutCreateInfo;
|
Refresh_ComputePipelineLayoutCreateInfo pipelineLayoutCreateInfo;
|
||||||
} Refresh_ComputePipelineCreateInfo;
|
} Refresh_ComputePipelineCreateInfo;
|
||||||
|
|
||||||
typedef struct Refresh_AttachmentDescription
|
typedef struct Refresh_ColorAttachmentDescription
|
||||||
{
|
{
|
||||||
Refresh_TextureFormat format;
|
Refresh_TextureFormat format;
|
||||||
Refresh_SampleCount sampleCount;
|
Refresh_SampleCount sampleCount;
|
||||||
} Refresh_AttachmentDescription;
|
} Refresh_ColorAttachmentDescription;
|
||||||
|
|
||||||
typedef struct Refresh_GraphicsPipelineAttachmentInfo
|
typedef struct Refresh_GraphicsPipelineAttachmentInfo
|
||||||
{
|
{
|
||||||
Refresh_AttachmentDescription colorAttachmentDescriptions[4];
|
Refresh_ColorAttachmentDescription colorAttachmentDescriptions[4];
|
||||||
uint32_t colorAttachmentCount;
|
uint32_t colorAttachmentCount;
|
||||||
Refresh_AttachmentDescription *depthStencilAttachmentDescription; /* Can be NULL */
|
uint8_t hasDepthStencilAttachment;
|
||||||
|
Refresh_TextureFormat depthStencilFormat;
|
||||||
} Refresh_GraphicsPipelineAttachmentInfo;
|
} Refresh_GraphicsPipelineAttachmentInfo;
|
||||||
|
|
||||||
typedef struct Refresh_GraphicsPipelineCreateInfo
|
typedef struct Refresh_GraphicsPipelineCreateInfo
|
||||||
|
@ -1113,7 +1114,7 @@ REFRESHAPI void Refresh_QueueDestroyGraphicsPipeline(
|
||||||
* The area affected by the render pass.
|
* The area affected by the render pass.
|
||||||
* All load, store and resolve operations are restricted
|
* All load, store and resolve operations are restricted
|
||||||
* to the given rectangle.
|
* to the given rectangle.
|
||||||
* pColorAttachmentInfos:
|
* colorAttachmentInfos:
|
||||||
* A pointer to an array of Refresh_ColorAttachmentInfo structures
|
* A pointer to an array of Refresh_ColorAttachmentInfo structures
|
||||||
* that contains render targets and clear values. May be NULL.
|
* that contains render targets and clear values. May be NULL.
|
||||||
* colorAttachmentCount: The amount of structs in the above array.
|
* colorAttachmentCount: The amount of structs in the above array.
|
||||||
|
@ -1123,7 +1124,7 @@ REFRESHAPI void Refresh_BeginRenderPass(
|
||||||
Refresh_Device *device,
|
Refresh_Device *device,
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
Refresh_Rect *renderArea,
|
Refresh_Rect *renderArea,
|
||||||
Refresh_ColorAttachmentInfo *pColorAttachmentInfos,
|
Refresh_ColorAttachmentInfo *colorAttachmentInfos,
|
||||||
uint32_t colorAttachmentCount,
|
uint32_t colorAttachmentCount,
|
||||||
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
|
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
|
||||||
);
|
);
|
||||||
|
|
|
@ -613,7 +613,7 @@ void Refresh_BeginRenderPass(
|
||||||
Refresh_Device *device,
|
Refresh_Device *device,
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
Refresh_Rect *renderArea,
|
Refresh_Rect *renderArea,
|
||||||
Refresh_ColorAttachmentInfo *pColorAttachmentInfos,
|
Refresh_ColorAttachmentInfo *colorAttachmentInfos,
|
||||||
uint32_t colorAttachmentCount,
|
uint32_t colorAttachmentCount,
|
||||||
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
|
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
|
||||||
) {
|
) {
|
||||||
|
@ -622,7 +622,7 @@ void Refresh_BeginRenderPass(
|
||||||
device->driverData,
|
device->driverData,
|
||||||
commandBuffer,
|
commandBuffer,
|
||||||
renderArea,
|
renderArea,
|
||||||
pColorAttachmentInfos,
|
colorAttachmentInfos,
|
||||||
colorAttachmentCount,
|
colorAttachmentCount,
|
||||||
depthStencilAttachmentInfo
|
depthStencilAttachmentInfo
|
||||||
);
|
);
|
||||||
|
|
|
@ -397,7 +397,7 @@ struct Refresh_Device
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
Refresh_Rect *renderArea,
|
Refresh_Rect *renderArea,
|
||||||
Refresh_ColorAttachmentInfo *pColorAttachmentInfos,
|
Refresh_ColorAttachmentInfo *colorAttachmentInfos,
|
||||||
uint32_t colorAttachmentCount,
|
uint32_t colorAttachmentCount,
|
||||||
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
|
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
|
||||||
);
|
);
|
||||||
|
|
|
@ -553,7 +553,7 @@ static void TEMPLATE_BeginRenderPass(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
Refresh_Rect *renderArea,
|
Refresh_Rect *renderArea,
|
||||||
Refresh_ColorAttachmentInfo *pColorAttachmentInfos,
|
Refresh_ColorAttachmentInfo *colorAttachmentInfos,
|
||||||
uint32_t colorAttachmentCount,
|
uint32_t colorAttachmentCount,
|
||||||
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
|
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -998,11 +998,11 @@ static inline VkRenderPass RenderPassHashArray_Fetch(
|
||||||
RenderPassHashArray *arr,
|
RenderPassHashArray *arr,
|
||||||
RenderPassHash *key
|
RenderPassHash *key
|
||||||
) {
|
) {
|
||||||
int32_t i, j;
|
int32_t i;
|
||||||
|
|
||||||
for (i = 0; i < arr->count; i += 1)
|
for (i = 0; i < arr->count; i += 1)
|
||||||
{
|
{
|
||||||
const RenderPassHash *e = &arr->elements[i].key;
|
RenderPassHash *e = &arr->elements[i].key;
|
||||||
|
|
||||||
if (RenderPassHash_Compare(e, key))
|
if (RenderPassHash_Compare(e, key))
|
||||||
{
|
{
|
||||||
|
@ -1029,6 +1029,116 @@ static inline void RenderPassHashArray_Insert(
|
||||||
arr->count += 1;
|
arr->count += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct FramebufferHash
|
||||||
|
{
|
||||||
|
VkImageView colorAttachmentViews[MAX_COLOR_TARGET_BINDINGS];
|
||||||
|
VkImageView colorMultiSampleAttachmentViews[MAX_COLOR_TARGET_BINDINGS];
|
||||||
|
uint32_t colorAttachmentCount;
|
||||||
|
VkImageView depthStencilAttachmentView;
|
||||||
|
uint32_t width;
|
||||||
|
uint32_t height;
|
||||||
|
} FramebufferHash;
|
||||||
|
|
||||||
|
typedef struct FramebufferHashMap
|
||||||
|
{
|
||||||
|
FramebufferHash key;
|
||||||
|
VkFramebuffer value;
|
||||||
|
} FramebufferHashMap;
|
||||||
|
|
||||||
|
typedef struct FramebufferHashArray
|
||||||
|
{
|
||||||
|
FramebufferHashMap *elements;
|
||||||
|
int32_t count;
|
||||||
|
int32_t capacity;
|
||||||
|
} FramebufferHashArray;
|
||||||
|
|
||||||
|
static inline uint8_t FramebufferHash_Compare(
|
||||||
|
FramebufferHash *a,
|
||||||
|
FramebufferHash *b
|
||||||
|
) {
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
if (a->colorAttachmentCount != b->colorAttachmentCount)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < a->colorAttachmentCount; i += 1)
|
||||||
|
{
|
||||||
|
if (a->colorAttachmentViews[i] != b->colorAttachmentViews[i])
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a->colorMultiSampleAttachmentViews[i] != b->colorMultiSampleAttachmentViews[i])
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a->depthStencilAttachmentView != b->depthStencilAttachmentView)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a->width != b->width)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a->height != b->height)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline VkFramebuffer FramebufferHashArray_Fetch(
|
||||||
|
FramebufferHashArray *arr,
|
||||||
|
FramebufferHash *key
|
||||||
|
) {
|
||||||
|
int32_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < arr->count; i += 1)
|
||||||
|
{
|
||||||
|
FramebufferHash *e = &arr->elements[i].key;
|
||||||
|
if (FramebufferHash_Compare(e, key))
|
||||||
|
{
|
||||||
|
return arr->elements[i].value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void FramebufferHashArray_Insert(
|
||||||
|
FramebufferHashArray *arr,
|
||||||
|
FramebufferHash key,
|
||||||
|
VkFramebuffer value
|
||||||
|
) {
|
||||||
|
FramebufferHashMap map;
|
||||||
|
map.key = key;
|
||||||
|
map.value = value;
|
||||||
|
|
||||||
|
EXPAND_ELEMENTS_IF_NEEDED(arr, 4, FramebufferHashMap)
|
||||||
|
|
||||||
|
arr->elements[arr->count] = map;
|
||||||
|
arr->count += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void FramebufferHashArray_Remove(
|
||||||
|
FramebufferHashArray *arr,
|
||||||
|
uint32_t index
|
||||||
|
) {
|
||||||
|
if (index != arr->count - 1)
|
||||||
|
{
|
||||||
|
arr->elements[index] = arr->elements[arr->count - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
arr->count -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Descriptor Set Caches */
|
/* Descriptor Set Caches */
|
||||||
|
|
||||||
struct DescriptorSetCache
|
struct DescriptorSetCache
|
||||||
|
@ -1424,6 +1534,7 @@ typedef struct VulkanRenderer
|
||||||
GraphicsPipelineLayoutHashTable graphicsPipelineLayoutHashTable;
|
GraphicsPipelineLayoutHashTable graphicsPipelineLayoutHashTable;
|
||||||
ComputePipelineLayoutHashTable computePipelineLayoutHashTable;
|
ComputePipelineLayoutHashTable computePipelineLayoutHashTable;
|
||||||
RenderPassHashArray renderPassHashArray;
|
RenderPassHashArray renderPassHashArray;
|
||||||
|
FramebufferHashArray framebufferHashArray;
|
||||||
|
|
||||||
VkDescriptorPool defaultDescriptorPool;
|
VkDescriptorPool defaultDescriptorPool;
|
||||||
|
|
||||||
|
@ -1454,6 +1565,8 @@ typedef struct VulkanRenderer
|
||||||
SDL_mutex *submitLock;
|
SDL_mutex *submitLock;
|
||||||
SDL_mutex *acquireFenceLock;
|
SDL_mutex *acquireFenceLock;
|
||||||
SDL_mutex *acquireCommandBufferLock;
|
SDL_mutex *acquireCommandBufferLock;
|
||||||
|
SDL_mutex *renderPassFetchLock;
|
||||||
|
SDL_mutex *framebufferFetchLock;
|
||||||
|
|
||||||
#define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \
|
#define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \
|
||||||
vkfntype_##func func;
|
vkfntype_##func func;
|
||||||
|
@ -2419,11 +2532,43 @@ static void VULKAN_INTERNAL_DestroyTexture(
|
||||||
|
|
||||||
static void VULKAN_INTERNAL_DestroyRenderTarget(
|
static void VULKAN_INTERNAL_DestroyRenderTarget(
|
||||||
VulkanRenderer *renderer,
|
VulkanRenderer *renderer,
|
||||||
VulkanRenderTarget *renderTargetTarget
|
VulkanRenderTarget *renderTarget
|
||||||
) {
|
) {
|
||||||
|
int32_t i, j;
|
||||||
|
FramebufferHash *hash;
|
||||||
|
|
||||||
|
SDL_LockMutex(renderer->framebufferFetchLock);
|
||||||
|
|
||||||
|
/* Remove all associated framebuffers */
|
||||||
|
for (i = renderer->framebufferHashArray.count; i >= 0; i -= 1)
|
||||||
|
{
|
||||||
|
hash = &renderer->framebufferHashArray.elements[i].key;
|
||||||
|
|
||||||
|
for (j = 0; j < hash->colorAttachmentCount; j += 1)
|
||||||
|
{
|
||||||
|
if (hash->colorAttachmentViews[i] == renderTarget->view)
|
||||||
|
{
|
||||||
|
renderer->vkDestroyFramebuffer(
|
||||||
|
renderer->logicalDevice,
|
||||||
|
renderer->framebufferHashArray.elements[i].value,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
FramebufferHashArray_Remove(
|
||||||
|
&renderer->framebufferHashArray,
|
||||||
|
i
|
||||||
|
);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_UnlockMutex(renderer->framebufferFetchLock);
|
||||||
|
|
||||||
renderer->vkDestroyImageView(
|
renderer->vkDestroyImageView(
|
||||||
renderer->logicalDevice,
|
renderer->logicalDevice,
|
||||||
renderTargetTarget->view,
|
renderTarget->view,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -2431,15 +2576,15 @@ static void VULKAN_INTERNAL_DestroyRenderTarget(
|
||||||
* so we don't free it here
|
* so we don't free it here
|
||||||
* But the multisampleTexture is!
|
* But the multisampleTexture is!
|
||||||
*/
|
*/
|
||||||
if (renderTargetTarget->multisampleTexture != NULL)
|
if (renderTarget->multisampleTexture != NULL)
|
||||||
{
|
{
|
||||||
VULKAN_INTERNAL_DestroyTexture(
|
VULKAN_INTERNAL_DestroyTexture(
|
||||||
renderer,
|
renderer,
|
||||||
renderTargetTarget->multisampleTexture
|
renderTarget->multisampleTexture
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_free(renderTargetTarget);
|
SDL_free(renderTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VULKAN_INTERNAL_DestroyBuffer(
|
static void VULKAN_INTERNAL_DestroyBuffer(
|
||||||
|
@ -2563,17 +2708,6 @@ static void VULKAN_INTERNAL_DestroySampler(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VULKAN_INTERNAL_DestroyRenderPass(
|
|
||||||
VulkanRenderer *renderer,
|
|
||||||
VkRenderPass renderPass
|
|
||||||
) {
|
|
||||||
renderer->vkDestroyRenderPass(
|
|
||||||
renderer->logicalDevice,
|
|
||||||
renderPass,
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void VULKAN_INTERNAL_DestroySwapchain(
|
static void VULKAN_INTERNAL_DestroySwapchain(
|
||||||
VulkanRenderer* renderer,
|
VulkanRenderer* renderer,
|
||||||
void *windowHandle
|
void *windowHandle
|
||||||
|
@ -4286,6 +4420,8 @@ static void VULKAN_DestroyDevice(
|
||||||
SDL_DestroyMutex(renderer->submitLock);
|
SDL_DestroyMutex(renderer->submitLock);
|
||||||
SDL_DestroyMutex(renderer->acquireFenceLock);
|
SDL_DestroyMutex(renderer->acquireFenceLock);
|
||||||
SDL_DestroyMutex(renderer->acquireCommandBufferLock);
|
SDL_DestroyMutex(renderer->acquireCommandBufferLock);
|
||||||
|
SDL_DestroyMutex(renderer->renderPassFetchLock);
|
||||||
|
SDL_DestroyMutex(renderer->framebufferFetchLock);
|
||||||
|
|
||||||
renderer->vkDestroyDevice(renderer->logicalDevice, NULL);
|
renderer->vkDestroyDevice(renderer->logicalDevice, NULL);
|
||||||
renderer->vkDestroyInstance(renderer->instance, NULL);
|
renderer->vkDestroyInstance(renderer->instance, NULL);
|
||||||
|
@ -4531,9 +4667,7 @@ static void VULKAN_DispatchCompute(
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
||||||
VulkanComputePipeline *computePipeline = vulkanCommandBuffer->currentComputePipeline;
|
VulkanComputePipeline *computePipeline = vulkanCommandBuffer->currentComputePipeline;
|
||||||
|
|
||||||
VulkanBuffer *currentBuffer;
|
|
||||||
VkDescriptorSet descriptorSets[3];
|
VkDescriptorSet descriptorSets[3];
|
||||||
uint32_t i;
|
|
||||||
|
|
||||||
descriptorSets[0] = vulkanCommandBuffer->bufferDescriptorSet;
|
descriptorSets[0] = vulkanCommandBuffer->bufferDescriptorSet;
|
||||||
descriptorSets[1] = vulkanCommandBuffer->imageDescriptorSet;
|
descriptorSets[1] = vulkanCommandBuffer->imageDescriptorSet;
|
||||||
|
@ -4560,7 +4694,7 @@ static void VULKAN_DispatchCompute(
|
||||||
|
|
||||||
static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
||||||
VulkanRenderer *renderer,
|
VulkanRenderer *renderer,
|
||||||
Refresh_ColorAttachmentInfo *pColorAttachmentInfos,
|
Refresh_ColorAttachmentInfo *colorAttachmentInfos,
|
||||||
uint32_t colorAttachmentCount,
|
uint32_t colorAttachmentCount,
|
||||||
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
|
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
|
||||||
) {
|
) {
|
||||||
|
@ -4569,7 +4703,7 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
||||||
VkAttachmentReference colorAttachmentReferences[MAX_COLOR_TARGET_BINDINGS];
|
VkAttachmentReference colorAttachmentReferences[MAX_COLOR_TARGET_BINDINGS];
|
||||||
VkAttachmentReference resolveReferences[MAX_COLOR_TARGET_BINDINGS + 1];
|
VkAttachmentReference resolveReferences[MAX_COLOR_TARGET_BINDINGS + 1];
|
||||||
VkAttachmentReference depthStencilAttachmentReference;
|
VkAttachmentReference depthStencilAttachmentReference;
|
||||||
VkRenderPassCreateInfo vkRenderPassCreateInfo;
|
VkRenderPassCreateInfo renderPassCreateInfo;
|
||||||
VkSubpassDescription subpass;
|
VkSubpassDescription subpass;
|
||||||
VkRenderPass renderPass;
|
VkRenderPass renderPass;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
@ -4584,7 +4718,7 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
||||||
|
|
||||||
for (i = 0; i < colorAttachmentCount; i += 1)
|
for (i = 0; i < colorAttachmentCount; i += 1)
|
||||||
{
|
{
|
||||||
colorTarget = (VulkanRenderTarget*) pColorAttachmentInfos[attachmentDescriptionCount].pRenderTarget;
|
colorTarget = (VulkanRenderTarget*) colorAttachmentInfos[attachmentDescriptionCount].pRenderTarget;
|
||||||
|
|
||||||
if (colorTarget->multisampleCount > VK_SAMPLE_COUNT_1_BIT)
|
if (colorTarget->multisampleCount > VK_SAMPLE_COUNT_1_BIT)
|
||||||
{
|
{
|
||||||
|
@ -4597,10 +4731,10 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
||||||
attachmentDescriptions[attachmentDescriptionCount].samples =
|
attachmentDescriptions[attachmentDescriptionCount].samples =
|
||||||
VK_SAMPLE_COUNT_1_BIT;
|
VK_SAMPLE_COUNT_1_BIT;
|
||||||
attachmentDescriptions[attachmentDescriptionCount].loadOp = RefreshToVK_LoadOp[
|
attachmentDescriptions[attachmentDescriptionCount].loadOp = RefreshToVK_LoadOp[
|
||||||
pColorAttachmentInfos[i].loadOp
|
colorAttachmentInfos[i].loadOp
|
||||||
];
|
];
|
||||||
attachmentDescriptions[attachmentDescriptionCount].storeOp = RefreshToVK_StoreOp[
|
attachmentDescriptions[attachmentDescriptionCount].storeOp = RefreshToVK_StoreOp[
|
||||||
pColorAttachmentInfos[i].storeOp
|
colorAttachmentInfos[i].storeOp
|
||||||
];
|
];
|
||||||
attachmentDescriptions[attachmentDescriptionCount].stencilLoadOp =
|
attachmentDescriptions[attachmentDescriptionCount].stencilLoadOp =
|
||||||
VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
@ -4623,10 +4757,10 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
||||||
attachmentDescriptions[attachmentDescriptionCount].format = colorTarget->texture->format;
|
attachmentDescriptions[attachmentDescriptionCount].format = colorTarget->texture->format;
|
||||||
attachmentDescriptions[attachmentDescriptionCount].samples = colorTarget->multisampleCount;
|
attachmentDescriptions[attachmentDescriptionCount].samples = colorTarget->multisampleCount;
|
||||||
attachmentDescriptions[attachmentDescriptionCount].loadOp = RefreshToVK_LoadOp[
|
attachmentDescriptions[attachmentDescriptionCount].loadOp = RefreshToVK_LoadOp[
|
||||||
pColorAttachmentInfos[i].loadOp
|
colorAttachmentInfos[i].loadOp
|
||||||
];
|
];
|
||||||
attachmentDescriptions[attachmentDescriptionCount].storeOp = RefreshToVK_StoreOp[
|
attachmentDescriptions[attachmentDescriptionCount].storeOp = RefreshToVK_StoreOp[
|
||||||
pColorAttachmentInfos[i].storeOp
|
colorAttachmentInfos[i].storeOp
|
||||||
];
|
];
|
||||||
attachmentDescriptions[attachmentDescriptionCount].stencilLoadOp =
|
attachmentDescriptions[attachmentDescriptionCount].stencilLoadOp =
|
||||||
VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
@ -4652,10 +4786,10 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
||||||
attachmentDescriptions[attachmentDescriptionCount].samples =
|
attachmentDescriptions[attachmentDescriptionCount].samples =
|
||||||
VK_SAMPLE_COUNT_1_BIT;
|
VK_SAMPLE_COUNT_1_BIT;
|
||||||
attachmentDescriptions[attachmentDescriptionCount].loadOp = RefreshToVK_LoadOp[
|
attachmentDescriptions[attachmentDescriptionCount].loadOp = RefreshToVK_LoadOp[
|
||||||
pColorAttachmentInfos[i].loadOp
|
colorAttachmentInfos[i].loadOp
|
||||||
];
|
];
|
||||||
attachmentDescriptions[attachmentDescriptionCount].storeOp = RefreshToVK_StoreOp[
|
attachmentDescriptions[attachmentDescriptionCount].storeOp = RefreshToVK_StoreOp[
|
||||||
pColorAttachmentInfos[i].storeOp
|
colorAttachmentInfos[i].storeOp
|
||||||
];
|
];
|
||||||
attachmentDescriptions[attachmentDescriptionCount].stencilLoadOp =
|
attachmentDescriptions[attachmentDescriptionCount].stencilLoadOp =
|
||||||
VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
@ -4666,12 +4800,12 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
||||||
attachmentDescriptions[attachmentDescriptionCount].finalLayout =
|
attachmentDescriptions[attachmentDescriptionCount].finalLayout =
|
||||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
|
||||||
attachmentDescriptionCount += 1;
|
|
||||||
|
|
||||||
colorAttachmentReferences[colorAttachmentReferenceCount].attachment = i;
|
colorAttachmentReferences[colorAttachmentReferenceCount].attachment = attachmentDescriptionCount;
|
||||||
colorAttachmentReferences[colorAttachmentReferenceCount].layout =
|
colorAttachmentReferences[colorAttachmentReferenceCount].layout =
|
||||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
|
||||||
|
attachmentDescriptionCount += 1;
|
||||||
colorAttachmentReferenceCount += 1;
|
colorAttachmentReferenceCount += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4733,32 +4867,207 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
||||||
subpass.pResolveAttachments = NULL;
|
subpass.pResolveAttachments = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
vkRenderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
||||||
vkRenderPassCreateInfo.pNext = NULL;
|
renderPassCreateInfo.pNext = NULL;
|
||||||
vkRenderPassCreateInfo.flags = 0;
|
renderPassCreateInfo.flags = 0;
|
||||||
vkRenderPassCreateInfo.pAttachments = attachmentDescriptions;
|
renderPassCreateInfo.pAttachments = attachmentDescriptions;
|
||||||
vkRenderPassCreateInfo.attachmentCount = attachmentDescriptionCount;
|
renderPassCreateInfo.attachmentCount = attachmentDescriptionCount;
|
||||||
vkRenderPassCreateInfo.subpassCount = 1;
|
renderPassCreateInfo.subpassCount = 1;
|
||||||
vkRenderPassCreateInfo.pSubpasses = &subpass;
|
renderPassCreateInfo.pSubpasses = &subpass;
|
||||||
vkRenderPassCreateInfo.dependencyCount = 0;
|
renderPassCreateInfo.dependencyCount = 0;
|
||||||
vkRenderPassCreateInfo.pDependencies = NULL;
|
renderPassCreateInfo.pDependencies = NULL;
|
||||||
|
|
||||||
vulkanResult = renderer->vkCreateRenderPass(
|
vulkanResult = renderer->vkCreateRenderPass(
|
||||||
renderer->logicalDevice,
|
renderer->logicalDevice,
|
||||||
&vkRenderPassCreateInfo,
|
&renderPassCreateInfo,
|
||||||
NULL,
|
NULL,
|
||||||
&renderPass
|
&renderPass
|
||||||
);
|
);
|
||||||
|
|
||||||
if (vulkanResult != VK_SUCCESS)
|
if (vulkanResult != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
|
renderPass = VK_NULL_HANDLE;
|
||||||
LogVulkanResultAsError("vkCreateRenderPass", vulkanResult);
|
LogVulkanResultAsError("vkCreateRenderPass", vulkanResult);
|
||||||
return VK_NULL_HANDLE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return renderPass;
|
return renderPass;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VkRenderPass VULKAN_INTERNAL_CreateTransientRenderPass(
|
||||||
|
VulkanRenderer *renderer,
|
||||||
|
Refresh_GraphicsPipelineAttachmentInfo attachmentInfo
|
||||||
|
) {
|
||||||
|
VkAttachmentDescription attachmentDescriptions[2 * MAX_COLOR_TARGET_BINDINGS + 1];
|
||||||
|
VkAttachmentReference colorAttachmentReferences[MAX_COLOR_TARGET_BINDINGS];
|
||||||
|
VkAttachmentReference resolveReferences[MAX_COLOR_TARGET_BINDINGS + 1];
|
||||||
|
VkAttachmentReference depthStencilAttachmentReference;
|
||||||
|
Refresh_ColorAttachmentDescription attachmentDescription;
|
||||||
|
VkSubpassDescription subpass;
|
||||||
|
VkRenderPassCreateInfo renderPassCreateInfo;
|
||||||
|
VkRenderPass renderPass;
|
||||||
|
VkResult result;
|
||||||
|
|
||||||
|
uint32_t multisampling = 0;
|
||||||
|
uint32_t attachmentDescriptionCount = 0;
|
||||||
|
uint32_t colorAttachmentReferenceCount = 0;
|
||||||
|
uint32_t resolveReferenceCount = 0;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < attachmentInfo.colorAttachmentCount; i += 1)
|
||||||
|
{
|
||||||
|
attachmentDescription = attachmentInfo.colorAttachmentDescriptions[i];
|
||||||
|
|
||||||
|
if (attachmentDescription.sampleCount > REFRESH_SAMPLECOUNT_1)
|
||||||
|
{
|
||||||
|
multisampling = 1;
|
||||||
|
|
||||||
|
/* Resolve attachment and multisample attachment */
|
||||||
|
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].flags = 0;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].format = RefreshToVK_SurfaceFormat[
|
||||||
|
attachmentDescription.format
|
||||||
|
];
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].samples = VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
|
||||||
|
resolveReferences[resolveReferenceCount].attachment = attachmentDescriptionCount;
|
||||||
|
resolveReferences[resolveReferenceCount].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
|
||||||
|
attachmentDescriptionCount += 1;
|
||||||
|
resolveReferenceCount += 1;
|
||||||
|
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].flags = 0;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].format = RefreshToVK_SurfaceFormat[
|
||||||
|
attachmentDescription.format
|
||||||
|
];
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].samples = VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
|
||||||
|
colorAttachmentReferences[colorAttachmentReferenceCount].attachment =
|
||||||
|
attachmentDescriptionCount;
|
||||||
|
colorAttachmentReferences[colorAttachmentReferenceCount].layout =
|
||||||
|
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
|
||||||
|
attachmentDescriptionCount += 1;
|
||||||
|
colorAttachmentReferenceCount += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].flags = 0;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].format = RefreshToVK_SurfaceFormat[
|
||||||
|
attachmentDescription.format
|
||||||
|
];
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].samples =
|
||||||
|
VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].loadOp =
|
||||||
|
VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].storeOp =
|
||||||
|
VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].stencilLoadOp =
|
||||||
|
VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].stencilStoreOp =
|
||||||
|
VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].initialLayout =
|
||||||
|
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].finalLayout =
|
||||||
|
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
|
||||||
|
|
||||||
|
colorAttachmentReferences[colorAttachmentReferenceCount].attachment = attachmentDescriptionCount;
|
||||||
|
colorAttachmentReferences[colorAttachmentReferenceCount].layout =
|
||||||
|
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
|
||||||
|
attachmentDescriptionCount += 1;
|
||||||
|
colorAttachmentReferenceCount += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
||||||
|
subpass.flags = 0;
|
||||||
|
subpass.inputAttachmentCount = 0;
|
||||||
|
subpass.pInputAttachments = NULL;
|
||||||
|
subpass.colorAttachmentCount = attachmentInfo.colorAttachmentCount;
|
||||||
|
subpass.pColorAttachments = colorAttachmentReferences;
|
||||||
|
subpass.preserveAttachmentCount = 0;
|
||||||
|
subpass.pPreserveAttachments = NULL;
|
||||||
|
|
||||||
|
if (attachmentInfo.hasDepthStencilAttachment)
|
||||||
|
{
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].flags = 0;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].format = RefreshToVK_SurfaceFormat[
|
||||||
|
attachmentInfo.depthStencilFormat
|
||||||
|
];
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].samples =
|
||||||
|
VK_SAMPLE_COUNT_1_BIT; /* FIXME: do these take multisamples? */
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].initialLayout =
|
||||||
|
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||||
|
attachmentDescriptions[attachmentDescriptionCount].finalLayout =
|
||||||
|
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||||
|
|
||||||
|
depthStencilAttachmentReference.attachment =
|
||||||
|
attachmentDescriptionCount;
|
||||||
|
depthStencilAttachmentReference.layout =
|
||||||
|
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||||
|
|
||||||
|
subpass.pDepthStencilAttachment =
|
||||||
|
&depthStencilAttachmentReference;
|
||||||
|
|
||||||
|
attachmentDescriptionCount += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
subpass.pDepthStencilAttachment = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (multisampling)
|
||||||
|
{
|
||||||
|
subpass.pResolveAttachments = resolveReferences;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
subpass.pResolveAttachments = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
||||||
|
renderPassCreateInfo.pNext = NULL;
|
||||||
|
renderPassCreateInfo.flags = 0;
|
||||||
|
renderPassCreateInfo.pAttachments = attachmentDescriptions;
|
||||||
|
renderPassCreateInfo.attachmentCount = attachmentDescriptionCount;
|
||||||
|
renderPassCreateInfo.subpassCount = 1;
|
||||||
|
renderPassCreateInfo.pSubpasses = &subpass;
|
||||||
|
renderPassCreateInfo.dependencyCount = 0;
|
||||||
|
renderPassCreateInfo.pDependencies = NULL;
|
||||||
|
|
||||||
|
result = renderer->vkCreateRenderPass(
|
||||||
|
renderer->logicalDevice,
|
||||||
|
&renderPassCreateInfo,
|
||||||
|
NULL,
|
||||||
|
&renderPass
|
||||||
|
);
|
||||||
|
|
||||||
|
if (result != VK_SUCCESS)
|
||||||
|
{
|
||||||
|
renderPass = VK_NULL_HANDLE;
|
||||||
|
LogVulkanResultAsError("vkCreateRenderPass", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
return renderPass;
|
||||||
|
}
|
||||||
|
|
||||||
static Refresh_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
static Refresh_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_GraphicsPipelineCreateInfo *pipelineCreateInfo
|
Refresh_GraphicsPipelineCreateInfo *pipelineCreateInfo
|
||||||
|
@ -4797,6 +5106,13 @@ static Refresh_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
||||||
|
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
|
|
||||||
|
/* Create a "compatible" render pass */
|
||||||
|
|
||||||
|
VkRenderPass transientRenderPass = VULKAN_INTERNAL_CreateTransientRenderPass(
|
||||||
|
renderer,
|
||||||
|
pipelineCreateInfo->attachmentInfo
|
||||||
|
);
|
||||||
|
|
||||||
/* Shader stages */
|
/* Shader stages */
|
||||||
|
|
||||||
shaderStageCreateInfos[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
shaderStageCreateInfos[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||||
|
@ -5074,7 +5390,7 @@ static Refresh_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
||||||
vkPipelineCreateInfo.pColorBlendState = &colorBlendStateCreateInfo;
|
vkPipelineCreateInfo.pColorBlendState = &colorBlendStateCreateInfo;
|
||||||
vkPipelineCreateInfo.pDynamicState = VK_NULL_HANDLE;
|
vkPipelineCreateInfo.pDynamicState = VK_NULL_HANDLE;
|
||||||
vkPipelineCreateInfo.layout = graphicsPipeline->pipelineLayout->pipelineLayout;
|
vkPipelineCreateInfo.layout = graphicsPipeline->pipelineLayout->pipelineLayout;
|
||||||
vkPipelineCreateInfo.renderPass = (VkRenderPass) pipelineCreateInfo->renderPass;
|
vkPipelineCreateInfo.renderPass = transientRenderPass;
|
||||||
vkPipelineCreateInfo.subpass = 0;
|
vkPipelineCreateInfo.subpass = 0;
|
||||||
vkPipelineCreateInfo.basePipelineHandle = VK_NULL_HANDLE;
|
vkPipelineCreateInfo.basePipelineHandle = VK_NULL_HANDLE;
|
||||||
vkPipelineCreateInfo.basePipelineIndex = 0;
|
vkPipelineCreateInfo.basePipelineIndex = 0;
|
||||||
|
@ -5095,6 +5411,12 @@ static Refresh_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
||||||
SDL_stack_free(scissors);
|
SDL_stack_free(scissors);
|
||||||
SDL_stack_free(colorBlendAttachmentStates);
|
SDL_stack_free(colorBlendAttachmentStates);
|
||||||
|
|
||||||
|
renderer->vkDestroyRenderPass(
|
||||||
|
renderer->logicalDevice,
|
||||||
|
transientRenderPass,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
if (vulkanResult != VK_SUCCESS)
|
if (vulkanResult != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
LogVulkanResultAsError("vkCreateGraphicsPipelines", vulkanResult);
|
LogVulkanResultAsError("vkCreateGraphicsPipelines", vulkanResult);
|
||||||
|
@ -5325,71 +5647,6 @@ static Refresh_Sampler* VULKAN_CreateSampler(
|
||||||
return (Refresh_Sampler*) sampler;
|
return (Refresh_Sampler*) sampler;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VkFramebuffer VULKAN_INTERNAL_CreateFramebuffer(
|
|
||||||
Refresh_Renderer *driverData,
|
|
||||||
VkRenderPass renderPass,
|
|
||||||
uint32_t width,
|
|
||||||
uint32_t height,
|
|
||||||
VulkanRenderTarget **colorTargets,
|
|
||||||
uint32_t colorTargetCount,
|
|
||||||
VulkanRenderTarget *depthStencilTarget /* Can be NULL */
|
|
||||||
) {
|
|
||||||
VkResult vulkanResult;
|
|
||||||
VkFramebuffer framebuffer;
|
|
||||||
VkFramebufferCreateInfo vkFramebufferCreateInfo;
|
|
||||||
|
|
||||||
VkImageView *imageViews;
|
|
||||||
uint32_t colorAttachmentCount = colorTargetCount;
|
|
||||||
uint32_t attachmentCount = colorAttachmentCount;
|
|
||||||
uint32_t i;
|
|
||||||
|
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
|
||||||
|
|
||||||
if (depthStencilTarget != NULL)
|
|
||||||
{
|
|
||||||
attachmentCount += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
imageViews = SDL_stack_alloc(VkImageView, attachmentCount);
|
|
||||||
|
|
||||||
for (i = 0; i < colorAttachmentCount; i += 1)
|
|
||||||
{
|
|
||||||
imageViews[i] = ((VulkanRenderTarget*)colorTargets[i])->view;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (depthStencilTarget != NULL)
|
|
||||||
{
|
|
||||||
imageViews[colorAttachmentCount] = ((VulkanRenderTarget*)depthStencilTarget)->view;
|
|
||||||
}
|
|
||||||
|
|
||||||
vkFramebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
|
|
||||||
vkFramebufferCreateInfo.pNext = NULL;
|
|
||||||
vkFramebufferCreateInfo.flags = 0;
|
|
||||||
vkFramebufferCreateInfo.renderPass = renderPass;
|
|
||||||
vkFramebufferCreateInfo.attachmentCount = attachmentCount;
|
|
||||||
vkFramebufferCreateInfo.pAttachments = imageViews;
|
|
||||||
vkFramebufferCreateInfo.width = width;
|
|
||||||
vkFramebufferCreateInfo.height = height;
|
|
||||||
vkFramebufferCreateInfo.layers = 1;
|
|
||||||
|
|
||||||
vulkanResult = renderer->vkCreateFramebuffer(
|
|
||||||
renderer->logicalDevice,
|
|
||||||
&vkFramebufferCreateInfo,
|
|
||||||
NULL,
|
|
||||||
&framebuffer
|
|
||||||
);
|
|
||||||
|
|
||||||
SDL_stack_free(imageViews);
|
|
||||||
|
|
||||||
if (vulkanResult != VK_SUCCESS)
|
|
||||||
{
|
|
||||||
LogVulkanResultAsError("vkCreateFramebuffer", vulkanResult);
|
|
||||||
return VK_NULL_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return framebuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Refresh_ShaderModule* VULKAN_CreateShaderModule(
|
static Refresh_ShaderModule* VULKAN_CreateShaderModule(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo
|
Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo
|
||||||
|
@ -7072,7 +7329,7 @@ static void VULKAN_QueueDestroyGraphicsPipeline(
|
||||||
|
|
||||||
static VkRenderPass VULKAN_INTERNAL_FetchRenderPass(
|
static VkRenderPass VULKAN_INTERNAL_FetchRenderPass(
|
||||||
VulkanRenderer *renderer,
|
VulkanRenderer *renderer,
|
||||||
Refresh_ColorAttachmentInfo *pColorAttachmentInfos,
|
Refresh_ColorAttachmentInfo *colorAttachmentInfos,
|
||||||
uint32_t colorAttachmentCount,
|
uint32_t colorAttachmentCount,
|
||||||
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
|
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
|
||||||
) {
|
) {
|
||||||
|
@ -7080,11 +7337,13 @@ static VkRenderPass VULKAN_INTERNAL_FetchRenderPass(
|
||||||
RenderPassHash hash;
|
RenderPassHash hash;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
|
||||||
|
SDL_LockMutex(renderer->renderPassFetchLock);
|
||||||
|
|
||||||
for (i = 0; i < colorAttachmentCount; i += 1)
|
for (i = 0; i < colorAttachmentCount; i += 1)
|
||||||
{
|
{
|
||||||
hash.colorTargetDescriptions[i].clearColor = pColorAttachmentInfos[i].clearColor;
|
hash.colorTargetDescriptions[i].clearColor = colorAttachmentInfos[i].clearColor;
|
||||||
hash.colorTargetDescriptions[i].loadOp = pColorAttachmentInfos[i].loadOp;
|
hash.colorTargetDescriptions[i].loadOp = colorAttachmentInfos[i].loadOp;
|
||||||
hash.colorTargetDescriptions[i].storeOp = pColorAttachmentInfos[i].storeOp;
|
hash.colorTargetDescriptions[i].storeOp = colorAttachmentInfos[i].storeOp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (depthStencilAttachmentInfo == NULL)
|
if (depthStencilAttachmentInfo == NULL)
|
||||||
|
@ -7109,30 +7368,170 @@ static VkRenderPass VULKAN_INTERNAL_FetchRenderPass(
|
||||||
|
|
||||||
if (renderPass != VK_NULL_HANDLE)
|
if (renderPass != VK_NULL_HANDLE)
|
||||||
{
|
{
|
||||||
|
SDL_UnlockMutex(renderer->renderPassFetchLock);
|
||||||
return renderPass;
|
return renderPass;
|
||||||
}
|
}
|
||||||
|
|
||||||
renderPass = VULKAN_INTERNAL_CreateRenderPass(
|
renderPass = VULKAN_INTERNAL_CreateRenderPass(
|
||||||
renderer,
|
renderer,
|
||||||
pColorAttachmentInfos,
|
colorAttachmentInfos,
|
||||||
colorAttachmentCount,
|
colorAttachmentCount,
|
||||||
depthStencilAttachmentInfo
|
depthStencilAttachmentInfo
|
||||||
);
|
);
|
||||||
|
|
||||||
RenderPassHashArray_Insert(
|
if (renderPass != VK_NULL_HANDLE)
|
||||||
&renderer->renderPassHashArray,
|
{
|
||||||
hash,
|
RenderPassHashArray_Insert(
|
||||||
renderPass
|
&renderer->renderPassHashArray,
|
||||||
|
hash,
|
||||||
|
renderPass
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_UnlockMutex(renderer->renderPassFetchLock);
|
||||||
|
return renderPass;
|
||||||
|
}
|
||||||
|
|
||||||
|
static VkFramebuffer VULKAN_INTERNAL_FetchFramebuffer(
|
||||||
|
VulkanRenderer *renderer,
|
||||||
|
VkRenderPass renderPass,
|
||||||
|
Refresh_ColorAttachmentInfo *colorAttachmentInfos,
|
||||||
|
uint32_t colorAttachmentCount,
|
||||||
|
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
|
||||||
|
) {
|
||||||
|
VkFramebuffer framebuffer;
|
||||||
|
VkFramebufferCreateInfo framebufferInfo;
|
||||||
|
VkResult result;
|
||||||
|
VkImageView imageViewAttachments[2 * MAX_COLOR_TARGET_BINDINGS + 1];
|
||||||
|
FramebufferHash hash;
|
||||||
|
VulkanRenderTarget *renderTarget;
|
||||||
|
uint32_t attachmentCount = 0;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
SDL_LockMutex(renderer->framebufferFetchLock);
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_COLOR_TARGET_BINDINGS; i += 1)
|
||||||
|
{
|
||||||
|
hash.colorAttachmentViews[i] = VK_NULL_HANDLE;
|
||||||
|
hash.colorMultiSampleAttachmentViews[i] = VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
hash.colorAttachmentCount = colorAttachmentCount;
|
||||||
|
|
||||||
|
for (i = 0; i < colorAttachmentCount; i += 1)
|
||||||
|
{
|
||||||
|
renderTarget = (VulkanRenderTarget*) colorAttachmentInfos[i].pRenderTarget;
|
||||||
|
|
||||||
|
hash.colorAttachmentViews[i] = (
|
||||||
|
renderTarget->view
|
||||||
|
);
|
||||||
|
|
||||||
|
hash.colorMultiSampleAttachmentViews[i] = (
|
||||||
|
renderTarget->multisampleTexture->view
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (depthStencilAttachmentInfo == NULL)
|
||||||
|
{
|
||||||
|
hash.depthStencilAttachmentView = VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hash.depthStencilAttachmentView = ((VulkanRenderTarget*)depthStencilAttachmentInfo->pDepthStencilTarget)->view;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (colorAttachmentCount > 0)
|
||||||
|
{
|
||||||
|
renderTarget = (VulkanRenderTarget*) colorAttachmentInfos[0].pRenderTarget;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
renderTarget = (VulkanRenderTarget*) depthStencilAttachmentInfo->pDepthStencilTarget;
|
||||||
|
}
|
||||||
|
|
||||||
|
hash.width = renderTarget->texture->dimensions.width;
|
||||||
|
hash.height = renderTarget->texture->dimensions.height;
|
||||||
|
|
||||||
|
framebuffer = FramebufferHashArray_Fetch(
|
||||||
|
&renderer->framebufferHashArray,
|
||||||
|
&hash
|
||||||
);
|
);
|
||||||
|
|
||||||
return renderPass;
|
if (framebuffer != VK_NULL_HANDLE)
|
||||||
|
{
|
||||||
|
SDL_UnlockMutex(renderer->framebufferFetchLock);
|
||||||
|
return framebuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create a new framebuffer */
|
||||||
|
|
||||||
|
for (i = 0; i < colorAttachmentCount; i += 1)
|
||||||
|
{
|
||||||
|
renderTarget = (VulkanRenderTarget*) colorAttachmentInfos[i].pRenderTarget;
|
||||||
|
|
||||||
|
imageViewAttachments[attachmentCount] =
|
||||||
|
renderTarget->view;
|
||||||
|
|
||||||
|
attachmentCount += 1;
|
||||||
|
|
||||||
|
if (renderTarget->multisampleCount > VK_SAMPLE_COUNT_1_BIT)
|
||||||
|
{
|
||||||
|
imageViewAttachments[attachmentCount] =
|
||||||
|
renderTarget->multisampleTexture->view;
|
||||||
|
|
||||||
|
attachmentCount += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (depthStencilAttachmentInfo != NULL)
|
||||||
|
{
|
||||||
|
renderTarget = (VulkanRenderTarget*) depthStencilAttachmentInfo->pDepthStencilTarget;
|
||||||
|
|
||||||
|
imageViewAttachments[attachmentCount] = renderTarget->view;
|
||||||
|
|
||||||
|
attachmentCount += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
|
||||||
|
framebufferInfo.pNext = NULL;
|
||||||
|
framebufferInfo.flags = 0;
|
||||||
|
framebufferInfo.renderPass = renderPass;
|
||||||
|
framebufferInfo.attachmentCount = attachmentCount;
|
||||||
|
framebufferInfo.pAttachments = imageViewAttachments;
|
||||||
|
framebufferInfo.width = hash.width;
|
||||||
|
framebufferInfo.height = hash.height;
|
||||||
|
framebufferInfo.layers = 1;
|
||||||
|
|
||||||
|
result = renderer->vkCreateFramebuffer(
|
||||||
|
renderer->logicalDevice,
|
||||||
|
&framebufferInfo,
|
||||||
|
NULL,
|
||||||
|
&framebuffer
|
||||||
|
);
|
||||||
|
|
||||||
|
if (result == VK_SUCCESS)
|
||||||
|
{
|
||||||
|
FramebufferHashArray_Insert(
|
||||||
|
&renderer->framebufferHashArray,
|
||||||
|
hash,
|
||||||
|
framebuffer
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogVulkanResultAsError("vkCreateFramebuffer", result);
|
||||||
|
framebuffer = VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_UnlockMutex(renderer->framebufferFetchLock);
|
||||||
|
return framebuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VULKAN_BeginRenderPass(
|
static void VULKAN_BeginRenderPass(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
Refresh_Rect *renderArea,
|
Refresh_Rect *renderArea,
|
||||||
Refresh_ColorAttachmentInfo *pColorAttachmentInfos,
|
Refresh_ColorAttachmentInfo *colorAttachmentInfos,
|
||||||
uint32_t colorAttachmentCount,
|
uint32_t colorAttachmentCount,
|
||||||
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
|
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
|
||||||
) {
|
) {
|
||||||
|
@ -7141,27 +7540,38 @@ static void VULKAN_BeginRenderPass(
|
||||||
VkRenderPass renderPass;
|
VkRenderPass renderPass;
|
||||||
VkFramebuffer framebuffer;
|
VkFramebuffer framebuffer;
|
||||||
|
|
||||||
VulkanRenderTarget *colorTarget;
|
|
||||||
VulkanRenderTarget *depthStencilTarget;
|
VulkanRenderTarget *depthStencilTarget;
|
||||||
VkClearValue *clearValues;
|
VkClearValue *clearValues;
|
||||||
uint32_t clearCount = colorAttachmentCount;
|
uint32_t clearCount = colorAttachmentCount;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
VkImageAspectFlags depthAspectFlags;
|
VkImageAspectFlags depthAspectFlags;
|
||||||
|
|
||||||
|
if (colorAttachmentCount == 0 && depthStencilAttachmentInfo == NULL)
|
||||||
|
{
|
||||||
|
Refresh_LogError("Render pass must have at least one render target!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
renderPass = VULKAN_INTERNAL_FetchRenderPass(
|
renderPass = VULKAN_INTERNAL_FetchRenderPass(
|
||||||
renderer,
|
renderer,
|
||||||
pColorAttachmentInfos,
|
colorAttachmentInfos,
|
||||||
colorAttachmentCount,
|
colorAttachmentCount,
|
||||||
depthStencilAttachmentInfo
|
depthStencilAttachmentInfo
|
||||||
);
|
);
|
||||||
|
|
||||||
framebuffer = VULKAN_INTERNAL_FetchFramebuffer(renderer);
|
framebuffer = VULKAN_INTERNAL_FetchFramebuffer(
|
||||||
|
renderer,
|
||||||
|
renderPass,
|
||||||
|
colorAttachmentInfos,
|
||||||
|
colorAttachmentCount,
|
||||||
|
depthStencilAttachmentInfo
|
||||||
|
);
|
||||||
|
|
||||||
/* Layout transitions */
|
/* Layout transitions */
|
||||||
|
|
||||||
for (i = 0; i < colorAttachmentCount; i += 1)
|
for (i = 0; i < colorAttachmentCount; i += 1)
|
||||||
{
|
{
|
||||||
VulkanRenderTarget *colorTarget = (VulkanRenderTarget*) pColorAttachmentInfos->pRenderTarget;
|
VulkanRenderTarget *colorTarget = (VulkanRenderTarget*) colorAttachmentInfos->pRenderTarget;
|
||||||
|
|
||||||
VULKAN_INTERNAL_ImageMemoryBarrier(
|
VULKAN_INTERNAL_ImageMemoryBarrier(
|
||||||
renderer,
|
renderer,
|
||||||
|
@ -7212,10 +7622,10 @@ static void VULKAN_BeginRenderPass(
|
||||||
|
|
||||||
for (i = 0; i < colorAttachmentCount; i += 1)
|
for (i = 0; i < colorAttachmentCount; i += 1)
|
||||||
{
|
{
|
||||||
clearValues[i].color.float32[0] = pColorAttachmentInfos[i].clearColor.x;
|
clearValues[i].color.float32[0] = colorAttachmentInfos[i].clearColor.x;
|
||||||
clearValues[i].color.float32[1] = pColorAttachmentInfos[i].clearColor.y;
|
clearValues[i].color.float32[1] = colorAttachmentInfos[i].clearColor.y;
|
||||||
clearValues[i].color.float32[2] = pColorAttachmentInfos[i].clearColor.z;
|
clearValues[i].color.float32[2] = colorAttachmentInfos[i].clearColor.z;
|
||||||
clearValues[i].color.float32[3] = pColorAttachmentInfos[i].clearColor.w;
|
clearValues[i].color.float32[3] = colorAttachmentInfos[i].clearColor.w;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (depthStencilAttachmentInfo != NULL)
|
if (depthStencilAttachmentInfo != NULL)
|
||||||
|
@ -7255,9 +7665,6 @@ static void VULKAN_EndRenderPass(
|
||||||
) {
|
) {
|
||||||
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
||||||
VulkanTexture *currentTexture;
|
|
||||||
VkImageAspectFlags depthAspectFlags;
|
|
||||||
uint32_t i;
|
|
||||||
|
|
||||||
renderer->vkCmdEndRenderPass(
|
renderer->vkCmdEndRenderPass(
|
||||||
vulkanCommandBuffer->commandBuffer
|
vulkanCommandBuffer->commandBuffer
|
||||||
|
@ -7797,7 +8204,6 @@ static Refresh_CommandBuffer* VULKAN_AcquireCommandBuffer(
|
||||||
uint8_t fixed
|
uint8_t fixed
|
||||||
) {
|
) {
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
uint32_t i;
|
|
||||||
|
|
||||||
SDL_threadID threadID = SDL_ThreadID();
|
SDL_threadID threadID = SDL_ThreadID();
|
||||||
|
|
||||||
|
@ -9245,6 +9651,8 @@ static Refresh_Device* VULKAN_CreateDevice(
|
||||||
renderer->submitLock = SDL_CreateMutex();
|
renderer->submitLock = SDL_CreateMutex();
|
||||||
renderer->acquireFenceLock = SDL_CreateMutex();
|
renderer->acquireFenceLock = SDL_CreateMutex();
|
||||||
renderer->acquireCommandBufferLock = SDL_CreateMutex();
|
renderer->acquireCommandBufferLock = SDL_CreateMutex();
|
||||||
|
renderer->renderPassFetchLock = SDL_CreateMutex();
|
||||||
|
renderer->framebufferFetchLock = SDL_CreateMutex();
|
||||||
|
|
||||||
/* Create fence lists */
|
/* Create fence lists */
|
||||||
|
|
||||||
|
@ -9552,6 +9960,14 @@ static Refresh_Device* VULKAN_CreateDevice(
|
||||||
renderer->descriptorSetLayoutHashTable.buckets[i].capacity = 0;
|
renderer->descriptorSetLayoutHashTable.buckets[i].capacity = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderer->renderPassHashArray.elements = NULL;
|
||||||
|
renderer->renderPassHashArray.count = 0;
|
||||||
|
renderer->renderPassHashArray.capacity = 0;
|
||||||
|
|
||||||
|
renderer->framebufferHashArray.elements = NULL;
|
||||||
|
renderer->framebufferHashArray.count = 0;
|
||||||
|
renderer->framebufferHashArray.capacity = 0;
|
||||||
|
|
||||||
/* Initialize transfer buffer pool */
|
/* Initialize transfer buffer pool */
|
||||||
renderer->transferBufferPool.lock = SDL_CreateMutex();
|
renderer->transferBufferPool.lock = SDL_CreateMutex();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue