|
|
@@ -39,6 +39,22 @@ void* ShaderManager::load(File& file, Allocator& a)
|
|
|
u64 render_state;
|
|
|
br.read(render_state);
|
|
|
|
|
|
+ u32 num_samplers;
|
|
|
+ br.read(num_samplers);
|
|
|
+ CE_ENSURE(num_samplers < countof(sr->_data[i].samplers));
|
|
|
+
|
|
|
+ for (u32 s = 0; s < num_samplers; ++s)
|
|
|
+ {
|
|
|
+ u32 sampler_name;
|
|
|
+ br.read(sampler_name);
|
|
|
+
|
|
|
+ u32 sampler_state;
|
|
|
+ br.read(sampler_state);
|
|
|
+
|
|
|
+ sr->_data[i].samplers[s].name = sampler_name;
|
|
|
+ sr->_data[i].samplers[s].state = sampler_state;
|
|
|
+ }
|
|
|
+
|
|
|
u32 vs_code_size;
|
|
|
br.read(vs_code_size);
|
|
|
const bgfx::Memory* vsmem = bgfx::alloc(vs_code_size);
|
|
|
@@ -73,7 +89,7 @@ void ShaderManager::online(StringId64 id, ResourceManager& rm)
|
|
|
bgfx::ProgramHandle program = bgfx::createProgram(vs, fs, true);
|
|
|
CE_ASSERT(bgfx::isValid(program), "Failed to create GPU program");
|
|
|
|
|
|
- add_shader(data.name, data.state, program);
|
|
|
+ add_shader(data.name, data.state, data.samplers, program);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -101,14 +117,33 @@ void ShaderManager::unload(Allocator& a, void* res)
|
|
|
CE_DELETE(a, (ShaderResource*)res);
|
|
|
}
|
|
|
|
|
|
-void ShaderManager::add_shader(StringId32 name, u64 state, bgfx::ProgramHandle program)
|
|
|
+void ShaderManager::add_shader(StringId32 name, u64 state, const ShaderResource::Sampler samplers[4], bgfx::ProgramHandle program)
|
|
|
{
|
|
|
ShaderData sd;
|
|
|
sd.state = state;
|
|
|
+ memcpy(sd.samplers, samplers, sizeof(sd.samplers));
|
|
|
sd.program = program;
|
|
|
hash_map::set(_shader_map, name, sd);
|
|
|
}
|
|
|
|
|
|
+u32 ShaderManager::sampler_state(StringId32 shader_id, StringId32 sampler_name)
|
|
|
+{
|
|
|
+ CE_ASSERT(hash_map::has(_shader_map, shader_id), "Shader not found");
|
|
|
+ ShaderData sd;
|
|
|
+ sd.state = BGFX_STATE_DEFAULT;
|
|
|
+ sd.program = BGFX_INVALID_HANDLE;
|
|
|
+ sd = hash_map::get(_shader_map, shader_id, sd);
|
|
|
+
|
|
|
+ for (u32 i = 0; i < countof(sd.samplers); ++i)
|
|
|
+ {
|
|
|
+ if (sd.samplers[i].name == sampler_name._id)
|
|
|
+ return sd.samplers[i].state;
|
|
|
+ }
|
|
|
+
|
|
|
+ CE_FATAL("Sampler not found");
|
|
|
+ return UINT32_MAX;
|
|
|
+}
|
|
|
+
|
|
|
void ShaderManager::submit(StringId32 shader_id, u8 view_id, s32 depth, u64 state)
|
|
|
{
|
|
|
CE_ASSERT(hash_map::has(_shader_map, shader_id), "Shader not found");
|