diff --git a/.patch/snapdragon_gsr/0001-glslang-fix.patch b/.patch/snapdragon_gsr/0001-glslang-fix.patch new file mode 100644 index 0000000000..2eb0099d64 --- /dev/null +++ b/.patch/snapdragon_gsr/0001-glslang-fix.patch @@ -0,0 +1,61 @@ +diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +index 7074999..69927af 100644 +--- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag ++++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +@@ -1,4 +1,4 @@ +-#version 300 es ++#version 320 es + + //============================================================================================================ + // +@@ -63,9 +63,9 @@ vec2 weightY(float dx, float dy,float c, float std) + + void main() + { +- int mode = OperationMode; +- float edgeThreshold = EdgeThreshold; +- float edgeSharpness = EdgeSharpness; ++ const int mode = OperationMode; ++ const float edgeThreshold = EdgeThreshold; ++ const float edgeSharpness = EdgeSharpness; + + vec4 color; + if(mode == 1) +@@ -93,10 +93,10 @@ void main() + { + coord.x += ViewportInfo[0].x; + +- vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), mode); ++ vec4 right = textureGather(ps0,coord + vec2(ViewportInfo[0].x, 0.0), mode); + vec4 upDown; +- upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),mode).wz; +- upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), mode).yx; ++ upDown.xy = textureGather(ps0,coord + vec2(0.0, -ViewportInfo[0].y),mode).wz; ++ upDown.zw = textureGather(ps0,coord+ vec2(0.0, ViewportInfo[0].y), mode).yx; + + float mean = (left.y+left.z+right.x+right.w)*0.25; + left = left - vec4(mean); +diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +index d2df646..1f1daa6 100644 +--- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag ++++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +@@ -1,4 +1,4 @@ +-#version 300 es ++#version 320 es + + //============================================================================================================ + // +@@ -124,10 +124,10 @@ void main() + { + coord.x += ViewportInfo[0].x; + +- vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), OperationMode); ++ vec4 right = textureGather(ps0,coord + vec2(ViewportInfo[0].x, 0.0), OperationMode); + vec4 upDown; +- upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),OperationMode).wz; +- upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), OperationMode).yx; ++ upDown.xy = textureGather(ps0,coord + vec2(0.0, -ViewportInfo[0].y),OperationMode).wz; ++ upDown.zw = textureGather(ps0,coord+ vec2(0.0, ViewportInfo[0].y), OperationMode).yx; + + float mean = (left.y+left.z+right.x+right.w)*0.25; + left = left - vec4(mean); diff --git a/CMakeLists.txt b/CMakeLists.txt index dbe947c1bf..ae49b5bcd4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -270,6 +270,9 @@ endif() cmake_dependent_option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" ${DEFAULT_YUZU_USE_BUNDLED_OPENSSL} "ENABLE_OPENSSL" OFF) +AddJsonPackage(snapdragon_gsr) + +# TODO(crueter): CPM this if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL) AddJsonPackage(vulkan-validation-layers) diff --git a/cpmfile.json b/cpmfile.json index 80086797af..9daba964a0 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -102,6 +102,15 @@ "artifact": "android-binaries-%VERSION%.zip", "hash": "48167c4a17736301bd08f9290f41830443e1f18cce8ad867fc6f289b49e18b40e93c9850b377951af82f51b5b6d7313aa6a884fc5df79f5ce3df82696c1c1244" }, + "snapdragon_gsr": { + "repo": "SnapdragonStudios/snapdragon-gsr", + "package": "snapdragon_gsr", + "hash": "dsfsdfsd", + "sha": "d926f074bcb9d714e179f1ce0fcb9ee2eeb5074e", + "patches": [ + "0001-glslang-fix.patch" + ] + }, "quazip": { "package": "QuaZip-Qt6", "repo": "stachenov/quazip", diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index 60b399ccba..30daaa9cde 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -2,6 +2,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later set(FIDELITYFX_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/externals/FidelityFX-FSR/ffx-fsr) +set(SNAPDRAGON_GSR_INCLUDE_DIR ${snapdragon_gsr_SOURCE_DIR}/sgsr/v1/include/glsl/) set(FIDELITYFX_FILES ${FIDELITYFX_INCLUDE_DIR}/ffx_a.h @@ -76,6 +77,8 @@ set(SHADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_quad_indexed.comp ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_turbo_mode.comp ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_uint8.comp + ${SNAPDRAGON_GSR_INCLUDE_DIR}/sgsr1_shader_mobile.frag + ${SNAPDRAGON_GSR_INCLUDE_DIR}/sgsr1_shader_mobile_edge_direction.frag ) if (PLATFORM_HAIKU) @@ -145,11 +148,42 @@ foreach(SOURCE_FILE IN ITEMS ${SHADER_FILES}) OUTPUT ${SPIRV_HEADER_FILE} COMMAND - ${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -I"${FIDELITYFX_INCLUDE_DIR}" ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION} + ${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -DUseUniformBlock=1 ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION} MAIN_DEPENDENCY ${SOURCE_FILE} ) set(SHADER_HEADERS ${SHADER_HEADERS} ${SPIRV_HEADER_FILE}) + else() + # Skip generating source headers on Vulkan exclusive files + if (NOT ${FILENAME} MATCHES "vulkan.*" AND NOT ${FILENAME} MATCHES "sgsr1.*") + set(SOURCE_HEADER_FILE ${SHADER_DIR}/${SHADER_NAME}.h) + add_custom_command( + OUTPUT + ${SOURCE_HEADER_FILE} + COMMAND + ${CMAKE_COMMAND} -P ${HEADER_GENERATOR} ${SOURCE_FILE} ${SOURCE_HEADER_FILE} ${INPUT_FILE} + MAIN_DEPENDENCY + ${SOURCE_FILE} + DEPENDS + ${INPUT_FILE} + # HEADER_GENERATOR should be included here but msbuild seems to assume it's always modified + ) + set(SHADER_HEADERS ${SHADER_HEADERS} ${SOURCE_HEADER_FILE}) + endif() + # Skip compiling to SPIR-V OpenGL exclusive files + if (NOT ${FILENAME} MATCHES "opengl.*") + string(TOUPPER ${SHADER_NAME}_SPV SPIRV_VARIABLE_NAME) + set(SPIRV_HEADER_FILE ${SHADER_DIR}/${SHADER_NAME}_spv.h) + add_custom_command( + OUTPUT + ${SPIRV_HEADER_FILE} + COMMAND + ${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -I"${FIDELITYFX_INCLUDE_DIR}" ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION} + MAIN_DEPENDENCY + ${SOURCE_FILE} + ) + set(SHADER_HEADERS ${SHADER_HEADERS} ${SPIRV_HEADER_FILE}) + endif() endif() endforeach()