mirror of
https://github.com/libretro/RetroArch
synced 2025-04-01 13:20:43 +00:00
(vulkan.c) Style nits
This commit is contained in:
parent
25c1c6202f
commit
1426cf7fb2
@ -72,8 +72,10 @@ static const gfx_ctx_driver_t *vulkan_get_context(vk_t *vk)
|
||||
static void vulkan_init_render_pass(vk_t *vk)
|
||||
{
|
||||
VkAttachmentDescription attachment = {0};
|
||||
VkRenderPassCreateInfo rp_info = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO };
|
||||
VkAttachmentReference color_ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
|
||||
VkRenderPassCreateInfo rp_info = {
|
||||
VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO };
|
||||
VkAttachmentReference color_ref = { 0,
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
|
||||
VkSubpassDescription subpass = {0};
|
||||
|
||||
/* Backbuffer format. */
|
||||
@ -88,7 +90,8 @@ static void vulkan_init_render_pass(vk_t *vk)
|
||||
attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||
attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||
|
||||
/* The image layout will be attachment_optimal when we're executing the renderpass. */
|
||||
/* The image layout will be attachment_optimal
|
||||
* when we're executing the renderpass. */
|
||||
attachment.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
attachment.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
|
||||
@ -104,7 +107,8 @@ static void vulkan_init_render_pass(vk_t *vk)
|
||||
rp_info.subpassCount = 1;
|
||||
rp_info.pSubpasses = &subpass;
|
||||
|
||||
vkCreateRenderPass(vk->context->device, &rp_info, NULL, &vk->render_pass);
|
||||
vkCreateRenderPass(vk->context->device,
|
||||
&rp_info, NULL, &vk->render_pass);
|
||||
}
|
||||
|
||||
static void vulkan_init_framebuffers(vk_t *vk)
|
||||
@ -114,8 +118,10 @@ static void vulkan_init_framebuffers(vk_t *vk)
|
||||
|
||||
for (i = 0; i < vk->num_swapchain_images; i++)
|
||||
{
|
||||
VkImageViewCreateInfo view = { VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO };
|
||||
VkFramebufferCreateInfo info = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO };
|
||||
VkImageViewCreateInfo view = {
|
||||
VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO };
|
||||
VkFramebufferCreateInfo info = {
|
||||
VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO };
|
||||
|
||||
vk->swapchain[i].backbuffer.image = vk->context->swapchain_images[i];
|
||||
|
||||
@ -151,8 +157,10 @@ static void vulkan_init_framebuffers(vk_t *vk)
|
||||
|
||||
static void vulkan_init_pipeline_layout(vk_t *vk)
|
||||
{
|
||||
VkDescriptorSetLayoutCreateInfo set_layout_info = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO };
|
||||
VkPipelineLayoutCreateInfo layout_info = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO };
|
||||
VkDescriptorSetLayoutCreateInfo set_layout_info = {
|
||||
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO };
|
||||
VkPipelineLayoutCreateInfo layout_info = {
|
||||
VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO };
|
||||
VkDescriptorSetLayoutBinding bindings[2] = {{0}};
|
||||
|
||||
bindings[0].binding = 0;
|
||||
@ -170,34 +178,46 @@ static void vulkan_init_pipeline_layout(vk_t *vk)
|
||||
set_layout_info.bindingCount = 2;
|
||||
set_layout_info.pBindings = bindings;
|
||||
|
||||
vkCreateDescriptorSetLayout(vk->context->device, &set_layout_info, NULL, &vk->pipelines.set_layout);
|
||||
vkCreateDescriptorSetLayout(vk->context->device,
|
||||
&set_layout_info, NULL, &vk->pipelines.set_layout);
|
||||
|
||||
layout_info.setLayoutCount = 1;
|
||||
layout_info.pSetLayouts = &vk->pipelines.set_layout;
|
||||
|
||||
vkCreatePipelineLayout(vk->context->device, &layout_info, NULL, &vk->pipelines.layout);
|
||||
vkCreatePipelineLayout(vk->context->device,
|
||||
&layout_info, NULL, &vk->pipelines.layout);
|
||||
}
|
||||
|
||||
static void vulkan_init_pipelines(vk_t *vk)
|
||||
{
|
||||
unsigned i;
|
||||
VkPipelineInputAssemblyStateCreateInfo input_assembly = { VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO };
|
||||
VkPipelineVertexInputStateCreateInfo vertex_input = { VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO };
|
||||
VkPipelineRasterizationStateCreateInfo raster = { VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO };
|
||||
VkPipelineInputAssemblyStateCreateInfo input_assembly = {
|
||||
VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO };
|
||||
VkPipelineVertexInputStateCreateInfo vertex_input = {
|
||||
VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO };
|
||||
VkPipelineRasterizationStateCreateInfo raster = {
|
||||
VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO };
|
||||
VkPipelineColorBlendAttachmentState blend_attachment = {0};
|
||||
VkPipelineColorBlendStateCreateInfo blend = { VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO };
|
||||
VkPipelineViewportStateCreateInfo viewport = { VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO };
|
||||
VkPipelineDepthStencilStateCreateInfo depth_stencil = { VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO };
|
||||
VkPipelineMultisampleStateCreateInfo multisample = { VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO };
|
||||
VkPipelineDynamicStateCreateInfo dynamic = { VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO };
|
||||
VkPipelineColorBlendStateCreateInfo blend = {
|
||||
VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO };
|
||||
VkPipelineViewportStateCreateInfo viewport = {
|
||||
VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO };
|
||||
VkPipelineDepthStencilStateCreateInfo depth_stencil = {
|
||||
VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO };
|
||||
VkPipelineMultisampleStateCreateInfo multisample = {
|
||||
VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO };
|
||||
VkPipelineDynamicStateCreateInfo dynamic = {
|
||||
VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO };
|
||||
|
||||
VkPipelineShaderStageCreateInfo shader_stages[2] = {
|
||||
{ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO },
|
||||
{ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO },
|
||||
};
|
||||
|
||||
VkGraphicsPipelineCreateInfo pipe = { VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO };
|
||||
VkShaderModuleCreateInfo module_info = { VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO };
|
||||
VkGraphicsPipelineCreateInfo pipe = {
|
||||
VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO };
|
||||
VkShaderModuleCreateInfo module_info = {
|
||||
VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO };
|
||||
VkVertexInputAttributeDescription attributes[3] = {{0}};
|
||||
VkVertexInputBindingDescription binding = {0};
|
||||
|
||||
@ -286,12 +306,15 @@ static void vulkan_init_pipelines(vk_t *vk)
|
||||
module_info.pCode = (const uint32_t*)alpha_blend_vert_spv;
|
||||
shader_stages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
|
||||
shader_stages[0].pName = "main";
|
||||
vkCreateShaderModule(vk->context->device, &module_info, NULL, &shader_stages[0].module);
|
||||
vkCreateShaderModule(vk->context->device,
|
||||
&module_info, NULL, &shader_stages[0].module);
|
||||
|
||||
module_info.codeSize = alpha_blend_frag_spv_len;
|
||||
module_info.pCode = (const uint32_t*)alpha_blend_frag_spv;
|
||||
shader_stages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
|
||||
shader_stages[1].pName = "main";
|
||||
vkCreateShaderModule(vk->context->device, &module_info, NULL, &shader_stages[1].module);
|
||||
vkCreateShaderModule(vk->context->device,
|
||||
&module_info, NULL, &shader_stages[1].module);
|
||||
|
||||
blend_attachment.blendEnable = true;
|
||||
blend_attachment.colorWriteMask = 0xf;
|
||||
@ -326,17 +349,22 @@ static void vulkan_init_command_buffers(vk_t *vk)
|
||||
unsigned i;
|
||||
for (i = 0; i < vk->num_swapchain_images; i++)
|
||||
{
|
||||
VkCommandPoolCreateInfo pool_info = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO };
|
||||
VkCommandBufferAllocateInfo info = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO };
|
||||
VkCommandPoolCreateInfo pool_info = {
|
||||
VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO };
|
||||
VkCommandBufferAllocateInfo info = {
|
||||
VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO };
|
||||
|
||||
pool_info.queueFamilyIndex = vk->context->graphics_queue_index;
|
||||
pool_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
|
||||
vkCreateCommandPool(vk->context->device, &pool_info, NULL, &vk->swapchain[i].cmd_pool);
|
||||
pool_info.flags =
|
||||
VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
|
||||
vkCreateCommandPool(vk->context->device,
|
||||
&pool_info, NULL, &vk->swapchain[i].cmd_pool);
|
||||
|
||||
info.commandPool = vk->swapchain[i].cmd_pool;
|
||||
info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
|
||||
info.commandBufferCount = 1;
|
||||
vkAllocateCommandBuffers(vk->context->device, &info, &vk->swapchain[i].cmd);
|
||||
vkAllocateCommandBuffers(vk->context->device,
|
||||
&info, &vk->swapchain[i].cmd);
|
||||
}
|
||||
}
|
||||
|
||||
@ -356,8 +384,8 @@ static void vulkan_init_samplers(vk_t *vk)
|
||||
info.maxLod = 0.0f;
|
||||
info.unnormalizedCoordinates = false;
|
||||
info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
|
||||
|
||||
vkCreateSampler(vk->context->device, &info, NULL, &vk->samplers.nearest);
|
||||
|
||||
info.magFilter = VK_FILTER_LINEAR;
|
||||
info.minFilter = VK_FILTER_LINEAR;
|
||||
vkCreateSampler(vk->context->device, &info, NULL, &vk->samplers.linear);
|
||||
@ -396,7 +424,8 @@ static void vulkan_deinit_buffers(vk_t *vk)
|
||||
static void vulkan_init_descriptor_pool(vk_t *vk)
|
||||
{
|
||||
unsigned i;
|
||||
VkDescriptorPoolCreateInfo pool_info = { VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO };
|
||||
VkDescriptorPoolCreateInfo pool_info = {
|
||||
VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO };
|
||||
static const VkDescriptorPoolSize pool_sizes[2] = {
|
||||
{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1 },
|
||||
{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1 },
|
||||
@ -404,7 +433,8 @@ static void vulkan_init_descriptor_pool(vk_t *vk)
|
||||
|
||||
for (i = 0; i < vk->num_swapchain_images; i++)
|
||||
{
|
||||
vk->swapchain[i].descriptor_manager = vulkan_create_descriptor_manager(vk->context->device,
|
||||
vk->swapchain[i].descriptor_manager =
|
||||
vulkan_create_descriptor_manager(vk->context->device,
|
||||
pool_sizes, 2, vk->pipelines.set_layout);
|
||||
}
|
||||
}
|
||||
@ -413,7 +443,8 @@ static void vulkan_deinit_descriptor_pool(vk_t *vk)
|
||||
{
|
||||
unsigned i;
|
||||
for (i = 0; i < vk->num_swapchain_images; i++)
|
||||
vulkan_destroy_descriptor_manager(vk->context->device, &vk->swapchain[i].descriptor_manager);
|
||||
vulkan_destroy_descriptor_manager(vk->context->device,
|
||||
&vk->swapchain[i].descriptor_manager);
|
||||
}
|
||||
|
||||
static void vulkan_init_textures(vk_t *vk)
|
||||
@ -426,7 +457,8 @@ static void vulkan_init_textures(vk_t *vk)
|
||||
for (i = 0; i < vk->num_swapchain_images; i++)
|
||||
{
|
||||
vk->swapchain[i].texture = vulkan_create_texture(vk, NULL,
|
||||
vk->tex_w, vk->tex_h, vk->tex_fmt, NULL, NULL, VULKAN_TEXTURE_STREAMED);
|
||||
vk->tex_w, vk->tex_h, vk->tex_fmt,
|
||||
NULL, NULL, VULKAN_TEXTURE_STREAMED);
|
||||
vulkan_map_persistent_texture(vk->context->device,
|
||||
&vk->swapchain[i].texture);
|
||||
}
|
||||
@ -440,7 +472,8 @@ static void vulkan_deinit_textures(vk_t *vk)
|
||||
unsigned i;
|
||||
for (i = 0; i < vk->num_swapchain_images; i++)
|
||||
if (vk->swapchain[i].texture.memory != VK_NULL_HANDLE)
|
||||
vulkan_destroy_texture(vk->context->device, &vk->swapchain[i].texture);
|
||||
vulkan_destroy_texture(vk->context->device,
|
||||
&vk->swapchain[i].texture);
|
||||
}
|
||||
|
||||
static void vulkan_deinit_command_buffers(vk_t *vk)
|
||||
@ -452,14 +485,17 @@ static void vulkan_deinit_command_buffers(vk_t *vk)
|
||||
vkFreeCommandBuffers(vk->context->device,
|
||||
vk->swapchain[i].cmd_pool, 1, &vk->swapchain[i].cmd);
|
||||
|
||||
vkDestroyCommandPool(vk->context->device, vk->swapchain[i].cmd_pool, NULL);
|
||||
vkDestroyCommandPool(vk->context->device,
|
||||
vk->swapchain[i].cmd_pool, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static void vulkan_deinit_pipeline_layout(vk_t *vk)
|
||||
{
|
||||
vkDestroyPipelineLayout(vk->context->device, vk->pipelines.layout, NULL);
|
||||
vkDestroyDescriptorSetLayout(vk->context->device, vk->pipelines.set_layout, NULL);
|
||||
vkDestroyPipelineLayout(vk->context->device,
|
||||
vk->pipelines.layout, NULL);
|
||||
vkDestroyDescriptorSetLayout(vk->context->device,
|
||||
vk->pipelines.set_layout, NULL);
|
||||
}
|
||||
|
||||
static void vulkan_deinit_pipelines(vk_t *vk)
|
||||
@ -500,7 +536,10 @@ static bool vulkan_init_default_filter_chain(vk_t *vk)
|
||||
info.swapchain.render_pass = vk->render_pass;
|
||||
info.swapchain.num_indices = vk->context->num_swapchain_images;
|
||||
|
||||
vk->filter_chain = vulkan_filter_chain_create_default(&info, vk->video.smooth ? VULKAN_FILTER_CHAIN_LINEAR : VULKAN_FILTER_CHAIN_NEAREST);
|
||||
vk->filter_chain = vulkan_filter_chain_create_default(&info,
|
||||
vk->video.smooth ?
|
||||
VULKAN_FILTER_CHAIN_LINEAR : VULKAN_FILTER_CHAIN_NEAREST);
|
||||
|
||||
if (!vk->filter_chain)
|
||||
{
|
||||
RARCH_ERR("Failed to create filter chain.\n");
|
||||
@ -578,36 +617,44 @@ static void vulkan_init_resources(vk_t *vk)
|
||||
|
||||
static void vulkan_init_static_resources(vk_t *vk)
|
||||
{
|
||||
VkCommandPoolCreateInfo pool_info = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO };
|
||||
unsigned i;
|
||||
uint32_t blank[4 * 4];
|
||||
|
||||
VkCommandPoolCreateInfo pool_info = {
|
||||
VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO };
|
||||
/* Create the pipeline cache. */
|
||||
VkPipelineCacheCreateInfo cache = { VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO };
|
||||
vkCreatePipelineCache(vk->context->device, &cache, NULL, &vk->pipelines.cache);
|
||||
VkPipelineCacheCreateInfo cache = {
|
||||
VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO };
|
||||
|
||||
vkCreatePipelineCache(vk->context->device,
|
||||
&cache, NULL, &vk->pipelines.cache);
|
||||
|
||||
pool_info.queueFamilyIndex = vk->context->graphics_queue_index;
|
||||
vkCreateCommandPool(vk->context->device, &pool_info, NULL, &vk->staging_pool);
|
||||
vkCreateCommandPool(vk->context->device,
|
||||
&pool_info, NULL, &vk->staging_pool);
|
||||
|
||||
for (i = 0; i < 4 * 4; i++)
|
||||
blank[i] = -1u;
|
||||
|
||||
vk->display.blank_texture = vulkan_create_texture(vk, NULL,
|
||||
4, 4, VK_FORMAT_B8G8R8A8_UNORM, blank, NULL, VULKAN_TEXTURE_STATIC);
|
||||
4, 4, VK_FORMAT_B8G8R8A8_UNORM,
|
||||
blank, NULL, VULKAN_TEXTURE_STATIC);
|
||||
}
|
||||
|
||||
static void vulkan_deinit_static_resources(vk_t *vk)
|
||||
{
|
||||
unsigned i;
|
||||
vkDestroyPipelineCache(vk->context->device, vk->pipelines.cache, NULL);
|
||||
vulkan_destroy_texture(vk->context->device, &vk->display.blank_texture);
|
||||
vkDestroyPipelineCache(vk->context->device,
|
||||
vk->pipelines.cache, NULL);
|
||||
vulkan_destroy_texture(vk->context->device,
|
||||
&vk->display.blank_texture);
|
||||
vkDestroyCommandPool(vk->context->device, vk->staging_pool, NULL);
|
||||
free(vk->hw.cmd);
|
||||
free(vk->hw.wait_dst_stages);
|
||||
|
||||
for (i = 0; i < VULKAN_MAX_SWAPCHAIN_IMAGES; i++)
|
||||
if (vk->readback.staging[i].memory != VK_NULL_HANDLE)
|
||||
vulkan_destroy_texture(vk->context->device, &vk->readback.staging[i]);
|
||||
vulkan_destroy_texture(vk->context->device,
|
||||
&vk->readback.staging[i]);
|
||||
}
|
||||
|
||||
static void vulkan_deinit_resources(vk_t *vk)
|
||||
@ -625,7 +672,8 @@ static void vulkan_deinit_menu(vk_t *vk)
|
||||
unsigned i;
|
||||
for (i = 0; i < VULKAN_MAX_SWAPCHAIN_IMAGES; i++)
|
||||
if (vk->menu.textures[i].memory)
|
||||
vulkan_destroy_texture(vk->context->device, &vk->menu.textures[i]);
|
||||
vulkan_destroy_texture(vk->context->device,
|
||||
&vk->menu.textures[i]);
|
||||
}
|
||||
|
||||
static void vulkan_free(void *data)
|
||||
@ -673,8 +721,8 @@ static void vulkan_set_image(void *handle,
|
||||
uint32_t num_semaphores,
|
||||
const VkSemaphore *semaphores)
|
||||
{
|
||||
vk_t *vk = (vk_t*)handle;
|
||||
unsigned i;
|
||||
vk_t *vk = (vk_t*)handle;
|
||||
|
||||
vk->hw.image = image;
|
||||
vk->hw.num_semaphores = num_semaphores;
|
||||
@ -682,9 +730,12 @@ static void vulkan_set_image(void *handle,
|
||||
|
||||
if (num_semaphores > 0)
|
||||
{
|
||||
vk->hw.wait_dst_stages = (VkPipelineStageFlags*)realloc(vk->hw.wait_dst_stages,
|
||||
vk->hw.wait_dst_stages = (VkPipelineStageFlags*)
|
||||
realloc(vk->hw.wait_dst_stages,
|
||||
sizeof(VkPipelineStageFlags) * vk->hw.num_semaphores);
|
||||
retro_assert(vk->hw.wait_dst_stages); /* If this fails, we're screwed anyways. */
|
||||
|
||||
/* If this fails, we're screwed anyways. */
|
||||
retro_assert(vk->hw.wait_dst_stages);
|
||||
|
||||
for (i = 0; i < vk->hw.num_semaphores; i++)
|
||||
vk->hw.wait_dst_stages[i] = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
|
||||
@ -707,7 +758,9 @@ static void vulkan_set_command_buffers(void *handle, uint32_t num_cmd,
|
||||
{
|
||||
vk->hw.cmd = (VkCommandBuffer*)realloc(vk->hw.cmd,
|
||||
sizeof(VkCommandBuffer) * required_capacity);
|
||||
retro_assert(vk->hw.cmd); /* If this fails, we're just screwed. */
|
||||
|
||||
/* If this fails, we're just screwed. */
|
||||
retro_assert(vk->hw.cmd);
|
||||
vk->hw.capacity_cmd = required_capacity;
|
||||
}
|
||||
|
||||
@ -790,13 +843,15 @@ static void vulkan_init_readback(vk_t *vk)
|
||||
static void *vulkan_init(const video_info_t *video, const input_driver_t **input,
|
||||
void **input_data)
|
||||
{
|
||||
unsigned win_width, win_height, temp_width = 0, temp_height = 0;
|
||||
const gfx_ctx_driver_t *ctx_driver = NULL;
|
||||
settings_t *settings = config_get_ptr();
|
||||
gfx_ctx_mode_t mode;
|
||||
gfx_ctx_input_t inp;
|
||||
unsigned interval;
|
||||
|
||||
unsigned win_width;
|
||||
unsigned win_height;
|
||||
unsigned temp_width = 0;
|
||||
unsigned temp_height = 0;
|
||||
const gfx_ctx_driver_t *ctx_driver = NULL;
|
||||
settings_t *settings = config_get_ptr();
|
||||
vk_t *vk = (vk_t*)calloc(1, sizeof(*vk));
|
||||
if (!vk)
|
||||
return NULL;
|
||||
@ -852,8 +907,10 @@ static void *vulkan_init(const video_info_t *video, const input_driver_t **input
|
||||
|
||||
vk->vsync = video->vsync;
|
||||
vk->fullscreen = video->fullscreen;
|
||||
vk->tex_w = vk->tex_h = RARCH_SCALE_BASE * video->input_scale;
|
||||
vk->tex_fmt = video->rgb32 ? VK_FORMAT_B8G8R8A8_UNORM : VK_FORMAT_R5G6B5_UNORM_PACK16;
|
||||
vk->tex_w = RARCH_SCALE_BASE * video->input_scale;
|
||||
vk->tex_h = RARCH_SCALE_BASE * video->input_scale;
|
||||
vk->tex_fmt = video->rgb32
|
||||
? VK_FORMAT_B8G8R8A8_UNORM : VK_FORMAT_R5G6B5_UNORM_PACK16;
|
||||
vk->keep_aspect = video->force_aspect;
|
||||
|
||||
/* Set the viewport to fix recording, since it needs to know
|
||||
@ -916,9 +973,9 @@ static void vulkan_check_swapchain(vk_t *vk)
|
||||
|
||||
static void vulkan_set_nonblock_state(void *data, bool state)
|
||||
{
|
||||
unsigned interval;
|
||||
vk_t *vk = (vk_t*)data;
|
||||
settings_t *settings = config_get_ptr();
|
||||
unsigned interval;
|
||||
|
||||
if (!vk)
|
||||
return;
|
||||
@ -936,9 +993,11 @@ static void vulkan_set_nonblock_state(void *data, bool state)
|
||||
static bool vulkan_alive(void *data)
|
||||
{
|
||||
gfx_ctx_size_t size_data;
|
||||
unsigned temp_width = 0, temp_height = 0;
|
||||
unsigned temp_width = 0;
|
||||
unsigned temp_height = 0;
|
||||
bool ret = false;
|
||||
bool quit = false, resize = false;
|
||||
bool quit = false;
|
||||
bool resize = false;
|
||||
vk_t *vk = (vk_t*)data;
|
||||
|
||||
video_driver_get_size(&temp_width, &temp_height);
|
||||
@ -983,7 +1042,8 @@ static bool vulkan_has_windowed(void *data)
|
||||
return gfx_ctx_ctl(GFX_CTL_HAS_WINDOWED, NULL);
|
||||
}
|
||||
|
||||
static bool vulkan_set_shader(void *data, enum rarch_shader_type type, const char *path)
|
||||
static bool vulkan_set_shader(void *data,
|
||||
enum rarch_shader_type type, const char *path)
|
||||
{
|
||||
vk_t *vk = (vk_t*)data;
|
||||
if (!vk)
|
||||
@ -1015,7 +1075,8 @@ static bool vulkan_set_shader(void *data, enum rarch_shader_type type, const cha
|
||||
return true;
|
||||
}
|
||||
|
||||
static void vulkan_set_projection(vk_t *vk, struct gfx_ortho *ortho, bool allow_rotate)
|
||||
static void vulkan_set_projection(vk_t *vk,
|
||||
struct gfx_ortho *ortho, bool allow_rotate)
|
||||
{
|
||||
math_matrix_4x4 rot;
|
||||
|
||||
@ -1045,7 +1106,8 @@ static void vulkan_set_rotation(void *data, unsigned rotation)
|
||||
vulkan_set_projection(vk, &ortho, true);
|
||||
}
|
||||
|
||||
static void vulkan_set_video_mode(void *data, unsigned width, unsigned height,
|
||||
static void vulkan_set_video_mode(void *data,
|
||||
unsigned width, unsigned height,
|
||||
bool fullscreen)
|
||||
{
|
||||
(void)data;
|
||||
@ -1223,18 +1285,21 @@ static bool vulkan_frame(void *data, const void *frame,
|
||||
uint64_t frame_count,
|
||||
unsigned pitch, const char *msg)
|
||||
{
|
||||
struct vk_per_frame *chain;
|
||||
unsigned width, height;
|
||||
VkClearValue clear_value;
|
||||
vk_t *vk = (vk_t*)data;
|
||||
settings_t *settings = config_get_ptr();
|
||||
static struct retro_perf_counter frame_run = {0};
|
||||
static struct retro_perf_counter copy_frame = {0};
|
||||
static struct retro_perf_counter swapbuffers = {0};
|
||||
static struct retro_perf_counter queue_submit = {0};
|
||||
struct vk_per_frame *chain;
|
||||
unsigned width, height;
|
||||
VkClearValue clear_value;
|
||||
VkCommandBufferBeginInfo begin_info = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO };
|
||||
VkRenderPassBeginInfo rp_info = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO };
|
||||
VkSubmitInfo submit_info = { VK_STRUCTURE_TYPE_SUBMIT_INFO };
|
||||
VkCommandBufferBeginInfo begin_info = {
|
||||
VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO };
|
||||
VkRenderPassBeginInfo rp_info = {
|
||||
VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO };
|
||||
VkSubmitInfo submit_info = {
|
||||
VK_STRUCTURE_TYPE_SUBMIT_INFO };
|
||||
unsigned frame_index = vk->context->current_swapchain_index;
|
||||
|
||||
rarch_perf_init(&frame_run, "frame_run");
|
||||
@ -1326,7 +1391,8 @@ static bool vulkan_frame(void *data, const void *frame,
|
||||
}
|
||||
else
|
||||
{
|
||||
struct vk_texture *tex = &vk->swapchain[vk->last_valid_index].texture;
|
||||
struct vk_texture *tex = &
|
||||
vk->swapchain[vk->last_valid_index].texture;
|
||||
vulkan_transition_texture(vk, tex);
|
||||
|
||||
input.view = tex->view;
|
||||
@ -1340,7 +1406,8 @@ static bool vulkan_frame(void *data, const void *frame,
|
||||
|
||||
vulkan_set_viewport(vk, width, height, false, true);
|
||||
|
||||
vulkan_filter_chain_build_offscreen_passes(vk->filter_chain, vk->cmd, &vk->vk_vp);
|
||||
vulkan_filter_chain_build_offscreen_passes(
|
||||
vk->filter_chain, vk->cmd, &vk->vk_vp);
|
||||
|
||||
/* Render to backbuffer. */
|
||||
clear_value.color.float32[0] = 0.0f;
|
||||
@ -1408,17 +1475,23 @@ static bool vulkan_frame(void *data, const void *frame,
|
||||
* If we're reading back, perform the readback before presenting.
|
||||
*/
|
||||
vulkan_image_layout_transition(vk, vk->cmd, chain->backbuffer.image,
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
|
||||
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
|
||||
VK_ACCESS_TRANSFER_READ_BIT,
|
||||
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT);
|
||||
|
||||
vulkan_readback(vk);
|
||||
|
||||
/* Prepare for presentation after transfers are complete. */
|
||||
vulkan_image_layout_transition(vk, vk->cmd, chain->backbuffer.image,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
|
||||
VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_MEMORY_READ_BIT,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
|
||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
|
||||
VK_ACCESS_TRANSFER_READ_BIT,
|
||||
VK_ACCESS_MEMORY_READ_BIT,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
|
||||
|
||||
vk->readback.pending = false;
|
||||
}
|
||||
@ -1426,9 +1499,12 @@ static bool vulkan_frame(void *data, const void *frame,
|
||||
{
|
||||
/* Prepare backbuffer for presentation. */
|
||||
vulkan_image_layout_transition(vk, vk->cmd, chain->backbuffer.image,
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
|
||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT,
|
||||
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
|
||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
|
||||
VK_ACCESS_MEMORY_READ_BIT,
|
||||
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
|
||||
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
|
||||
}
|
||||
|
||||
vkEndCommandBuffer(vk->cmd);
|
||||
@ -1458,14 +1534,18 @@ static bool vulkan_frame(void *data, const void *frame,
|
||||
submit_info.pWaitDstStageMask = vk->hw.wait_dst_stages;
|
||||
}
|
||||
|
||||
submit_info.signalSemaphoreCount = vk->context->swapchain_semaphores[frame_index] != VK_NULL_HANDLE ? 1 : 0;
|
||||
submit_info.pSignalSemaphores = &vk->context->swapchain_semaphores[frame_index];
|
||||
submit_info.signalSemaphoreCount =
|
||||
vk->context->swapchain_semaphores[frame_index] != VK_NULL_HANDLE ? 1 : 0;
|
||||
submit_info.pSignalSemaphores =
|
||||
&vk->context->swapchain_semaphores[frame_index];
|
||||
|
||||
retro_perf_stop(&frame_run);
|
||||
|
||||
retro_perf_start(&queue_submit);
|
||||
|
||||
slock_lock(vk->context->queue_lock);
|
||||
vkQueueSubmit(vk->context->queue, 1, &submit_info, vk->context->swapchain_fences[frame_index]);
|
||||
vkQueueSubmit(vk->context->queue, 1,
|
||||
&submit_info, vk->context->swapchain_fences[frame_index]);
|
||||
slock_unlock(vk->context->queue_lock);
|
||||
retro_perf_stop(&queue_submit);
|
||||
|
||||
@ -1517,7 +1597,8 @@ static void vulkan_set_aspect_ratio(void *data, unsigned aspect_ratio_idx)
|
||||
if (cmd != RARCH_DISPLAY_CTL_NONE)
|
||||
video_driver_ctl(cmd, NULL);
|
||||
|
||||
video_driver_set_aspect_ratio_value(aspectratio_lut[aspect_ratio_idx].value);
|
||||
video_driver_set_aspect_ratio_value(
|
||||
aspectratio_lut[aspect_ratio_idx].value);
|
||||
|
||||
if (!vk)
|
||||
return;
|
||||
@ -1548,10 +1629,11 @@ static struct video_shader *vulkan_get_current_shader(void *data)
|
||||
return vulkan_filter_chain_get_preset(vk->filter_chain);
|
||||
}
|
||||
|
||||
static bool vulkan_get_current_sw_framebuffer(void *data, struct retro_framebuffer *framebuffer)
|
||||
static bool vulkan_get_current_sw_framebuffer(void *data,
|
||||
struct retro_framebuffer *framebuffer)
|
||||
{
|
||||
vk_t *vk = (vk_t*)data;
|
||||
struct vk_per_frame *chain;
|
||||
vk_t *vk = (vk_t*)data;
|
||||
vk->chain = &vk->swapchain[vk->context->current_swapchain_index];
|
||||
chain = vk->chain;
|
||||
|
||||
@ -1566,10 +1648,12 @@ static bool vulkan_get_current_sw_framebuffer(void *data, struct retro_framebuff
|
||||
|
||||
framebuffer->data = chain->texture.mapped;
|
||||
framebuffer->pitch = chain->texture.stride;
|
||||
framebuffer->format = vk->video.rgb32 ? RETRO_PIXEL_FORMAT_XRGB8888 : RETRO_PIXEL_FORMAT_RGB565;
|
||||
framebuffer->format = vk->video.rgb32
|
||||
? RETRO_PIXEL_FORMAT_XRGB8888 : RETRO_PIXEL_FORMAT_RGB565;
|
||||
|
||||
framebuffer->memory_flags = 0;
|
||||
if (vk->context->memory_properties.memoryTypes[chain->texture.memory_type].propertyFlags &
|
||||
if (vk->context->memory_properties.memoryTypes[
|
||||
chain->texture.memory_type].propertyFlags &
|
||||
VK_MEMORY_PROPERTY_HOST_CACHED_BIT)
|
||||
{
|
||||
framebuffer->memory_flags |= RETRO_MEMORY_TYPE_CACHED;
|
||||
@ -1578,7 +1662,8 @@ static bool vulkan_get_current_sw_framebuffer(void *data, struct retro_framebuff
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool vulkan_get_hw_render_interface(void *data, const struct retro_hw_render_interface **iface)
|
||||
static bool vulkan_get_hw_render_interface(void *data,
|
||||
const struct retro_hw_render_interface **iface)
|
||||
{
|
||||
vk_t *vk = (vk_t*)data;
|
||||
*iface = (const struct retro_hw_render_interface*)&vk->hw.iface;
|
||||
@ -1590,11 +1675,11 @@ static void vulkan_set_texture_frame(void *data,
|
||||
const void *frame, bool rgb32, unsigned width, unsigned height,
|
||||
float alpha)
|
||||
{
|
||||
uint8_t *ptr;
|
||||
unsigned x, y;
|
||||
vk_t *vk = (vk_t*)data;
|
||||
unsigned index = vk->context->current_swapchain_index;
|
||||
struct vk_texture *texture = &vk->menu.textures[index];
|
||||
uint8_t *ptr;
|
||||
unsigned x, y;
|
||||
const VkComponentMapping br_swizzle = {
|
||||
VK_COMPONENT_SWIZZLE_B,
|
||||
VK_COMPONENT_SWIZZLE_G,
|
||||
@ -1650,8 +1735,6 @@ static uintptr_t vulkan_load_texture(void *video_data, void *data,
|
||||
{
|
||||
vk_t *vk = (vk_t*)video_data;
|
||||
struct texture_image *image = (struct texture_image*)data;
|
||||
(void)threaded; /* Pfft. */
|
||||
|
||||
struct vk_texture *texture = (struct vk_texture*)calloc(1, sizeof(*texture));
|
||||
if (!texture)
|
||||
return 0;
|
||||
@ -1718,8 +1801,8 @@ static void vulkan_get_poke_interface(void *data,
|
||||
|
||||
static void vulkan_viewport_info(void *data, struct video_viewport *vp)
|
||||
{
|
||||
vk_t *vk = (vk_t*)data;
|
||||
unsigned width, height;
|
||||
vk_t *vk = (vk_t*)data;
|
||||
|
||||
video_driver_get_size(&width, &height);
|
||||
|
||||
@ -1875,7 +1958,8 @@ static void vulkan_render_overlay(vk_t *vk)
|
||||
4 * sizeof(struct vk_vertex), &range))
|
||||
break;
|
||||
|
||||
memcpy(range.data, &vk->overlay.vertex[i * 4], 4 * sizeof(struct vk_vertex));
|
||||
memcpy(range.data, &vk->overlay.vertex[i * 4],
|
||||
4 * sizeof(struct vk_vertex));
|
||||
|
||||
memset(&call, 0, sizeof(call));
|
||||
call.pipeline = vk->display.pipelines[3]; /* Strip with blend */
|
||||
|
Loading…
x
Reference in New Issue
Block a user