From 4bfe4e5d4940547fc36301e4e2e6a2b8c69b5249 Mon Sep 17 00:00:00 2001 From: Jason Fielder Date: Thu, 23 Feb 2023 14:25:08 +0100 Subject: [PATCH] Fix: Cycles display without OpenColorIO not working for Metal Cycles fallback display shader previously did not use viewport. This would crash or cause the display not to show when using GPU backends other than OpenGL, if another display shader was unavailable. Now use ShaderCreateInfo for Cycles fallback display. Authored by Apple: Michael Parkin-White Ref #96261 Pull Request #104987 --- intern/cycles/blender/display_driver.cpp | 36 +------------------ source/blender/gpu/CMakeLists.txt | 3 ++ .../gpu_shader_display_fallback_frag.glsl | 5 +++ .../gpu_shader_display_fallback_vert.glsl | 11 ++++++ ...gpu_shader_2D_image_overlays_merge_info.hh | 12 +++++++ 5 files changed, 32 insertions(+), 35 deletions(-) create mode 100644 source/blender/gpu/shaders/gpu_shader_display_fallback_frag.glsl create mode 100644 source/blender/gpu/shaders/gpu_shader_display_fallback_vert.glsl diff --git a/intern/cycles/blender/display_driver.cpp b/intern/cycles/blender/display_driver.cpp index b000c8379b8..ed5053ba415 100644 --- a/intern/cycles/blender/display_driver.cpp +++ b/intern/cycles/blender/display_driver.cpp @@ -54,44 +54,10 @@ int BlenderDisplayShader::get_tex_coord_attrib_location() /* -------------------------------------------------------------------- * BlenderFallbackDisplayShader. */ - -/* TODO move shaders to standalone .glsl file. */ -static const char *FALLBACK_VERTEX_SHADER = - "uniform vec2 fullscreen;\n" - "in vec2 texCoord;\n" - "in vec2 pos;\n" - "out vec2 texCoord_interp;\n" - "\n" - "vec2 normalize_coordinates()\n" - "{\n" - " return (vec2(2.0) * (pos / fullscreen)) - vec2(1.0);\n" - "}\n" - "\n" - "void main()\n" - "{\n" - " gl_Position = vec4(normalize_coordinates(), 0.0, 1.0);\n" - " texCoord_interp = texCoord;\n" - "}\n\0"; - -static const char *FALLBACK_FRAGMENT_SHADER = - "uniform sampler2D image_texture;\n" - "in vec2 texCoord_interp;\n" - "out vec4 fragColor;\n" - "\n" - "void main()\n" - "{\n" - " fragColor = texture(image_texture, texCoord_interp);\n" - "}\n\0"; - static GPUShader *compile_fallback_shader(void) { /* NOTE: Compilation errors are logged to console. */ - GPUShader *shader = GPU_shader_create(FALLBACK_VERTEX_SHADER, - FALLBACK_FRAGMENT_SHADER, - nullptr, - nullptr, - nullptr, - "FallbackCyclesBlitShader"); + GPUShader *shader = GPU_shader_create_from_info_name("gpu_shader_cycles_display_fallback"); return shader; } diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index 4b378384a9d..29dd757b514 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -498,6 +498,9 @@ set(GLSL_SRC shaders/gpu_shader_gpencil_stroke_frag.glsl shaders/gpu_shader_gpencil_stroke_geom.glsl + shaders/gpu_shader_display_fallback_vert.glsl + shaders/gpu_shader_display_fallback_frag.glsl + shaders/gpu_shader_cfg_world_clip_lib.glsl shaders/gpu_shader_colorspace_lib.glsl diff --git a/source/blender/gpu/shaders/gpu_shader_display_fallback_frag.glsl b/source/blender/gpu/shaders/gpu_shader_display_fallback_frag.glsl new file mode 100644 index 00000000000..1676c3a8a75 --- /dev/null +++ b/source/blender/gpu/shaders/gpu_shader_display_fallback_frag.glsl @@ -0,0 +1,5 @@ + +void main() +{ + fragColor = texture(image_texture, texCoord_interp); +} diff --git a/source/blender/gpu/shaders/gpu_shader_display_fallback_vert.glsl b/source/blender/gpu/shaders/gpu_shader_display_fallback_vert.glsl new file mode 100644 index 00000000000..167d22c975d --- /dev/null +++ b/source/blender/gpu/shaders/gpu_shader_display_fallback_vert.glsl @@ -0,0 +1,11 @@ + +vec2 normalize_coordinates() +{ + return (vec2(2.0) * (pos / fullscreen)) - vec2(1.0); +} + +void main() +{ + gl_Position = vec4(normalize_coordinates(), 0.0, 1.0); + texCoord_interp = texCoord; +} diff --git a/source/blender/gpu/shaders/infos/gpu_shader_2D_image_overlays_merge_info.hh b/source/blender/gpu/shaders/infos/gpu_shader_2D_image_overlays_merge_info.hh index 2798846b310..b90cad9ad1e 100644 --- a/source/blender/gpu/shaders/infos/gpu_shader_2D_image_overlays_merge_info.hh +++ b/source/blender/gpu/shaders/infos/gpu_shader_2D_image_overlays_merge_info.hh @@ -22,3 +22,15 @@ GPU_SHADER_CREATE_INFO(gpu_shader_2D_image_overlays_merge) .vertex_source("gpu_shader_2D_image_vert.glsl") .fragment_source("gpu_shader_image_overlays_merge_frag.glsl") .do_static_compilation(true); + +/* Cycles display driver fallback shader. */ +GPU_SHADER_CREATE_INFO(gpu_shader_cycles_display_fallback) + .vertex_in(0, Type::VEC2, "pos") + .vertex_in(1, Type::VEC2, "texCoord") + .vertex_out(smooth_tex_coord_interp_iface) + .fragment_out(0, Type::VEC4, "fragColor") + .push_constant(Type::VEC2, "fullscreen") + .sampler(0, ImageType::FLOAT_2D, "image_texture") + .vertex_source("gpu_shader_display_fallback_vert.glsl") + .fragment_source("gpu_shader_display_fallback_frag.glsl") + .do_static_compilation(true);