소스 검색

resource: include shader code recursively

Fixes: #346
Daniele Bartolini 10 달 전
부모
커밋
75281d58ff
3개의 변경된 파일24개의 추가작업 그리고 11개의 파일을 삭제
  1. 4 0
      docs/changelog.rst
  2. 19 10
      src/resource/shader_resource.cpp
  3. 1 1
      src/resource/types.h

+ 4 - 0
docs/changelog.rst

@@ -4,6 +4,10 @@ Changelog
 0.56.0 --- DD MMM YYYY
 ----------------------
 
+**Runtime**
+
+* Data Compiler: fixed shaders not including code in some circumnstances.
+
 0.55.0 --- 03 Apr 2025
 ----------------------
 

+ 19 - 10
src/resource/shader_resource.cpp

@@ -1582,6 +1582,20 @@ namespace shader_resource_internal
 			}
 		}
 
+		// Collects code from @a shader and its includes recursively.
+		s32 bgfx_shader_collect_code(StringStream &code, const BgfxShader &shader)
+		{
+			for (u32 i = 0; i < vector::size(shader._includes); ++i) {
+				const BgfxShader included_default(default_allocator());
+				const BgfxShader &included = hash_map::get(_bgfx_shaders, shader._includes[i], included_default);
+				s32 err = bgfx_shader_collect_code(code, included);
+				ENSURE_OR_RETURN(err == 0, _opts);
+			}
+
+			code << shader._code.c_str();
+			return 0;
+		}
+
 		s32 compile_bgfx_shader(const char *bgfx_shader, const Vector<DynamicString> &defines)
 		{
 			TempAllocator512 taa;
@@ -1590,12 +1604,9 @@ namespace shader_resource_internal
 			const BgfxShader shader_default(default_allocator());
 			const BgfxShader &shader = hash_map::get(_bgfx_shaders, key, shader_default);
 
-			StringStream included_code(default_allocator());
-			for (u32 i = 0; i < vector::size(shader._includes); ++i) {
-				const BgfxShader included_default(default_allocator());
-				const BgfxShader &included = hash_map::get(_bgfx_shaders, shader._includes[i], included_default);
-				included_code << included._code.c_str();
-			}
+			StringStream code(default_allocator());
+			s32 err = bgfx_shader_collect_code(code, shader);
+			ENSURE_OR_RETURN(err == 0, _opts);
 
 			// Generate final shader code.
 			StringStream varying_code(default_allocator());
@@ -1605,13 +1616,11 @@ namespace shader_resource_internal
 			varying_code << shader._varying.c_str();
 			// Generate vertex shader.
 			vs_code << shader._vs_input_output.c_str();
-			vs_code << string_stream::c_str(included_code);
-			vs_code << shader._code.c_str();
+			vs_code << string_stream::c_str(code);
 			vs_code << shader._vs_code.c_str();
 			// Generate fragment shader.
 			fs_code << shader._fs_input_output.c_str();
-			fs_code << string_stream::c_str(included_code);
-			fs_code << shader._code.c_str();
+			fs_code << string_stream::c_str(code);
 			fs_code << shader._fs_code.c_str();
 
 			_opts.write_temporary(_vs_src_path.c_str(), vs_code);

+ 1 - 1
src/resource/types.h

@@ -90,7 +90,7 @@ struct Platform
 #define RESOURCE_VERSION_PACKAGE          RESOURCE_VERSION(7)
 #define RESOURCE_VERSION_PHYSICS_CONFIG   RESOURCE_VERSION(3)
 #define RESOURCE_VERSION_SCRIPT           RESOURCE_VERSION(4)
-#define RESOURCE_VERSION_SHADER           RESOURCE_VERSION(14)
+#define RESOURCE_VERSION_SHADER           RESOURCE_VERSION(15)
 #define RESOURCE_VERSION_SOUND            RESOURCE_VERSION(1)
 #define RESOURCE_VERSION_SPRITE_ANIMATION RESOURCE_VERSION(2)
 #define RESOURCE_VERSION_SPRITE           RESOURCE_VERSION(4)