diff --git a/core/rend/vulkan/drawer.cpp b/core/rend/vulkan/drawer.cpp index a886c3eb0..dda7c1441 100644 --- a/core/rend/vulkan/drawer.cpp +++ b/core/rend/vulkan/drawer.cpp @@ -141,8 +141,9 @@ void Drawer::DrawPoly(const vk::CommandBuffer& cmdBuffer, u32 listType, bool sor trilinearAlpha = 1.f; std::array pushConstants = { 0, 0, 0, 0, trilinearAlpha }; - SetTileClip(poly.tileclip, &pushConstants[0]); - cmdBuffer.pushConstants(pipelineManager->GetPipelineLayout(), vk::ShaderStageFlagBits::eFragment, 0, pushConstants); + int tileClip = SetTileClip(poly.tileclip, &pushConstants[0]); + if (tileClip != 0 || trilinearAlpha != 1.f) + cmdBuffer.pushConstants(pipelineManager->GetPipelineLayout(), vk::ShaderStageFlagBits::eFragment, 0, pushConstants); if (poly.pcw.Texture) GetCurrentDescSet().SetTexture(poly.texid, poly.tsp); @@ -500,7 +501,6 @@ vk::CommandBuffer TextureDrawer::BeginRenderPass() texture->Create(); if (texture->format != vk::Format::eR8G8B8A8Unorm) { - //texture->Init(newWidth, newHeight, format); texture->extent = vk::Extent2D(widthPow2, heightPow2); texture->format = vk::Format::eR8G8B8A8Unorm; texture->CreateImage(vk::ImageTiling::eOptimal, vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eSampled, diff --git a/core/rend/vulkan/pipeline.cpp b/core/rend/vulkan/pipeline.cpp index 59a1ae130..304079aee 100644 --- a/core/rend/vulkan/pipeline.cpp +++ b/core/rend/vulkan/pipeline.cpp @@ -165,7 +165,7 @@ void PipelineManager::CreateModVolPipeline(ModVolMode mode) vk::LogicOp::eNoOp, // logicOp 1, // attachmentCount &pipelineColorBlendAttachmentState, // pAttachments - { { (1.0f, 1.0f, 1.0f, 1.0f) } } // blendConstants + { { 1.0f, 1.0f, 1.0f, 1.0f } } // blendConstants ); vk::DynamicState dynamicStates[2] = { vk::DynamicState::eViewport, vk::DynamicState::eScissor }; @@ -235,7 +235,7 @@ void PipelineManager::CreatePipeline(u32 listType, bool sortTriangles, const Pol // Depth and stencil vk::CompareOp depthOp; - if (listType == ListType_Punch_Through || (listType == ListType_Translucent && sortTriangles)) + if (listType == ListType_Punch_Through || sortTriangles) depthOp = vk::CompareOp::eGreaterOrEqual; else depthOp = depthOps[pp.isp.DepthMode]; @@ -308,7 +308,7 @@ void PipelineManager::CreatePipeline(u32 listType, bool sortTriangles, const Pol vk::LogicOp::eNoOp, // logicOp 1, // attachmentCount &pipelineColorBlendAttachmentState, // pAttachments - { { (1.0f, 1.0f, 1.0f, 1.0f) } } // blendConstants + { { 1.0f, 1.0f, 1.0f, 1.0f } } // blendConstants ); vk::DynamicState dynamicStates[2] = { vk::DynamicState::eViewport, vk::DynamicState::eScissor }; diff --git a/core/rend/vulkan/pipeline.h b/core/rend/vulkan/pipeline.h index 2e397e83f..8b688b50f 100644 --- a/core/rend/vulkan/pipeline.h +++ b/core/rend/vulkan/pipeline.h @@ -245,7 +245,6 @@ public: vk::AttachmentDescription attachmentDescriptions[] = { vk::AttachmentDescription(vk::AttachmentDescriptionFlags(), vk::Format::eR8G8B8A8Unorm, vk::SampleCountFlagBits::e1, vk::AttachmentLoadOp::eClear, vk::AttachmentStoreOp::eStore, vk::AttachmentLoadOp::eDontCare, vk::AttachmentStoreOp::eDontCare, -// vk::ImageLayout::eUndefined, settings.rend.RenderToTextureBuffer ? vk::ImageLayout::eTransferSrcOptimal : vk::ImageLayout::eColorAttachmentOptimal), vk::ImageLayout::eColorAttachmentOptimal, settings.rend.RenderToTextureBuffer ? vk::ImageLayout::eTransferSrcOptimal : vk::ImageLayout::eShaderReadOnlyOptimal), vk::AttachmentDescription(vk::AttachmentDescriptionFlags(), vk::Format::eD32SfloatS8Uint, vk::SampleCountFlagBits::e1, diff --git a/core/rend/vulkan/texture.cpp b/core/rend/vulkan/texture.cpp index 666688d51..69a7adac1 100644 --- a/core/rend/vulkan/texture.cpp +++ b/core/rend/vulkan/texture.cpp @@ -270,8 +270,7 @@ void FramebufferAttachment::Init(u32 width, u32 height, vk::Format format) { usage |= vk::ImageUsageFlagBits::eTransferSrc; stagingBufferData = std::unique_ptr(new BufferData(VulkanContext::Instance()->GetPhysicalDevice(), *VulkanContext::Instance()->GetDevice(), - width * height * 4, vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eTransferDst, - vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent)); + width * height * 4, vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eTransferDst)); } else { diff --git a/core/rend/vulkan/texture.h b/core/rend/vulkan/texture.h index 5fe4ba3d5..3f180a0bd 100644 --- a/core/rend/vulkan/texture.h +++ b/core/rend/vulkan/texture.h @@ -115,134 +115,3 @@ private: vk::PhysicalDevice physicalDevice; vk::Device device; }; - -class RenderToTexture -{ -public: - RenderToTexture() : colorAttachment(VulkanContext::Instance()->GetPhysicalDevice(), *VulkanContext::Instance()->GetDevice()), - depthAttachment(VulkanContext::Instance()->GetPhysicalDevice(), *VulkanContext::Instance()->GetDevice()) - {} - - void PrepareRender(vk::RenderPass rttRenderPass) - { - DEBUG_LOG(RENDERER, "RenderToTexture packmode=%d stride=%d - %d,%d -> %d,%d", FB_W_CTRL.fb_packmode, FB_W_LINESTRIDE.stride * 8, - FB_X_CLIP.min, FB_Y_CLIP.min, FB_X_CLIP.max, FB_Y_CLIP.max); - u32 newWidth = pvrrc.fb_X_CLIP.max - pvrrc.fb_X_CLIP.min + 1; - u32 newHeight = pvrrc.fb_Y_CLIP.max - pvrrc.fb_Y_CLIP.min + 1; - int fbh = 2; - while (fbh < newHeight) - fbh *= 2; - int fbw = 2; - while (fbw < newWidth) - fbw *= 2; - - if (settings.rend.RenderToTextureUpscale > 1 && !settings.rend.RenderToTextureBuffer) - { - newWidth *= settings.rend.RenderToTextureUpscale; - newHeight *= settings.rend.RenderToTextureUpscale; - fbw *= settings.rend.RenderToTextureUpscale; - fbh *= settings.rend.RenderToTextureUpscale; - } - - VulkanContext *context = VulkanContext::Instance(); - if (newWidth != this->width || newHeight != this->height) - { - width = newWidth; - height = newHeight; - colorAttachment.Init(width, height, vk::Format::eR8G8B8A8Unorm); - depthAttachment.Init(width, height, vk::Format::eD32SfloatS8Uint); - vk::ImageView imageViews[] = { - *colorAttachment.GetImageView(), - *depthAttachment.GetImageView(), - }; - framebuffer = context->GetDevice()->createFramebufferUnique(vk::FramebufferCreateInfo(vk::FramebufferCreateFlags(), - rttRenderPass, ARRAY_SIZE(imageViews), imageViews, newWidth, newHeight, 1)); - } - const vk::ClearValue clear_colors[] = { vk::ClearColorValue(std::array{0.f, 0.f, 0.f, 1.f}), vk::ClearDepthStencilValue{ 0.f, 0 } }; - VulkanContext::Instance()->GetCurrentCommandBuffer().beginRenderPass(vk::RenderPassBeginInfo(rttRenderPass, *framebuffer, - vk::Rect2D({0, 0}, {width, height}), 2, clear_colors), vk::SubpassContents::eInline); - VulkanContext::Instance()->GetCurrentCommandBuffer().setViewport(0, vk::Viewport(0.0f, 0.0f, (float)width, (float)height, 1.0f, 0.0f)); - // FIXME if the texture exists, need to transition it first - } - - void EndRender() - { - VulkanContext::Instance()->GetCurrentCommandBuffer().endRenderPass(); - u32 w = pvrrc.fb_X_CLIP.max - pvrrc.fb_X_CLIP.min + 1; - u32 h = pvrrc.fb_Y_CLIP.max - pvrrc.fb_Y_CLIP.min + 1; - - u32 stride = FB_W_LINESTRIDE.stride * 8; - if (stride == 0) - stride = w * 2; - else if (w * 2 > stride) { - // Happens for Virtua Tennis - w = stride / 2; - } - u32 size = w * h * 2; - - const u8 fb_packmode = FB_W_CTRL.fb_packmode; - - if (settings.rend.RenderToTextureBuffer) - { - // wait! need to synchronize buddy! - // FIXME wtf? need a different cmd buffer if writing back to vram PITA - u32 tex_addr = FB_W_SOF1 & VRAM_MASK; - - // Remove all vram locks before calling glReadPixels - // (deadlock on rpi) - u32 page_tex_addr = tex_addr & PAGE_MASK; - u32 page_size = size + tex_addr - page_tex_addr; - page_size = ((page_size - 1) / PAGE_SIZE + 1) * PAGE_SIZE; - for (u32 page = page_tex_addr; page < page_tex_addr + page_size; page += PAGE_SIZE) - VramLockedWriteOffset(page); - - die("Not implemented"); - } - else - { - //memset(&vram[fb_rtt.TexAddr << 3], '\0', size); - } - - if (w > 1024 || h > 1024 || settings.rend.RenderToTextureBuffer) { - // TODO glcache.DeleteTextures(1, &gl.rtt.tex); - } - else - { - // TexAddr : fb_rtt.TexAddr, Reserved : 0, StrideSel : 0, ScanOrder : 1 - TCW tcw = { { (FB_W_SOF1 & VRAM_MASK) >> 3, 0, 0, 1 } }; - switch (fb_packmode) { - case 0: - case 3: - tcw.PixelFmt = Pixel1555; - break; - case 1: - tcw.PixelFmt = Pixel565; - break; - case 2: - tcw.PixelFmt = Pixel4444; - break; - } - TSP tsp = { 0 }; - for (tsp.TexU = 0; tsp.TexU <= 7 && (8 << tsp.TexU) < w; tsp.TexU++); - for (tsp.TexV = 0; tsp.TexV <= 7 && (8 << tsp.TexV) < h; tsp.TexV++); - - Texture* texture = static_cast(getTextureCacheData(tsp, tcw, [](){ - return (BaseTextureCacheData *)new Texture(VulkanContext::Instance()->GetPhysicalDevice(), *VulkanContext::Instance()->GetDevice()); - })); - if (texture->IsNew()) - texture->Create(); - // TODO replace tex vk:: stuff - texture->dirty = 0; - if (texture->lock_block == NULL) - texture->lock_block = libCore_vramlock_Lock(texture->sa_tex, texture->sa + texture->size - 1, texture); - } - } - -private: - u32 width = 0; - u32 height = 0; - - vk::UniqueFramebuffer framebuffer; - FramebufferAttachment colorAttachment; - FramebufferAttachment depthAttachment; -}; diff --git a/core/rend/vulkan/vulkan_context.cpp b/core/rend/vulkan/vulkan_context.cpp index e227bb953..67d6884e8 100644 --- a/core/rend/vulkan/vulkan_context.cpp +++ b/core/rend/vulkan/vulkan_context.cpp @@ -383,6 +383,15 @@ void VulkanContext::CreateSwapChain() // The FIFO present mode is guaranteed by the spec to be supported vk::PresentModeKHR swapchainPresentMode = vk::PresentModeKHR::eFifo; + for (auto& presentMode : physicalDevice.getSurfacePresentModesKHR(surface)) + { + if (presentMode == vk::PresentModeKHR::eMailbox) + { + INFO_LOG(RENDERER, "Using mailbox present mode"); + swapchainPresentMode = vk::PresentModeKHR::eMailbox; + break; + } + } vk::SurfaceTransformFlagBitsKHR preTransform = (surfaceCapabilities.supportedTransforms & vk::SurfaceTransformFlagBitsKHR::eIdentity) ? vk::SurfaceTransformFlagBitsKHR::eIdentity : surfaceCapabilities.currentTransform;