forked from MoonsideGames/Refresh
render targets
parent
a6f13dff8d
commit
ba9447ae4c
|
@ -376,6 +376,12 @@ typedef struct REFRESH_Viewport
|
|||
float maxDepth;
|
||||
} REFRESH_Viewport;
|
||||
|
||||
typedef struct REFRESH_TextureSlice
|
||||
{
|
||||
REFRESH_Texture *texture;
|
||||
uint32_t layer; /* 0-5 for cube, or z-slice for 3D */
|
||||
} REFRESH_TextureSlice;
|
||||
|
||||
/* State structures */
|
||||
|
||||
typedef struct REFRESH_SamplerStateCreateInfo
|
||||
|
@ -565,7 +571,6 @@ typedef struct REFRESH_FramebufferCreateInfo
|
|||
const REFRESH_DepthStencilTarget *pDepthTarget;
|
||||
uint32_t width;
|
||||
uint32_t height;
|
||||
uint32_t layers;
|
||||
} REFRESH_FramebufferCreateInfo;
|
||||
|
||||
/* Version API */
|
||||
|
@ -778,37 +783,15 @@ REFRESHAPI REFRESH_Texture* REFRESH_CreateTextureCube(
|
|||
uint8_t canBeRenderTarget
|
||||
);
|
||||
|
||||
/* Creates a depth/stencil texture to be used with a DepthStencilTarget.
|
||||
*
|
||||
* format: The pixel format of the depth/stencil data.
|
||||
* width: The width of the texture.
|
||||
* height: The height of the texture.
|
||||
*
|
||||
* Returns an allocated REFRESH_Texture* object. Note that the contents of
|
||||
* the texture are undefined until SetData is called.
|
||||
*/
|
||||
REFRESHAPI REFRESH_DepthStencilTexture* REFRESH_CreateTextureDepthStencil(
|
||||
REFRESH_Device *device,
|
||||
REFRESH_DepthFormat format,
|
||||
uint32_t width,
|
||||
uint32_t height
|
||||
);
|
||||
|
||||
/* Creates a color target.
|
||||
*
|
||||
* width: The width of the color target.
|
||||
* height: The height of the color target.
|
||||
* format: The pixel format of the color target.
|
||||
* multisampleCount: The MSAA value for the color target.
|
||||
* texture: The texture that the color target will resolve to.
|
||||
* textureSlice: The texture slice that the color target will resolve to.
|
||||
*/
|
||||
REFRESHAPI REFRESH_ColorTarget* REFRESH_GenColorTarget(
|
||||
REFRESH_Device *device,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
REFRESH_SurfaceFormat format,
|
||||
uint32_t multisampleCount,
|
||||
REFRESH_Texture *texture
|
||||
REFRESH_SampleCount multisampleCount,
|
||||
REFRESH_TextureSlice textureSlice
|
||||
);
|
||||
|
||||
/* Creates a depth/stencil target.
|
||||
|
@ -816,14 +799,12 @@ REFRESHAPI REFRESH_ColorTarget* REFRESH_GenColorTarget(
|
|||
* width: The width of the depth/stencil target.
|
||||
* height: The height of the depth/stencil target.
|
||||
* format: The storage format of the depth/stencil target.
|
||||
* texture: The texture that the depth/stencil target will resolve to.
|
||||
*/
|
||||
REFRESHAPI REFRESH_DepthStencilTarget* REFRESH_GenDepthStencilTarget(
|
||||
REFRESH_Device *device,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
REFRESH_DepthFormat format,
|
||||
REFRESH_Texture *texture
|
||||
REFRESH_DepthFormat format
|
||||
);
|
||||
|
||||
/* Creates a vertex buffer to be used by Draw commands.
|
||||
|
|
|
@ -338,37 +338,16 @@ REFRESH_Texture* REFRESH_CreateTextureCube(
|
|||
);
|
||||
}
|
||||
|
||||
REFRESH_DepthStencilTexture* REFRESH_CreateTextureDepthStencil(
|
||||
REFRESH_Device *device,
|
||||
REFRESH_DepthFormat format,
|
||||
uint32_t width,
|
||||
uint32_t height
|
||||
) {
|
||||
NULL_RETURN_NULL(device);
|
||||
return device->CreateTextureDepthStencil(
|
||||
device->driverData,
|
||||
format,
|
||||
width,
|
||||
height
|
||||
);
|
||||
}
|
||||
|
||||
REFRESH_ColorTarget* REFRESH_GenColorTarget(
|
||||
REFRESH_Device *device,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
REFRESH_SurfaceFormat format,
|
||||
uint32_t multisampleCount,
|
||||
REFRESH_Texture *texture
|
||||
REFRESH_TextureSlice textureSlice
|
||||
) {
|
||||
NULL_RETURN_NULL(device);
|
||||
return device->GenColorTarget(
|
||||
device->driverData,
|
||||
width,
|
||||
height,
|
||||
format,
|
||||
multisampleCount,
|
||||
texture
|
||||
textureSlice
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -376,16 +355,14 @@ REFRESH_DepthStencilTarget* REFRESH_GenDepthStencilTarget(
|
|||
REFRESH_Device *device,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
REFRESH_DepthFormat format,
|
||||
REFRESH_Texture *texture
|
||||
REFRESH_DepthFormat format
|
||||
) {
|
||||
NULL_RETURN_NULL(device);
|
||||
return device->GenDepthStencilTarget(
|
||||
device->driverData,
|
||||
width,
|
||||
height,
|
||||
format,
|
||||
texture
|
||||
format
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -261,28 +261,17 @@ struct REFRESH_Device
|
|||
uint8_t canBeRenderTarget
|
||||
);
|
||||
|
||||
REFRESH_DepthStencilTexture* (*CreateTextureDepthStencil)(
|
||||
REFRESH_Renderer *driverData,
|
||||
REFRESH_DepthFormat format,
|
||||
uint32_t width,
|
||||
uint32_t height
|
||||
);
|
||||
|
||||
REFRESH_ColorTarget* (*GenColorTarget)(
|
||||
REFRESH_Renderer *driverData,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
REFRESH_SurfaceFormat format,
|
||||
uint32_t multisampleCount,
|
||||
REFRESH_Texture *texture
|
||||
REFRESH_TextureSlice textureSlice
|
||||
);
|
||||
|
||||
REFRESH_DepthStencilTarget* (*GenDepthStencilTarget)(
|
||||
REFRESH_Renderer *driverData,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
REFRESH_DepthFormat format,
|
||||
REFRESH_Texture *texture
|
||||
REFRESH_DepthFormat format
|
||||
);
|
||||
|
||||
REFRESH_Buffer* (*GenVertexBuffer)(
|
||||
|
@ -526,7 +515,6 @@ struct REFRESH_Device
|
|||
ASSIGN_DRIVER_FUNC(CreateTexture2D, name) \
|
||||
ASSIGN_DRIVER_FUNC(CreateTexture3D, name) \
|
||||
ASSIGN_DRIVER_FUNC(CreateTextureCube, name) \
|
||||
ASSIGN_DRIVER_FUNC(CreateTextureDepthStencil, name) \
|
||||
ASSIGN_DRIVER_FUNC(GenColorTarget, name) \
|
||||
ASSIGN_DRIVER_FUNC(GenDepthStencilTarget, name) \
|
||||
ASSIGN_DRIVER_FUNC(GenVertexBuffer, name) \
|
||||
|
|
|
@ -346,6 +346,8 @@ static VkBorderColor RefreshToVK_BorderColor[] =
|
|||
|
||||
/* Structures */
|
||||
|
||||
/* Memory Allocation */
|
||||
|
||||
typedef struct VulkanMemoryAllocation VulkanMemoryAllocation;
|
||||
|
||||
typedef struct VulkanMemoryFreeRegion
|
||||
|
@ -383,6 +385,195 @@ typedef struct VulkanMemoryAllocator
|
|||
VulkanMemorySubAllocator subAllocators[VK_MAX_MEMORY_TYPES];
|
||||
} VulkanMemoryAllocator;
|
||||
|
||||
/* Memory Barriers */
|
||||
|
||||
typedef struct VulkanResourceAccessInfo
|
||||
{
|
||||
VkPipelineStageFlags stageMask;
|
||||
VkAccessFlags accessMask;
|
||||
VkImageLayout imageLayout;
|
||||
} VulkanResourceAccessInfo;
|
||||
|
||||
static const VulkanResourceAccessInfo AccessMap[RESOURCE_ACCESS_TYPES_COUNT] =
|
||||
{
|
||||
/* RESOURCE_ACCESS_NONE */
|
||||
{
|
||||
0,
|
||||
0,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_INDEX_BUFFER */
|
||||
{
|
||||
VK_PIPELINE_STAGE_VERTEX_INPUT_BIT,
|
||||
VK_ACCESS_INDEX_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_VERTEX_BUFFER */
|
||||
{
|
||||
VK_PIPELINE_STAGE_VERTEX_INPUT_BIT,
|
||||
VK_ACCESS_INDEX_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_VERTEX_SHADER_READ_UNIFORM_BUFFER */
|
||||
{
|
||||
VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
|
||||
VK_ACCESS_SHADER_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_VERTEX_SHADER_READ_SAMPLED_IMAGE */
|
||||
{
|
||||
VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
|
||||
VK_ACCESS_SHADER_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_FRAGMENT_SHADER_READ_UNIFORM_BUFFER */
|
||||
{
|
||||
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
VK_ACCESS_UNIFORM_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_FRAGMENT_SHADER_READ_SAMPLED_IMAGE */
|
||||
{
|
||||
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
VK_ACCESS_SHADER_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_FRAGMENT_SHADER_READ_COLOR_ATTACHMENT */
|
||||
{
|
||||
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_FRAGMENT_SHADER_READ_DEPTH_STENCIL_ATTACHMENT */
|
||||
{
|
||||
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_COLOR_ATTACHMENT_READ */
|
||||
{
|
||||
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ */
|
||||
{
|
||||
VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
|
||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_TRANSFER_READ */
|
||||
{
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
VK_ACCESS_TRANSFER_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_HOST_READ */
|
||||
{
|
||||
VK_PIPELINE_STAGE_HOST_BIT,
|
||||
VK_ACCESS_HOST_READ_BIT,
|
||||
VK_IMAGE_LAYOUT_GENERAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_PRESENT */
|
||||
{
|
||||
0,
|
||||
0,
|
||||
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_END_OF_READ */
|
||||
{
|
||||
0,
|
||||
0,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_VERTEX_SHADER_WRITE */
|
||||
{
|
||||
VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
|
||||
VK_ACCESS_SHADER_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_GENERAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_FRAGMENT_SHADER_WRITE */
|
||||
{
|
||||
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
VK_ACCESS_SHADER_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_GENERAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_COLOR_ATTACHMENT_WRITE */
|
||||
{
|
||||
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE */
|
||||
{
|
||||
VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
|
||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_TRANSFER_WRITE */
|
||||
{
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_HOST_WRITE */
|
||||
{
|
||||
VK_PIPELINE_STAGE_HOST_BIT,
|
||||
VK_ACCESS_HOST_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_GENERAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_COLOR_ATTACHMENT_READ_WRITE */
|
||||
{
|
||||
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_WRITE */
|
||||
{
|
||||
VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
|
||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_MEMORY_TRANSFER_READ_WRITE */
|
||||
{
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED
|
||||
},
|
||||
|
||||
/* RESOURCE_ACCESS_GENERAL */
|
||||
{
|
||||
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
|
||||
VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT,
|
||||
VK_IMAGE_LAYOUT_GENERAL
|
||||
}
|
||||
};
|
||||
|
||||
/* Renderer Structure */
|
||||
|
||||
typedef struct QueueFamilyIndices
|
||||
{
|
||||
uint32_t graphicsFamily;
|
||||
|
@ -449,6 +640,7 @@ typedef struct VulkanRenderer
|
|||
VkDescriptorSetLayout fragmentParamLayout;
|
||||
|
||||
SDL_mutex *allocatorLock;
|
||||
SDL_mutex *commandLock;
|
||||
|
||||
#define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \
|
||||
vkfntype_##func func;
|
||||
|
@ -457,6 +649,8 @@ typedef struct VulkanRenderer
|
|||
#include "Refresh_Driver_Vulkan_vkfuncs.h"
|
||||
} VulkanRenderer;
|
||||
|
||||
/* Image Data */
|
||||
|
||||
typedef struct VulkanTexture
|
||||
{
|
||||
VulkanMemoryAllocation *allocation;
|
||||
|
@ -469,7 +663,7 @@ typedef struct VulkanTexture
|
|||
uint32_t depth;
|
||||
uint32_t layerCount;
|
||||
uint32_t levelCount;
|
||||
VkFormat surfaceFormat;
|
||||
VkFormat format;
|
||||
VulkanResourceAccessType resourceAccessType;
|
||||
} VulkanTexture;
|
||||
|
||||
|
@ -482,22 +676,40 @@ typedef struct VulkanDepthStencilTexture
|
|||
VkImage image;
|
||||
VkImageView view;
|
||||
VkExtent2D dimensions;
|
||||
VkFormat surfaceFormat;
|
||||
VkFormat format;
|
||||
VulkanResourceAccessType resourceAccessType;
|
||||
} VulkanDepthStencilTexture;
|
||||
|
||||
typedef struct VulkanColorTarget
|
||||
{
|
||||
VulkanTexture *texture;
|
||||
VkImageView imageView;
|
||||
VkImageView view;
|
||||
VulkanTexture *multisampleTexture;
|
||||
uint32_t multisampleCount;
|
||||
} VulkanColorTarget;
|
||||
|
||||
typedef struct VulkanDepthStencilTarget
|
||||
{
|
||||
VulkanDepthStencilTexture *texture;
|
||||
VkImageView imageView;
|
||||
VkImageView view;
|
||||
} VulkanDepthStencilTarget;
|
||||
|
||||
/* Forward declarations */
|
||||
|
||||
static void VULKAN_INTERNAL_BeginCommandBuffer(VulkanRenderer *renderer);
|
||||
|
||||
/* Macros */
|
||||
|
||||
#define RECORD_CMD(cmdCall) \
|
||||
SDL_LockMutex(renderer->commandLock); \
|
||||
if (renderer->currentCommandBuffer == NULL) \
|
||||
{ \
|
||||
VULKAN_INTERNAL_BeginCommandBuffer(renderer); \
|
||||
} \
|
||||
cmdCall; \
|
||||
renderer->numActiveCommands += 1; \
|
||||
SDL_UnlockMutex(renderer->commandLock);
|
||||
|
||||
/* Error Handling */
|
||||
|
||||
static inline const char* VkErrorMessages(VkResult code)
|
||||
|
@ -1023,6 +1235,97 @@ static uint8_t VULKAN_INTERNAL_FindAvailableMemory(
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* Memory Barriers */
|
||||
|
||||
static void VULKAN_INTERNAL_ImageMemoryBarrier(
|
||||
VulkanRenderer *renderer,
|
||||
VulkanResourceAccessType nextAccess,
|
||||
VkImageAspectFlags aspectMask,
|
||||
uint32_t baseLayer,
|
||||
uint32_t layerCount,
|
||||
uint32_t baseLevel,
|
||||
uint32_t levelCount,
|
||||
uint8_t discardContents,
|
||||
VkImage image,
|
||||
VulkanResourceAccessType *resourceAccessType
|
||||
) {
|
||||
VkPipelineStageFlags srcStages = 0;
|
||||
VkPipelineStageFlags dstStages = 0;
|
||||
VkImageMemoryBarrier memoryBarrier;
|
||||
VulkanResourceAccessType prevAccess;
|
||||
const VulkanResourceAccessInfo *pPrevAccessInfo, *pNextAccessInfo;
|
||||
|
||||
if (*resourceAccessType == nextAccess)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
memoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
|
||||
memoryBarrier.pNext = NULL;
|
||||
memoryBarrier.srcAccessMask = 0;
|
||||
memoryBarrier.dstAccessMask = 0;
|
||||
memoryBarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
memoryBarrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
memoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||
memoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||
memoryBarrier.image = image;
|
||||
memoryBarrier.subresourceRange.aspectMask = aspectMask;
|
||||
memoryBarrier.subresourceRange.baseArrayLayer = baseLayer;
|
||||
memoryBarrier.subresourceRange.layerCount = layerCount;
|
||||
memoryBarrier.subresourceRange.baseMipLevel = baseLevel;
|
||||
memoryBarrier.subresourceRange.levelCount = levelCount;
|
||||
|
||||
prevAccess = *resourceAccessType;
|
||||
pPrevAccessInfo = &AccessMap[prevAccess];
|
||||
|
||||
srcStages |= pPrevAccessInfo->stageMask;
|
||||
|
||||
if (prevAccess > RESOURCE_ACCESS_END_OF_READ)
|
||||
{
|
||||
memoryBarrier.srcAccessMask |= pPrevAccessInfo->accessMask;
|
||||
}
|
||||
|
||||
if (discardContents)
|
||||
{
|
||||
memoryBarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
}
|
||||
else
|
||||
{
|
||||
memoryBarrier.oldLayout = pPrevAccessInfo->imageLayout;
|
||||
}
|
||||
|
||||
pNextAccessInfo = &AccessMap[nextAccess];
|
||||
|
||||
dstStages |= pNextAccessInfo->stageMask;
|
||||
|
||||
memoryBarrier.dstAccessMask |= pNextAccessInfo->accessMask;
|
||||
memoryBarrier.newLayout = pNextAccessInfo->imageLayout;
|
||||
|
||||
if (srcStages == 0)
|
||||
{
|
||||
srcStages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
|
||||
}
|
||||
if (dstStages == 0)
|
||||
{
|
||||
dstStages = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
||||
}
|
||||
|
||||
RECORD_CMD(renderer->vkCmdPipelineBarrier(
|
||||
renderer->currentCommandBuffer,
|
||||
srcStages,
|
||||
dstStages,
|
||||
0,
|
||||
0,
|
||||
NULL,
|
||||
0,
|
||||
NULL,
|
||||
1,
|
||||
&memoryBarrier
|
||||
));
|
||||
|
||||
*resourceAccessType = nextAccess;
|
||||
}
|
||||
|
||||
/* Command Buffers */
|
||||
|
||||
static void VULKAN_INTERNAL_BeginCommandBuffer(VulkanRenderer *renderer)
|
||||
|
@ -1867,7 +2170,7 @@ static REFRESH_Framebuffer* VULKAN_CreateFramebuffer(
|
|||
|
||||
for (i = 0; i < colorAttachmentCount; i += 1)
|
||||
{
|
||||
imageViews[i] = ((VulkanColorTarget*)framebufferCreateInfo->pColorTargets[i])->imageView;
|
||||
imageViews[i] = ((VulkanColorTarget*)framebufferCreateInfo->pColorTargets[i])->view;
|
||||
}
|
||||
|
||||
vkFramebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
|
||||
|
@ -1878,7 +2181,7 @@ static REFRESH_Framebuffer* VULKAN_CreateFramebuffer(
|
|||
vkFramebufferCreateInfo.pAttachments = imageViews;
|
||||
vkFramebufferCreateInfo.width = framebufferCreateInfo->width;
|
||||
vkFramebufferCreateInfo.height = framebufferCreateInfo->height;
|
||||
vkFramebufferCreateInfo.layers = framebufferCreateInfo->layers;
|
||||
vkFramebufferCreateInfo.layers = 1;
|
||||
|
||||
vulkanResult = renderer->vkCreateFramebuffer(
|
||||
renderer->logicalDevice,
|
||||
|
@ -1923,14 +2226,25 @@ static uint8_t VULKAN_INTERNAL_CreateTexture(
|
|||
) {
|
||||
VkResult vulkanResult;
|
||||
VkImageCreateInfo imageCreateInfo;
|
||||
VkImageCreateFlags imageCreateFlags = 0;
|
||||
VkImageViewCreateInfo imageViewCreateInfo;
|
||||
uint8_t findMemoryResult;
|
||||
uint8_t is3D = depth > 1 ? 1 : 0;
|
||||
uint8_t layerCount = isCube ? 6 : 1;
|
||||
VkComponentMapping swizzle = IDENTITY_SWIZZLE;
|
||||
|
||||
if (isCube)
|
||||
{
|
||||
imageCreateFlags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
|
||||
}
|
||||
else if (is3D)
|
||||
{
|
||||
imageCreateFlags |= VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT;
|
||||
}
|
||||
|
||||
imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
|
||||
imageCreateInfo.pNext = NULL;
|
||||
imageCreateInfo.flags = isCube ? VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : 0;
|
||||
imageCreateInfo.flags = imageCreateFlags;
|
||||
imageCreateInfo.imageType = imageType;
|
||||
imageCreateInfo.format = format;
|
||||
imageCreateInfo.extent.width = width;
|
||||
|
@ -2036,7 +2350,7 @@ static uint8_t VULKAN_INTERNAL_CreateTexture(
|
|||
texture->dimensions.width = width;
|
||||
texture->dimensions.height = height;
|
||||
texture->depth = depth;
|
||||
texture->surfaceFormat = format;
|
||||
texture->format = format;
|
||||
texture->levelCount = levelCount;
|
||||
texture->layerCount = layerCount;
|
||||
texture->resourceAccessType = RESOURCE_ACCESS_NONE;
|
||||
|
@ -2161,7 +2475,7 @@ static uint8_t VULKAN_INTERNAL_CreateTextureDepthStencil(
|
|||
|
||||
texture->dimensions.width = width;
|
||||
texture->dimensions.height = height;
|
||||
texture->surfaceFormat = format;
|
||||
texture->format = format;
|
||||
texture->resourceAccessType = RESOURCE_ACCESS_NONE;
|
||||
|
||||
return 1;
|
||||
|
@ -2293,47 +2607,121 @@ static REFRESH_Texture* VULKAN_CreateTextureCube(
|
|||
return (REFRESH_Texture*) result;
|
||||
}
|
||||
|
||||
static REFRESH_DepthStencilTexture* VULKAN_CreateTextureDepthStencil(
|
||||
REFRESH_Renderer *driverData,
|
||||
REFRESH_DepthFormat format,
|
||||
uint32_t width,
|
||||
uint32_t height
|
||||
) {
|
||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||
VulkanDepthStencilTexture *result;
|
||||
|
||||
result = (VulkanDepthStencilTexture*) SDL_malloc(sizeof(VulkanDepthStencilTexture));
|
||||
|
||||
VULKAN_INTERNAL_CreateTextureDepthStencil(
|
||||
renderer,
|
||||
width,
|
||||
height,
|
||||
RefreshToVK_DepthFormat[format],
|
||||
result
|
||||
);
|
||||
|
||||
return (REFRESH_DepthStencilTexture*) result;
|
||||
}
|
||||
|
||||
static REFRESH_ColorTarget* VULKAN_GenColorTarget(
|
||||
REFRESH_Renderer *driverData,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
REFRESH_SurfaceFormat format,
|
||||
uint32_t multisampleCount,
|
||||
REFRESH_Texture *texture
|
||||
REFRESH_SampleCount multisampleCount,
|
||||
REFRESH_TextureSlice textureSlice
|
||||
) {
|
||||
SDL_assert(0);
|
||||
VkResult vulkanResult;
|
||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||
VulkanColorTarget *colorTarget = (VulkanColorTarget*) SDL_malloc(sizeof(VulkanColorTarget));
|
||||
VkImageViewCreateInfo imageViewCreateInfo;
|
||||
VkComponentMapping swizzle = IDENTITY_SWIZZLE;
|
||||
|
||||
colorTarget->texture = (VulkanTexture*) textureSlice.texture;
|
||||
colorTarget->multisampleTexture = NULL;
|
||||
colorTarget->multisampleCount = 1;
|
||||
|
||||
/* create resolve target for multisample */
|
||||
if (multisampleCount > 1)
|
||||
{
|
||||
colorTarget->multisampleTexture =
|
||||
(VulkanTexture*) SDL_malloc(sizeof(VulkanTexture));
|
||||
|
||||
VULKAN_INTERNAL_CreateTexture(
|
||||
renderer,
|
||||
colorTarget->texture->dimensions.width,
|
||||
colorTarget->texture->dimensions.height,
|
||||
1,
|
||||
0,
|
||||
RefreshToVK_SampleCount[multisampleCount],
|
||||
1,
|
||||
RefreshToVK_SurfaceFormat[colorTarget->texture->format],
|
||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
VK_IMAGE_TILING_OPTIMAL,
|
||||
VK_IMAGE_TYPE_2D,
|
||||
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
|
||||
colorTarget->multisampleTexture
|
||||
);
|
||||
colorTarget->multisampleCount = multisampleCount;
|
||||
|
||||
VULKAN_INTERNAL_ImageMemoryBarrier(
|
||||
renderer,
|
||||
RESOURCE_ACCESS_COLOR_ATTACHMENT_READ_WRITE,
|
||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
0,
|
||||
colorTarget->multisampleTexture->layerCount,
|
||||
0,
|
||||
colorTarget->multisampleTexture->levelCount,
|
||||
0,
|
||||
colorTarget->multisampleTexture->image,
|
||||
&colorTarget->multisampleTexture->resourceAccessType
|
||||
);
|
||||
}
|
||||
|
||||
/* create framebuffer compatible views for RenderTarget */
|
||||
imageViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
||||
imageViewCreateInfo.pNext = NULL;
|
||||
imageViewCreateInfo.flags = 0;
|
||||
imageViewCreateInfo.image = colorTarget->texture->image;
|
||||
imageViewCreateInfo.format = colorTarget->texture->format;
|
||||
imageViewCreateInfo.components = swizzle;
|
||||
imageViewCreateInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
imageViewCreateInfo.subresourceRange.baseMipLevel = 0;
|
||||
imageViewCreateInfo.subresourceRange.levelCount = 1;
|
||||
imageViewCreateInfo.subresourceRange.baseArrayLayer = textureSlice.layer;
|
||||
imageViewCreateInfo.subresourceRange.layerCount = 1;
|
||||
imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
||||
|
||||
vulkanResult = renderer->vkCreateImageView(
|
||||
renderer->logicalDevice,
|
||||
&imageViewCreateInfo,
|
||||
NULL,
|
||||
&colorTarget->view
|
||||
);
|
||||
|
||||
if (vulkanResult != VK_SUCCESS)
|
||||
{
|
||||
LogVulkanResult(
|
||||
"vkCreateImageView",
|
||||
vulkanResult
|
||||
);
|
||||
REFRESH_LogError("Failed to create color attachment image view");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (REFRESH_ColorTarget*) colorTarget;
|
||||
}
|
||||
|
||||
static REFRESH_DepthStencilTarget* VULKAN_GenDepthStencilTarget(
|
||||
REFRESH_Renderer *driverData,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
REFRESH_DepthFormat format,
|
||||
REFRESH_Texture *texture
|
||||
REFRESH_DepthFormat format
|
||||
) {
|
||||
SDL_assert(0);
|
||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||
VulkanDepthStencilTarget *depthStencilTarget =
|
||||
(VulkanDepthStencilTarget*) SDL_malloc(
|
||||
sizeof(VulkanDepthStencilTarget)
|
||||
);
|
||||
|
||||
VulkanDepthStencilTexture *texture =
|
||||
(VulkanDepthStencilTexture*) SDL_malloc(
|
||||
sizeof(VulkanDepthStencilTexture)
|
||||
);
|
||||
|
||||
VULKAN_INTERNAL_CreateTextureDepthStencil(
|
||||
renderer,
|
||||
width,
|
||||
height,
|
||||
RefreshToVK_DepthFormat[format],
|
||||
texture
|
||||
);
|
||||
|
||||
depthStencilTarget->texture = texture;
|
||||
depthStencilTarget->view = texture->view;
|
||||
|
||||
return (REFRESH_DepthStencilTarget*) depthStencilTarget;
|
||||
}
|
||||
|
||||
static REFRESH_Buffer* VULKAN_GenVertexBuffer(
|
||||
|
@ -3891,6 +4279,7 @@ static REFRESH_Device* VULKAN_CreateDevice(
|
|||
/* Threading */
|
||||
|
||||
renderer->allocatorLock = SDL_CreateMutex();
|
||||
renderer->commandLock = SDL_CreateMutex();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue