summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/engines/draw_manager.cpp4
-rw-r--r--src/video_core/host_shaders/full_screen_triangle.vert2
-rw-r--r--src/video_core/renderer_vulkan/blit_image.cpp61
-rw-r--r--src/video_core/renderer_vulkan/blit_image.h4
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp5
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
354void 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
380void 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
355BlitImageHelper::BlitImageHelper(const Device& device_, Scheduler& scheduler_, 400BlitImageHelper::BlitImageHelper(const Device& device_, Scheduler& scheduler_,
@@ -408,18 +453,20 @@ void BlitImageHelper::BlitColor(const Framebuffer* dst_framebuffer, VkImageView
408} 453}
409 454
410void BlitImageHelper::BlitColor(const Framebuffer* dst_framebuffer, VkImageView src_image_view, 455void 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
434void BlitImageHelper::BlitDepthStencil(const Framebuffer* dst_framebuffer, 481void 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
296void RasterizerVulkan::Clear(u32 layer_count) { 297void RasterizerVulkan::Clear(u32 layer_count) {