diff --git a/.rive_head b/.rive_head index 146d1e89..fc63bc91 100644 --- a/.rive_head +++ b/.rive_head @@ -1 +1 @@ -4d3770866ff47879152e42b967747750fef5c662 +d1c02a29aa51aa11b9759188780ecca84e823deb diff --git a/build/rebuild_shaders.sh b/build/rebuild_shaders.sh index f2ae70be..39be3317 100644 --- a/build/rebuild_shaders.sh +++ b/build/rebuild_shaders.sh @@ -1,19 +1,29 @@ +if [ -z "$RIVE_RENDERER_DIR" ]; then + echo "RIVE_RENDERER_DIR environment variable needs to be set for rebuild_shaders to run" + exit 1 +fi + echo $RIVE_RENDERER_DIR pushd $RIVE_RENDERER_DIR > /dev/null echo Entered dir: $RIVE_RENDERER_DIR # Clean old shader files -dstShaderDir=$1 -echo Cleaning dir: $dstShaderDir -rm -r $dstShaderDir +dst_shader_dir=$1 +echo Cleaning dir: $dst_shader_dir +rm -r $dst_shader_dir + +make_flags="--human-readable" # Find ply curr_dir=`pwd` found_ply_dir=`find ${curr_dir} -type d -wholename "*/dependencies/*/ply-*/src" -print` -echo found ply: $found_ply_dir +if [ -n "$found_ply_dir" ]; then + echo found ply: $found_ply_dir + make_flags="-p ${found_ply_dir} ${make_flags}" +fi # Invoke make -make -C ./src/shaders -j32 OUT=$dstShaderDir FLAGS="-p ${found_ply_dir} --human-readable" spirv-binary +make -C ./src/shaders -j32 OUT=$dst_shader_dir FLAGS="${make_flags}" spirv-binary echo Exiting dir: $RIVE_RENDERER_DIR # Done diff --git a/renderer/path_fiddle/path_fiddle.cpp b/renderer/path_fiddle/path_fiddle.cpp index 7de739d8..cffabbe2 100644 --- a/renderer/path_fiddle/path_fiddle.cpp +++ b/renderer/path_fiddle/path_fiddle.cpp @@ -8,6 +8,7 @@ #include "rive/static_scene.hpp" #include "rive/profiler/profiler_macros.h" +#include #include #include #include @@ -847,7 +848,20 @@ void riveMainLoop() hotloadShaders = false; #ifndef RIVE_BUILD_FOR_IOS - std::system("sh rebuild_shaders.sh /tmp/rive"); + // We want to build to /tmp/rive (or the correct equivalent) + std::filesystem::path tempRiveDir = + std::filesystem::temp_directory_path() / "rive"; + + // Get the u8 version of the path (this is especially necessary on + // windows where the native path character type is wchar_t, then + // reinterpret_cast the char8_t pointer to char so we can append it to + // our string. + const char* tempRiveDirPtr = + reinterpret_cast(tempRiveDir.u8string().c_str()); + + std::string rebuildCommand = + std::string{"sh rebuild_shaders.sh "} + tempRiveDirPtr; + std::system(rebuildCommand.c_str()); #endif fiddleContext->hotloadShaders(); } diff --git a/renderer/shader_hotload/shader_hotload.cpp b/renderer/shader_hotload/shader_hotload.cpp index 14514bb3..24d14fbb 100644 --- a/renderer/shader_hotload/shader_hotload.cpp +++ b/renderer/shader_hotload/shader_hotload.cpp @@ -109,18 +109,21 @@ rive::Span loadNewShaderFileData() riveSpirvPath / "draw_clockwise_image_mesh.vert.spirv", riveSpirvPath / "draw_clockwise_image_mesh.frag.spirv", - riveSpirvPath / "draw_msaa_path.vert", - riveSpirvPath / "draw_msaa_path.frag", - riveSpirvPath / "draw_msaa_path.fixedcolor_frag", - riveSpirvPath / "draw_msaa_stencil.vert", - riveSpirvPath / "draw_msaa_stencil.frag", - riveSpirvPath / "draw_msaa_stencil.fixedcolor_frag", - riveSpirvPath / "draw_msaa_atlas_blit.vert", - riveSpirvPath / "draw_msaa_atlas_blit.frag", - riveSpirvPath / "draw_msaa_atlas_blit.fixedcolor_frag", - riveSpirvPath / "draw_msaa_image_mesh.vert", - riveSpirvPath / "draw_msaa_image_mesh.frag", - riveSpirvPath / "draw_msaa_image_mesh.fixedcolor_frag", + riveSpirvPath / "draw_msaa_path.vert.spirv", + riveSpirvPath / "draw_msaa_path.noclipdistance_vert.spirv", + riveSpirvPath / "draw_msaa_path.frag.spirv", + riveSpirvPath / "draw_msaa_path.fixedcolor_frag.spirv", + riveSpirvPath / "draw_msaa_stencil.vert.spirv", + riveSpirvPath / "draw_msaa_stencil.frag.spirv", + riveSpirvPath / "draw_msaa_stencil.fixedcolor_frag.spirv", + riveSpirvPath / "draw_msaa_atlas_blit.vert.spirv", + riveSpirvPath / "draw_msaa_atlas_blit.noclipdistance_vert.spirv", + riveSpirvPath / "draw_msaa_atlas_blit.frag.spirv", + riveSpirvPath / "draw_msaa_atlas_blit.fixedcolor_frag.spirv", + riveSpirvPath / "draw_msaa_image_mesh.vert.spirv", + riveSpirvPath / "draw_msaa_image_mesh.noclipdistance_vert.spirv", + riveSpirvPath / "draw_msaa_image_mesh.frag.spirv", + riveSpirvPath / "draw_msaa_image_mesh.fixedcolor_frag.spirv", }; constexpr size_t numFiles = std::size(spirvFileNames); diff --git a/renderer/src/shaders/Makefile b/renderer/src/shaders/Makefile index 181b7ac2..ba0e8044 100644 --- a/renderer/src/shaders/Makefile +++ b/renderer/src/shaders/Makefile @@ -168,7 +168,10 @@ SPIRV_OUTPUTS_HEADERS := \ $(OUT)/spirv/draw_interior_triangles.webgpu_frag.h \ $(OUT)/spirv/draw_atlas_blit.webgpu_vert.h \ $(OUT)/spirv/draw_atlas_blit.webgpu_frag.h \ - $(OUT)/spirv/draw_image_mesh.webgpu_frag.h + $(OUT)/spirv/draw_image_mesh.webgpu_frag.h \ + $(OUT)/spirv/draw_msaa_path.noclipdistance_vert.h \ + $(OUT)/spirv/draw_msaa_image_mesh.noclipdistance_vert.h \ + $(OUT)/spirv/draw_msaa_atlas_blit.noclipdistance_vert.h \ SPIRV_OUTPUTS_BINARY := \ $(addprefix $(OUT)/, $(patsubst %.main, %.vert.spirv, $(wildcard spirv/*.main))) \ @@ -184,8 +187,11 @@ SPIRV_OUTPUTS_BINARY := \ $(OUT)/spirv/draw_msaa_atlas_blit.fixedcolor_frag.spirv \ $(OUT)/spirv/draw_msaa_image_mesh.fixedcolor_frag.spirv \ $(OUT)/spirv/draw_msaa_path.fixedcolor_frag.spirv \ - $(OUT)/spirv/draw_msaa_stencil.fixedcolor_frag.spirv - + $(OUT)/spirv/draw_msaa_stencil.fixedcolor_frag.spirv \ + $(OUT)/spirv/draw_msaa_path.noclipdistance_vert.spirv \ + $(OUT)/spirv/draw_msaa_atlas_blit.noclipdistance_vert.spirv \ + $(OUT)/spirv/draw_msaa_image_mesh.noclipdistance_vert.spirv \ + ## Compile *.main into vertex shaders. First rule generates the binary spirv, then the .h file after. $(OUT)/spirv/%.vert.spirv: spirv/%.main $(MINIFY_STAMP) @mkdir -p $(OUT)/spirv @@ -213,6 +219,15 @@ $(OUT)/spirv/%.fixedcolor_frag.h: spirv/%.main $(MINIFY_STAMP) @mkdir -p $(OUT)/spirv @glslangValidator -S frag -DTARGET_VULKAN -DFRAGMENT -DPLS_IMPL_SUBPASS_LOAD -DFIXED_FUNCTION_COLOR_OUTPUT -I$(OUT) -V --vn $(subst .main,_fixedcolor_frag,$(notdir $<)) -o $@ $< +## Compile msaa vertex shaders again with DISABLE_CLIP_RECT_FOR_VULKAN_MSAA defined. +$(OUT)/spirv/%.noclipdistance_vert.spirv: spirv/%.main $(MINIFY_STAMP) + @mkdir -p $(OUT)/spirv + @glslangValidator -S vert -DTARGET_VULKAN -DVERTEX -DDISABLE_CLIP_RECT_FOR_VULKAN_MSAA -I$(OUT) -V -o $@ $< + +$(OUT)/spirv/%.noclipdistance_vert.h: spirv/%.main $(MINIFY_STAMP) + @mkdir -p $(OUT)/spirv + @glslangValidator -S vert -DTARGET_VULKAN -DVERTEX -DDISABLE_CLIP_RECT_FOR_VULKAN_MSAA -I$(OUT) -V --vn $(subst .main,_noclipdistance_vert,$(notdir $<)) -o $@ $< + ## Compile *.vert into vertex shaders. $(OUT)/spirv/%.vert.spirv: spirv/%.vert $(MINIFY_STAMP) @mkdir -p $(OUT)/spirv diff --git a/renderer/src/shaders/draw_image_mesh.glsl b/renderer/src/shaders/draw_image_mesh.glsl index ea8183ae..c732d405 100644 --- a/renderer/src/shaders/draw_image_mesh.glsl +++ b/renderer/src/shaders/draw_image_mesh.glsl @@ -17,7 +17,7 @@ NO_PERSPECTIVE VARYING(0, float2, v_texCoord); #ifdef @ENABLE_CLIPPING @OPTIONALLY_FLAT VARYING(1, half, v_clipID); #endif -#ifdef @ENABLE_CLIP_RECT +#if defined(@ENABLE_CLIP_RECT) && !defined(@RENDER_MODE_MSAA) NO_PERSPECTIVE VARYING(2, float4, v_clipRect); #endif VARYING_BLOCK_END @@ -40,7 +40,7 @@ IMAGE_MESH_VERTEX_MAIN(@drawVertexMain, #ifdef @ENABLE_CLIPPING VARYING_INIT(v_clipID, half); #endif -#ifdef @ENABLE_CLIP_RECT +#if defined(@ENABLE_CLIP_RECT) && !defined(@RENDER_MODE_MSAA) VARYING_INIT(v_clipRect, float4); #endif diff --git a/renderer/src/shaders/draw_path.glsl b/renderer/src/shaders/draw_path.glsl index d6ccd2ff..b585d32a 100644 --- a/renderer/src/shaders/draw_path.glsl +++ b/renderer/src/shaders/draw_path.glsl @@ -45,7 +45,7 @@ NO_PERSPECTIVE VARYING(2, half2, v_coverages); #ifdef @ENABLE_CLIPPING @OPTIONALLY_FLAT VARYING(4, half2, v_clipIDs); // [clipID, outerClipID] #endif -#ifdef @ENABLE_CLIP_RECT +#if defined(@ENABLE_CLIP_RECT) && !defined(@RENDER_MODE_MSAA) NO_PERSPECTIVE VARYING(5, float4, v_clipRect); #endif #ifdef @ENABLE_ADVANCED_BLEND @@ -81,7 +81,7 @@ VERTEX_MAIN(@drawVertexMain, Attrs, attrs, _vertexID, _instanceID) #ifdef @ENABLE_CLIPPING VARYING_INIT(v_clipIDs, half2); #endif -#ifdef @ENABLE_CLIP_RECT +#if defined(@ENABLE_CLIP_RECT) && !defined(@RENDER_MODE_MSAA) VARYING_INIT(v_clipRect, float4); #endif #ifdef @ENABLE_ADVANCED_BLEND diff --git a/renderer/src/shaders/minify.py b/renderer/src/shaders/minify.py index 57fe3f89..05293820 100644 --- a/renderer/src/shaders/minify.py +++ b/renderer/src/shaders/minify.py @@ -35,17 +35,21 @@ parser.add_argument("-o", "--outdir", required=True, help="OUTPUT directory to store the header files") parser.add_argument("-H", "--human-readable", action='store_true', help="don't rename or strip out comments or whitespace") -parser.add_argument("-p", "--ply-path", required=True, type=str, help="path to ply module") +parser.add_argument("-p", "--ply-path", type=str, help="path to ply module") args = parser.parse_args() -# Convert posix path to windows -convertedPath = args.ply_path -if sys.platform.startswith('win32') and args.ply_path[:2] == '/c': - convertedPath = 'C:\\' + args.ply_path[2:] - print('Using ply path:' + convertedPath) +if args.ply_path: + # --ply-path was specified, so add it to the sys path so we can locate the module. + # (if it was not specified we'll assume that it's already reachable via the path) -sys.path.append(convertedPath) + # Convert posix path to windows + convertedPath = args.ply_path + if sys.platform.startswith('win32') and args.ply_path[:2] == '/c': + convertedPath = 'C:\\' + args.ply_path[2:] + print('Using ply path:' + convertedPath) + + sys.path.append(convertedPath) import ply.lex as lex diff --git a/renderer/src/shaders/specialization.glsl b/renderer/src/shaders/specialization.glsl index e5ee7c24..7d1b1335 100644 --- a/renderer/src/shaders/specialization.glsl +++ b/renderer/src/shaders/specialization.glsl @@ -22,7 +22,17 @@ layout(constant_id = VULKAN_VENDOR_ID_SPECIALIZATION_IDX) const uint kVulkanVendorID = 0; #define @ENABLE_CLIPPING kEnableClipping + +// MSAA uses gl_ClipDistance when ENABLE_CLIP_RECT is set, but since Vulkan is +// using specialization constants (as opposed to compile-time flags), it means +// that the usage of them is in the compiled shader even if that codepath is +// not going to be taken, which ends up as a validation failure on systems that +// do not support that extension. In those cases, we can just not define +// ENABLE_CLIP_RECT to avoid all of the gl_ClipDistance usages. +#ifndef @DISABLE_CLIP_RECT_FOR_VULKAN_MSAA #define @ENABLE_CLIP_RECT kEnableClipRect +#endif + #define @ENABLE_ADVANCED_BLEND kEnableAdvancedBlend #define @ENABLE_FEATHER kEnableFeather #define @ENABLE_EVEN_ODD kEnableEvenOdd diff --git a/renderer/src/shaders/spirv/draw_msaa_stencil.main b/renderer/src/shaders/spirv/draw_msaa_stencil.main index 424628e1..88c90f02 100644 --- a/renderer/src/shaders/spirv/draw_msaa_stencil.main +++ b/renderer/src/shaders/spirv/draw_msaa_stencil.main @@ -3,6 +3,11 @@ #extension GL_EXT_samplerless_texture_functions : require #define OPTIONALLY_FLAT flat #define RENDER_MODE_MSAA + +// This shader doesn't need ENABLE_CLIP_RECT functionality. Disable it so that +// it does not fail to compile on systems without ClipDistance support. +#define DISABLE_CLIP_RECT_FOR_VULKAN_MSAA + #include "glsl.minified.glsl" #include "constants.minified.glsl" #include "specialization.minified.glsl" diff --git a/renderer/src/vulkan/draw_shader_vulkan.cpp b/renderer/src/vulkan/draw_shader_vulkan.cpp index 75871fa5..e35a17d3 100644 --- a/renderer/src/vulkan/draw_shader_vulkan.cpp +++ b/renderer/src/vulkan/draw_shader_vulkan.cpp @@ -203,7 +203,10 @@ DrawShaderVulkan::DrawShaderVulkan(Type type, case DrawType::msaaMidpointFanStencilReset: case DrawType::msaaMidpointFanPathsStencil: case DrawType::msaaMidpointFanPathsCover: - vertCode = spirv::draw_msaa_path_vert; + vertCode = + (shaderFeatures & ShaderFeatures::ENABLE_CLIP_RECT) + ? spirv::draw_msaa_path_vert + : spirv::draw_msaa_path_noclipdistance_vert; fragCode = fixedFunctionColorOutput ? spirv::draw_msaa_path_fixedcolor_frag : spirv::draw_msaa_path_frag; @@ -220,14 +223,20 @@ DrawShaderVulkan::DrawShaderVulkan(Type type, break; case DrawType::atlasBlit: - vertCode = spirv::draw_msaa_atlas_blit_vert; + vertCode = + (shaderFeatures & ShaderFeatures::ENABLE_CLIP_RECT) + ? spirv::draw_msaa_atlas_blit_vert + : spirv::draw_msaa_atlas_blit_noclipdistance_vert; fragCode = fixedFunctionColorOutput ? spirv::draw_msaa_atlas_blit_fixedcolor_frag : spirv::draw_msaa_atlas_blit_frag; break; case DrawType::imageMesh: - vertCode = spirv::draw_msaa_image_mesh_vert; + vertCode = + (shaderFeatures & ShaderFeatures::ENABLE_CLIP_RECT) + ? spirv::draw_msaa_image_mesh_vert + : spirv::draw_msaa_image_mesh_noclipdistance_vert; fragCode = fixedFunctionColorOutput ? spirv::draw_msaa_image_mesh_fixedcolor_frag : spirv::draw_msaa_image_mesh_frag; diff --git a/renderer/src/vulkan/vulkan_shaders.cpp b/renderer/src/vulkan/vulkan_shaders.cpp index 8e16fb61..6cdcac19 100644 --- a/renderer/src/vulkan/vulkan_shaders.cpp +++ b/renderer/src/vulkan/vulkan_shaders.cpp @@ -63,15 +63,18 @@ namespace embedded #include "generated/shaders/spirv/draw_msaa_path.vert.h" #include "generated/shaders/spirv/draw_msaa_path.frag.h" #include "generated/shaders/spirv/draw_msaa_path.fixedcolor_frag.h" +#include "generated/shaders/spirv/draw_msaa_path.noclipdistance_vert.h" #include "generated/shaders/spirv/draw_msaa_stencil.vert.h" #include "generated/shaders/spirv/draw_msaa_stencil.frag.h" #include "generated/shaders/spirv/draw_msaa_stencil.fixedcolor_frag.h" #include "generated/shaders/spirv/draw_msaa_atlas_blit.vert.h" #include "generated/shaders/spirv/draw_msaa_atlas_blit.frag.h" #include "generated/shaders/spirv/draw_msaa_atlas_blit.fixedcolor_frag.h" +#include "generated/shaders/spirv/draw_msaa_atlas_blit.noclipdistance_vert.h" #include "generated/shaders/spirv/draw_msaa_image_mesh.vert.h" #include "generated/shaders/spirv/draw_msaa_image_mesh.frag.h" #include "generated/shaders/spirv/draw_msaa_image_mesh.fixedcolor_frag.h" +#include "generated/shaders/spirv/draw_msaa_image_mesh.noclipdistance_vert.h" } // namespace embedded // Draw setup shaders. @@ -171,6 +174,8 @@ rive::Span draw_clockwise_image_mesh_frag = // InterlockMode::msaa shaders. rive::Span draw_msaa_path_vert = rive::make_span(embedded::draw_msaa_path_vert); +rive::Span draw_msaa_path_noclipdistance_vert = + rive::make_span(embedded::draw_msaa_path_noclipdistance_vert); rive::Span draw_msaa_path_frag = rive::make_span(embedded::draw_msaa_path_frag); rive::Span draw_msaa_path_fixedcolor_frag = @@ -183,12 +188,16 @@ rive::Span draw_msaa_stencil_fixedcolor_frag = rive::make_span(embedded::draw_msaa_stencil_fixedcolor_frag); rive::Span draw_msaa_atlas_blit_vert = rive::make_span(embedded::draw_msaa_atlas_blit_vert); +rive::Span draw_msaa_atlas_blit_noclipdistance_vert = + rive::make_span(embedded::draw_msaa_atlas_blit_noclipdistance_vert); rive::Span draw_msaa_atlas_blit_frag = rive::make_span(embedded::draw_msaa_atlas_blit_frag); rive::Span draw_msaa_atlas_blit_fixedcolor_frag = rive::make_span(embedded::draw_msaa_atlas_blit_fixedcolor_frag); rive::Span draw_msaa_image_mesh_vert = rive::make_span(embedded::draw_msaa_image_mesh_vert); +rive::Span draw_msaa_image_mesh_noclipdistance_vert = + rive::make_span(embedded::draw_msaa_image_mesh_noclipdistance_vert); rive::Span draw_msaa_image_mesh_frag = rive::make_span(embedded::draw_msaa_image_mesh_frag); rive::Span draw_msaa_image_mesh_fixedcolor_frag = @@ -253,15 +262,18 @@ void hotload_shaders(rive::Span spirvData) spirv::draw_clockwise_image_mesh_frag = readNextBytecodeSpan(); spirv::draw_msaa_path_vert = readNextBytecodeSpan(); + spirv::draw_msaa_path_noclipdistance_vert = readNextBytecodeSpan(); spirv::draw_msaa_path_frag = readNextBytecodeSpan(); spirv::draw_msaa_path_fixedcolor_frag = readNextBytecodeSpan(); spirv::draw_msaa_stencil_vert = readNextBytecodeSpan(); spirv::draw_msaa_stencil_frag = readNextBytecodeSpan(); spirv::draw_msaa_stencil_fixedcolor_frag = readNextBytecodeSpan(); spirv::draw_msaa_atlas_blit_vert = readNextBytecodeSpan(); + spirv::draw_msaa_atlas_blit_noclipdistance_vert = readNextBytecodeSpan(); spirv::draw_msaa_atlas_blit_frag = readNextBytecodeSpan(); spirv::draw_msaa_atlas_blit_fixedcolor_frag = readNextBytecodeSpan(); spirv::draw_msaa_image_mesh_vert = readNextBytecodeSpan(); + spirv::draw_msaa_image_mesh_noclipdistance_vert = readNextBytecodeSpan(); spirv::draw_msaa_image_mesh_frag = readNextBytecodeSpan(); spirv::draw_msaa_image_mesh_fixedcolor_frag = readNextBytecodeSpan(); } diff --git a/renderer/src/vulkan/vulkan_shaders.hpp b/renderer/src/vulkan/vulkan_shaders.hpp index ddd27a7f..f22ec018 100644 --- a/renderer/src/vulkan/vulkan_shaders.hpp +++ b/renderer/src/vulkan/vulkan_shaders.hpp @@ -63,15 +63,18 @@ extern rive::Span draw_clockwise_image_mesh_frag; // InterlockMode::msaa shaders. extern rive::Span draw_msaa_path_vert; +extern rive::Span draw_msaa_path_noclipdistance_vert; extern rive::Span draw_msaa_path_frag; extern rive::Span draw_msaa_path_fixedcolor_frag; extern rive::Span draw_msaa_stencil_vert; extern rive::Span draw_msaa_stencil_frag; extern rive::Span draw_msaa_stencil_fixedcolor_frag; extern rive::Span draw_msaa_atlas_blit_vert; +extern rive::Span draw_msaa_atlas_blit_noclipdistance_vert; extern rive::Span draw_msaa_atlas_blit_frag; extern rive::Span draw_msaa_atlas_blit_fixedcolor_frag; extern rive::Span draw_msaa_image_mesh_vert; +extern rive::Span draw_msaa_image_mesh_noclipdistance_vert; extern rive::Span draw_msaa_image_mesh_frag; extern rive::Span draw_msaa_image_mesh_fixedcolor_frag;