From 6c63ef641de87ed1aed3ae3ab3bad3052109342f Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 10 Jun 2026 09:55:54 +0000 Subject: [PATCH] wip --- src/video_core/host_shaders/CMakeLists.txt | 1 + src/video_core/host_shaders/ssaa.frag | 1 - src/video_core/host_shaders/ssaa.vert | 21 +++++++++++++ .../renderer_vulkan/present/ssaa.cpp | 31 ++++++++++++++----- 4 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 src/video_core/host_shaders/ssaa.vert diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index c7a5882545..c4caa9035d 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -61,6 +61,7 @@ set(SHADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/smaa_neighborhood_blending.vert ${CMAKE_CURRENT_SOURCE_DIR}/smaa_neighborhood_blending.frag ${CMAKE_CURRENT_SOURCE_DIR}/ssaa.frag + ${CMAKE_CURRENT_SOURCE_DIR}/ssaa.vert ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_blit_depth_stencil.frag ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_color_clear.frag ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_color_clear.vert diff --git a/src/video_core/host_shaders/ssaa.frag b/src/video_core/host_shaders/ssaa.frag index 4ab1d04bf6..53adb28bd4 100644 --- a/src/video_core/host_shaders/ssaa.frag +++ b/src/video_core/host_shaders/ssaa.frag @@ -10,7 +10,6 @@ #define BINDING_COLOR_TEXTURE 0 #endif -layout (location = 0) in vec2 texcoord; layout (location = 0) out vec4 frag_color; layout (binding = BINDING_COLOR_TEXTURE) uniform sampler2DMS input_texture; diff --git a/src/video_core/host_shaders/ssaa.vert b/src/video_core/host_shaders/ssaa.vert new file mode 100644 index 0000000000..7fdfe8f235 --- /dev/null +++ b/src/video_core/host_shaders/ssaa.vert @@ -0,0 +1,21 @@ +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#version 450 + +#ifdef VULKAN +#define VERTEX_ID gl_VertexIndex +#define FLIPY 1 +#else // ^^^ Vulkan ^^^ // vvv OpenGL vvv +#define VERTEX_ID gl_VertexID +#define FLIPY -1 +out gl_PerVertex { + vec4 gl_Position; +}; +#endif + +void main() { + float x = float((VERTEX_ID & 1) << 2); + float y = float((VERTEX_ID & 2) << 1); + gl_Position = vec4(x - 1.0, FLIPY * (y - 1.0), 0.0, 1.0); +} diff --git a/src/video_core/renderer_vulkan/present/ssaa.cpp b/src/video_core/renderer_vulkan/present/ssaa.cpp index 4467239751..1a7d4a7fe7 100644 --- a/src/video_core/renderer_vulkan/present/ssaa.cpp +++ b/src/video_core/renderer_vulkan/present/ssaa.cpp @@ -4,12 +4,13 @@ #include "common/common_types.h" #include "video_core/host_shaders/ssaa_frag_spv.h" -#include "video_core/host_shaders/full_screen_triangle_vert_spv.h" +#include "video_core/host_shaders/ssaa_vert_spv.h" #include "video_core/renderer_vulkan/present/ssaa.h" #include "video_core/renderer_vulkan/present/util.h" #include "video_core/renderer_vulkan/vk_scheduler.h" #include "video_core/renderer_vulkan/vk_shader_util.h" #include "video_core/vulkan_common/vulkan_device.h" +#include "vulkan/vulkan_core.h" namespace Vulkan { @@ -33,16 +34,32 @@ SSAA::~SSAA() = default; void SSAA::CreateImages() { for (u32 i = 0; i < m_image_count; i++) { Image& image = m_dynamic_images.emplace_back(); - image.image = CreateWrappedImage(m_allocator, m_extent, VK_FORMAT_R16G16B16A16_SFLOAT); - image.image_view = CreateWrappedImageView(m_device, image.image, VK_FORMAT_R16G16B16A16_SFLOAT); + image.image = m_allocator.CreateImage(VkImageCreateInfo{ + .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .imageType = VK_IMAGE_TYPE_2D, + .format = VK_FORMAT_R8G8B8A8_UNORM, + .extent = {.width = m_extent.width, .height = m_extent.height, .depth = 1}, + .mipLevels = 1, + .arrayLayers = 1, + .samples = VK_SAMPLE_COUNT_2_BIT, + .tiling = VK_IMAGE_TILING_OPTIMAL, + .usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, + .sharingMode = VK_SHARING_MODE_EXCLUSIVE, + .queueFamilyIndexCount = 0, + .pQueueFamilyIndices = nullptr, + .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, + }); + image.image_view = CreateWrappedImageView(m_device, image.image, VK_FORMAT_R8G8B8A8_UNORM); } } void SSAA::CreateRenderPasses() { const VkAttachmentDescription attachment{ .flags = VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT, - .format = VK_FORMAT_R16G16B16A16_SFLOAT, - .samples = VK_SAMPLE_COUNT_4_BIT, + .format = VK_FORMAT_R8G8B8A8_UNORM, + .samples = VK_SAMPLE_COUNT_2_BIT, .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, .storeOp = VK_ATTACHMENT_STORE_OP_STORE, .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD, @@ -96,7 +113,7 @@ void SSAA::CreateSampler() { } void SSAA::CreateShaders() { - m_vertex_shader = CreateWrappedShaderModule(m_device, FULL_SCREEN_TRIANGLE_VERT_SPV); + m_vertex_shader = CreateWrappedShaderModule(m_device, SSAA_VERT_SPV); m_fragment_shader = CreateWrappedShaderModule(m_device, SSAA_FRAG_SPV); } @@ -194,7 +211,7 @@ void SSAA::CreatePipelines() { .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, .pNext = nullptr, .flags = 0, - .rasterizationSamples = VK_SAMPLE_COUNT_4_BIT, + .rasterizationSamples = VK_SAMPLE_COUNT_2_BIT, .sampleShadingEnable = Settings::values.sample_shading.GetValue() > 0 ? VK_TRUE : VK_FALSE, .minSampleShading = f32(Settings::values.sample_shading.GetValue()) / 100.0f, .pSampleMask = nullptr,