[Bf-blender-cvs] [48b82a6ea31] master: Fix Metal GPU backend shader compile errors in certain language environments

Tomoaki Nakano noreply at git.blender.org
Mon Jan 23 16:56:38 CET 2023


Commit: 48b82a6ea312b7dca0e9c8c97e26eb56ff46ddb6
Author: Tomoaki Nakano
Date:   Mon Jan 23 16:55:34 2023 +0100
Branches: master
https://developer.blender.org/rB48b82a6ea312b7dca0e9c8c97e26eb56ff46ddb6

Fix Metal GPU backend shader compile errors in certain language environments

This patch fixes an issue where Blender 3.5 alpha with the Metal GPU backend enabled on Japanese macOS fails to compile shaders and crashes on startup.

In a Japanese environment, `defaultCStringEncoding` is the legacy MacJapanese encoding, and it erroneously converts backslashes (0x5c) to Yen symbols (¥).
Therefore, Metal shader compile fails with the following log and Blender crashes.
```
2022-12-29 13:50:10.200 Blender[13404:246707] Compile Error - Metal Shader Library (Stage: 0), error Error Domain=MTLLibraryErrorDomain Code=3 "program_source:225:74: error: non-ASCII characters are not allowed outside of literals and identifiers
    template<typename T, access A = access::sample> struct STRUCT_NAME { ¥
                                                                         ^
program_source:226:14: error: no template named 'TEX_TYPE'
      thread TEX_TYPE<T, A> *texture; ¥
             ^
program_source:226:39: error: non-ASCII characters are not allowed outside of literals and identifiers
      thread TEX_TYPE<T, A> *texture; ¥
                                      ^
program_source:227:29: error: non-ASCII characters are not allowed outside of literals and identifiers
      thread sampler *samp; ¥
                            ^
...
```
We can use `stringWithUTF8String` instead.

Reviewed By: fclem, MichaelPW

Differential Revision: https://developer.blender.org/D16881

===================================================================

M	source/blender/gpu/metal/mtl_shader_generator.mm

===================================================================

diff --git a/source/blender/gpu/metal/mtl_shader_generator.mm b/source/blender/gpu/metal/mtl_shader_generator.mm
index 006e0fbd9cf..fbdf9422ced 100644
--- a/source/blender/gpu/metal/mtl_shader_generator.mm
+++ b/source/blender/gpu/metal/mtl_shader_generator.mm
@@ -1049,12 +1049,10 @@ bool MTLShader::generate_msl_from_glsl(const shader::ShaderCreateInfo *info)
 #endif
 
   /* Set MSL source NSString's. Required by Metal API. */
-  NSString *msl_final_vert = [NSString stringWithCString:ss_vertex.str().c_str()
-                                                encoding:[NSString defaultCStringEncoding]];
+  NSString *msl_final_vert = [NSString stringWithUTF8String:ss_vertex.str().c_str()];
   NSString *msl_final_frag = (msl_iface.uses_transform_feedback) ?
                                  (@"") :
-                                 ([NSString stringWithCString:ss_fragment.str().c_str()
-                                                     encoding:[NSString defaultCStringEncoding]]);
+                                 ([NSString stringWithUTF8String:ss_fragment.str().c_str()]);
 
   this->shader_source_from_msl(msl_final_vert, msl_final_frag);
   shader_debug_printf("[METAL] BSL Converted into MSL\n");



More information about the Bf-blender-cvs mailing list