X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fcommands_backend.cpp;h=ff9e6cf62da0ae0b851e11f572dd416cabddd968;hb=d841d557eec57575adc856a8b081042861dab9e8;hp=777d1a6b8b3a17a7ca882c2e9f0a4ea5f82433bf;hpb=1b4d387b74b2108f3926796d8115bee134fbf7f1;p=libs%2Fgl.git diff --git a/source/backends/vulkan/commands_backend.cpp b/source/backends/vulkan/commands_backend.cpp index 777d1a6b..ff9e6cf6 100644 --- a/source/backends/vulkan/commands_backend.cpp +++ b/source/backends/vulkan/commands_backend.cpp @@ -8,8 +8,8 @@ #include "frameformat.h" #include "pipelinestate.h" #include "rect.h" +#include "renderpass.h" #include "semaphore.h" -#include "structurebuilder.h" #include "swapchaintexture.h" #include "vulkan.h" @@ -98,52 +98,20 @@ void VulkanCommands::begin_render_pass(bool clear, const ClearValue *clear_value if(dynamic_cast(framebuffer->get_attachment(i))) fb_is_swapchain = true; - Rect fb_rect = framebuffer->get_rect(); - Rect render_area = fb_rect.intersect(viewport); - bool full_viewport = render_area==fb_rect; - discard_fb_contents = (clear && full_viewport); - framebuffer->refresh(); - VkRenderPass render_pass = device.get_pipeline_cache().get_render_pass(framebuffer->get_format(), - clear, (!clear_values && full_viewport), fb_is_swapchain); - begin_buffer(render_pass); - - StructureBuilder sb(pass_begin_info, 2); - VkRenderPassBeginInfo *const &begin_info = sb.add(1); - VkClearValue *const &vk_clear_values = sb.add(FrameFormat::MAX_ATTACHMENTS); - - begin_info->sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; - begin_info->renderPass = handle_cast<::VkRenderPass>(render_pass); - begin_info->framebuffer = handle_cast<::VkFramebuffer>(framebuffer->handle); + RenderPass render_pass; + render_pass.framebuffer = framebuffer; + render_pass.render_area = viewport; + render_pass.clear = clear; + render_pass.clear_values = clear_values; + render_pass.to_present = fb_is_swapchain; + render_pass.update(device); - begin_info->renderArea.offset.x = render_area.left; - begin_info->renderArea.offset.y = render_area.bottom; - begin_info->renderArea.extent.width = render_area.width; - begin_info->renderArea.extent.height = render_area.height; + discard_fb_contents = render_pass.discard_fb_contents; - if(clear_values) - { - unsigned i = 0; - for(FrameAttachment a: framebuffer->get_format()) - { - if(get_attach_point(a)==get_attach_point(DEPTH_ATTACHMENT)) - vk_clear_values[i].depthStencil.depth = clear_values[i].depth_stencil.depth; - else if(get_attach_point(a)==get_attach_point(STENCIL_ATTACHMENT)) - vk_clear_values[i].depthStencil.stencil = clear_values[i].depth_stencil.stencil; - else - { - vk_clear_values[i].color.float32[0] = clear_values[i].color.r; - vk_clear_values[i].color.float32[1] = clear_values[i].color.g; - vk_clear_values[i].color.float32[2] = clear_values[i].color.b; - vk_clear_values[i].color.float32[3] = clear_values[i].color.a; - } - ++i; - } - - begin_info->clearValueCount = framebuffer->get_format().size(); - begin_info->pClearValues = vk_clear_values; - } + begin_buffer(render_pass.handle); + render_pass.fill_begin_info(pass_begin_info); } void VulkanCommands::end_render_pass()