renderer_vulkan: Enable logic ops and fix swapchain resizing

This commit is contained in:
emufan4568
2022-10-10 23:53:11 +03:00
committed by GPUCode
parent 4f9b545296
commit 0eaae31f9f
4 changed files with 21 additions and 26 deletions

View File

@ -414,8 +414,8 @@ vk::Pipeline PipelineCache::BuildPipeline(const PipelineInfo& info) {
vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA};
const vk::PipelineColorBlendStateCreateInfo color_blending = {
.logicOpEnable = info.blending.logic_op_enable.Value(),
.logicOp = PicaToVK::LogicOp(info.blending.logic_op),
.logicOpEnable = !info.blending.blend_enable.Value(),
.logicOp = PicaToVK::LogicOp(info.blending.logic_op.Value()),
.attachmentCount = 1,
.pAttachments = &colorblend_attachment,
.blendConstants = std::array{1.0f, 1.0f, 1.0f, 1.0f}};

View File

@ -61,8 +61,7 @@ union BlendingState {
BitField<16, 4, Pica::FramebufferRegs::BlendFactor> dst_alpha_blend_factor;
BitField<20, 3, Pica::FramebufferRegs::BlendEquation> alpha_blend_eq;
BitField<23, 4, u32> color_write_mask;
BitField<27, 1, u32> logic_op_enable;
BitField<28, 4, Pica::FramebufferRegs::LogicOp> logic_op;
BitField<27, 4, Pica::FramebufferRegs::LogicOp> logic_op;
};
union VertexBinding {

View File

@ -33,15 +33,6 @@ void Swapchain::Create(u32 width, u32 height) {
is_outdated = false;
is_suboptimal = false;
// Destroy the previous image views
vk::Device device = instance.GetDevice();
for (auto& image : swapchain_images) {
if (image.image) {
device.destroyImageView(image.image_view);
device.destroyFramebuffer(image.framebuffer);
}
}
// Fetch information about the provided surface
Configure(width, height);
@ -70,6 +61,7 @@ void Swapchain::Create(u32 width, u32 height) {
.clipped = true,
.oldSwapchain = swapchain};
vk::Device device = instance.GetDevice();
vk::SwapchainKHR new_swapchain = device.createSwapchainKHR(swapchain_info);
// If an old swapchain exists, destroy it and move the new one to its place.
@ -79,6 +71,12 @@ void Swapchain::Create(u32 width, u32 height) {
auto images = device.getSwapchainImagesKHR(swapchain);
// Destroy the previous image views
for (auto& image : swapchain_images) {
device.destroyImageView(image.image_view);
device.destroyFramebuffer(image.framebuffer);
}
swapchain_images.clear();
swapchain_images.resize(images.size());
@ -149,21 +147,13 @@ void Swapchain::Present(vk::Semaphore wait_for_present) {
.pImageIndices = &current_image};
vk::Queue present_queue = instance.GetPresentQueue();
vk::Result result = present_queue.presentKHR(present_info);
switch (result) {
case vk::Result::eSuccess:
break;
case vk::Result::eSuboptimalKHR:
is_suboptimal = true;
LOG_DEBUG(Render_Vulkan, "Suboptimal swapchain");
break;
case vk::Result::eErrorOutOfDateKHR:
try {
[[maybe_unused]] vk::Result result = present_queue.presentKHR(present_info);
} catch (vk::OutOfDateKHRError err) {
is_outdated = true;
break;
default:
} catch (vk::SystemError err) {
LOG_CRITICAL(Render_Vulkan, "Swapchain presentation failed");
break;
UNREACHABLE();
}
}

View File

@ -228,6 +228,10 @@ void TextureRuntime::FormatConvert(const Surface& surface, bool upload, std::spa
switch (surface.pixel_format) {
case VideoCore::PixelFormat::RGBA4:
return Pica::Texture::ConvertRGBA8ToRGBA4(source, dest);
case VideoCore::PixelFormat::RGB8:
return Pica::Texture::ConvertRGBAToBGR(source, dest);
default:
break;
}
}
@ -450,6 +454,8 @@ void TextureRuntime::Transition(vk::CommandBuffer command_buffer, ImageAlloc& al
return;
}
renderpass_cache.ExitRenderpass();
struct LayoutInfo {
vk::AccessFlags access;
vk::PipelineStageFlags stage;