diff options
| -rw-r--r-- | src/video_core/engines/draw_manager.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/host_shaders/full_screen_triangle.vert | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/blit_image.cpp | 61 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/blit_image.h | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 5 |
5 files changed, 62 insertions, 14 deletions
diff --git a/src/video_core/engines/draw_manager.cpp b/src/video_core/engines/draw_manager.cpp index 2685481f9..1d22d25f1 100644 --- a/src/video_core/engines/draw_manager.cpp +++ b/src/video_core/engines/draw_manager.cpp | |||
| @@ -199,10 +199,10 @@ void DrawManager::DrawTexture() { | |||
| 199 | draw_texture_state.src_x0 = static_cast<float>(regs.draw_texture.src_x0) / 4096.f; | 199 | draw_texture_state.src_x0 = static_cast<float>(regs.draw_texture.src_x0) / 4096.f; |
| 200 | draw_texture_state.src_y0 = static_cast<float>(regs.draw_texture.src_y0) / 4096.f; | 200 | draw_texture_state.src_y0 = static_cast<float>(regs.draw_texture.src_y0) / 4096.f; |
| 201 | draw_texture_state.src_x1 = | 201 | draw_texture_state.src_x1 = |
| 202 | (static_cast<float>(regs.draw_texture.dx_du) / 4294967295.f) * dst_width + | 202 | (static_cast<float>(regs.draw_texture.dx_du) / 4294967296.f) * dst_width + |
| 203 | draw_texture_state.src_x0; | 203 | draw_texture_state.src_x0; |
| 204 | draw_texture_state.src_y1 = | 204 | draw_texture_state.src_y1 = |
| 205 | (static_cast<float>(regs.draw_texture.dy_dv) / 4294967295.f) * dst_height + | 205 | (static_cast<float>(regs.draw_texture.dy_dv) / 4294967296.f) * dst_height + |
| 206 | draw_texture_state.src_y0; | 206 | draw_texture_state.src_y0; |
| 207 | draw_texture_state.src_sampler = regs.draw_texture.src_sampler; | 207 | draw_texture_state.src_sampler = regs.draw_texture.src_sampler; |
| 208 | draw_texture_state.src_texture = regs.draw_texture.src_texture; | 208 | draw_texture_state.src_texture = regs.draw_texture.src_texture; |
diff --git a/src/video_core/host_shaders/full_screen_triangle.vert b/src/video_core/host_shaders/full_screen_triangle.vert index 8ac936efd..d16d98995 100644 --- a/src/video_core/host_shaders/full_screen_triangle.vert +++ b/src/video_core/host_shaders/full_screen_triangle.vert | |||
| @@ -32,4 +32,4 @@ void main() { | |||
| 32 | float y = float((VERTEX_ID & 2) << 1); | 32 | float y = float((VERTEX_ID & 2) << 1); |
| 33 | gl_Position = vec4(x - 1.0, FLIPY * (y - 1.0), 0.0, 1.0); | 33 | gl_Position = vec4(x - 1.0, FLIPY * (y - 1.0), 0.0, 1.0); |
| 34 | texcoord = fma(vec2(x, y) / 2.0, tex_scale, tex_offset); | 34 | texcoord = fma(vec2(x, y) / 2.0, tex_scale, tex_offset); |
| 35 | } \ No newline at end of file | 35 | } |
diff --git a/src/video_core/renderer_vulkan/blit_image.cpp b/src/video_core/renderer_vulkan/blit_image.cpp index d728e5c6c..dd00d3edf 100644 --- a/src/video_core/renderer_vulkan/blit_image.cpp +++ b/src/video_core/renderer_vulkan/blit_image.cpp | |||
| @@ -350,6 +350,51 @@ VkExtent2D GetConversionExtent(const ImageView& src_image_view) { | |||
| 350 | .height = is_rescaled ? resolution.ScaleUp(height) : height, | 350 | .height = is_rescaled ? resolution.ScaleUp(height) : height, |
| 351 | }; | 351 | }; |
| 352 | } | 352 | } |
| 353 | |||
| 354 | void TransitionImageLayout(vk::CommandBuffer& cmdbuf, VkImage image, VkImageLayout target_layout, | ||
| 355 | VkImageLayout source_layout = VK_IMAGE_LAYOUT_GENERAL) { | ||
| 356 | constexpr VkFlags flags{VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | | ||
| 357 | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT}; | ||
| 358 | const VkImageMemoryBarrier barrier{ | ||
| 359 | .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, | ||
| 360 | .pNext = nullptr, | ||
| 361 | .srcAccessMask = flags, | ||
| 362 | .dstAccessMask = flags, | ||
| 363 | .oldLayout = source_layout, | ||
| 364 | .newLayout = target_layout, | ||
| 365 | .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, | ||
| 366 | .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, | ||
| 367 | .image = image, | ||
| 368 | .subresourceRange{ | ||
| 369 | .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, | ||
| 370 | .baseMipLevel = 0, | ||
| 371 | .levelCount = 1, | ||
| 372 | .baseArrayLayer = 0, | ||
| 373 | .layerCount = 1, | ||
| 374 | }, | ||
| 375 | }; | ||
| 376 | cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, | ||
| 377 | 0, barrier); | ||
| 378 | } | ||
| 379 | |||
| 380 | void BeginRenderPass(vk::CommandBuffer& cmdbuf, const Framebuffer* framebuffer) { | ||
| 381 | const VkRenderPass render_pass = framebuffer->RenderPass(); | ||
| 382 | const VkFramebuffer framebuffer_handle = framebuffer->Handle(); | ||
| 383 | const VkExtent2D render_area = framebuffer->RenderArea(); | ||
| 384 | const VkRenderPassBeginInfo renderpass_bi{ | ||
| 385 | .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, | ||
| 386 | .pNext = nullptr, | ||
| 387 | .renderPass = render_pass, | ||
| 388 | .framebuffer = framebuffer_handle, | ||
| 389 | .renderArea{ | ||
| 390 | .offset{}, | ||
| 391 | .extent = render_area, | ||
| 392 | }, | ||
| 393 | .clearValueCount = 0, | ||
| 394 | .pClearValues = nullptr, | ||
| 395 | }; | ||
| 396 | cmdbuf.BeginRenderPass(renderpass_bi, VK_SUBPASS_CONTENTS_INLINE); | ||
| 397 | } | ||
| 353 | } // Anonymous namespace | 398 | } // Anonymous namespace |
| 354 | 399 | ||
| 355 | BlitImageHelper::BlitImageHelper(const Device& device_, Scheduler& scheduler_, | 400 | BlitImageHelper::BlitImageHelper(const Device& device_, Scheduler& scheduler_, |
| @@ -408,18 +453,20 @@ void BlitImageHelper::BlitColor(const Framebuffer* dst_framebuffer, VkImageView | |||
| 408 | } | 453 | } |
| 409 | 454 | ||
| 410 | void BlitImageHelper::BlitColor(const Framebuffer* dst_framebuffer, VkImageView src_image_view, | 455 | void BlitImageHelper::BlitColor(const Framebuffer* dst_framebuffer, VkImageView src_image_view, |
| 411 | VkSampler src_sampler, const Region2D& dst_region, | 456 | VkImage src_image, VkSampler src_sampler, |
| 412 | const Region2D& src_region, const Extent3D& src_size) { | 457 | const Region2D& dst_region, const Region2D& src_region, |
| 458 | const Extent3D& src_size) { | ||
| 413 | const BlitImagePipelineKey key{ | 459 | const BlitImagePipelineKey key{ |
| 414 | .renderpass = dst_framebuffer->RenderPass(), | 460 | .renderpass = dst_framebuffer->RenderPass(), |
| 415 | .operation = Tegra::Engines::Fermi2D::Operation::SrcCopy, | 461 | .operation = Tegra::Engines::Fermi2D::Operation::SrcCopy, |
| 416 | }; | 462 | }; |
| 417 | const VkPipelineLayout layout = *one_texture_pipeline_layout; | 463 | const VkPipelineLayout layout = *one_texture_pipeline_layout; |
| 418 | const VkPipeline pipeline = FindOrEmplaceColorPipeline(key); | 464 | const VkPipeline pipeline = FindOrEmplaceColorPipeline(key); |
| 419 | scheduler.RequestRenderpass(dst_framebuffer); | 465 | scheduler.RequestOutsideRenderPassOperationContext(); |
| 420 | scheduler.Record([this, dst_region, src_region, src_size, pipeline, layout, src_sampler, | 466 | scheduler.Record([this, dst_framebuffer, src_image_view, src_image, src_sampler, dst_region, |
| 421 | src_image_view](vk::CommandBuffer cmdbuf) { | 467 | src_region, src_size, pipeline, layout](vk::CommandBuffer cmdbuf) { |
| 422 | // TODO: Barriers | 468 | TransitionImageLayout(cmdbuf, src_image, VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL); |
| 469 | BeginRenderPass(cmdbuf, dst_framebuffer); | ||
| 423 | const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit(); | 470 | const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit(); |
| 424 | UpdateOneTextureDescriptorSet(device, descriptor_set, src_sampler, src_image_view); | 471 | UpdateOneTextureDescriptorSet(device, descriptor_set, src_sampler, src_image_view); |
| 425 | cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); | 472 | cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); |
| @@ -427,8 +474,8 @@ void BlitImageHelper::BlitColor(const Framebuffer* dst_framebuffer, VkImageView | |||
| 427 | nullptr); | 474 | nullptr); |
| 428 | BindBlitState(cmdbuf, layout, dst_region, src_region, src_size); | 475 | BindBlitState(cmdbuf, layout, dst_region, src_region, src_size); |
| 429 | cmdbuf.Draw(3, 1, 0, 0); | 476 | cmdbuf.Draw(3, 1, 0, 0); |
| 477 | cmdbuf.EndRenderPass(); | ||
| 430 | }); | 478 | }); |
| 431 | scheduler.InvalidateState(); | ||
| 432 | } | 479 | } |
| 433 | 480 | ||
| 434 | void BlitImageHelper::BlitDepthStencil(const Framebuffer* dst_framebuffer, | 481 | void BlitImageHelper::BlitDepthStencil(const Framebuffer* dst_framebuffer, |
diff --git a/src/video_core/renderer_vulkan/blit_image.h b/src/video_core/renderer_vulkan/blit_image.h index e2db33f56..be8a9a2f6 100644 --- a/src/video_core/renderer_vulkan/blit_image.h +++ b/src/video_core/renderer_vulkan/blit_image.h | |||
| @@ -39,8 +39,8 @@ public: | |||
| 39 | Tegra::Engines::Fermi2D::Operation operation); | 39 | Tegra::Engines::Fermi2D::Operation operation); |
| 40 | 40 | ||
| 41 | void BlitColor(const Framebuffer* dst_framebuffer, VkImageView src_image_view, | 41 | void BlitColor(const Framebuffer* dst_framebuffer, VkImageView src_image_view, |
| 42 | VkSampler src_sampler, const Region2D& dst_region, const Region2D& src_region, | 42 | VkImage src_image, VkSampler src_sampler, const Region2D& dst_region, |
| 43 | const Extent3D& src_size); | 43 | const Region2D& src_region, const Extent3D& src_size); |
| 44 | 44 | ||
| 45 | void BlitDepthStencil(const Framebuffer* dst_framebuffer, VkImageView src_depth_view, | 45 | void BlitDepthStencil(const Framebuffer* dst_framebuffer, VkImageView src_depth_view, |
| 46 | VkImageView src_stencil_view, const Region2D& dst_region, | 46 | VkImageView src_stencil_view, const Region2D& dst_region, |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 153096fa4..e45512d4f 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -289,8 +289,9 @@ void RasterizerVulkan::DrawTexture() { | |||
| 289 | .y = static_cast<s32>(draw_texture_state.src_y0)}, | 289 | .y = static_cast<s32>(draw_texture_state.src_y0)}, |
| 290 | Offset2D{.x = static_cast<s32>(draw_texture_state.src_x1), | 290 | Offset2D{.x = static_cast<s32>(draw_texture_state.src_x1), |
| 291 | .y = static_cast<s32>(draw_texture_state.src_y1)}}; | 291 | .y = static_cast<s32>(draw_texture_state.src_y1)}}; |
| 292 | blit_image.BlitColor(texture_cache.GetFramebuffer(), texture.RenderTarget(), sampler->Handle(), | 292 | blit_image.BlitColor(texture_cache.GetFramebuffer(), texture.RenderTarget(), |
| 293 | dst_region, src_region, texture.size); | 293 | texture.ImageHandle(), sampler->Handle(), dst_region, src_region, |
| 294 | texture.size); | ||
| 294 | } | 295 | } |
| 295 | 296 | ||
| 296 | void RasterizerVulkan::Clear(u32 layer_count) { | 297 | void RasterizerVulkan::Clear(u32 layer_count) { |