Parcourir la source

Add basic support to custom uniforms

Daniele Bartolini il y a 12 ans
Parent
commit
4b193338de

+ 8 - 17
engine/renderers/RenderContext.h

@@ -30,6 +30,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include "Mat4.h"
 #include "Mat4.h"
 #include "IdTable.h"
 #include "IdTable.h"
 #include "CommandBuffer.h"
 #include "CommandBuffer.h"
+#include "ConstantBuffer.h"
 
 
 namespace crown
 namespace crown
 {
 {
@@ -48,22 +49,6 @@ enum ShaderType
 	SHADER_FRAGMENT
 	SHADER_FRAGMENT
 };
 };
 
 
-enum UniformType
-{
-	UNIFORM_INTEGER,
-	UNIFORM_UNSIGNED,
-	UNIFORM_FLOAT,
-	UNIFORM_MAT3,
-	UNIFORM_MAT4
-};
-
-struct Uniform
-{
-	uint32_t m_name;
-	UniformType m_type;
-	uint32_t m_size;
-};
-
 #define MAX_RENDER_LAYERS			32
 #define MAX_RENDER_LAYERS			32
 #define MAX_RENDER_STATES			1024
 #define MAX_RENDER_STATES			1024
 
 
@@ -238,6 +223,11 @@ struct RenderContext
 		m_state.ib = ib;
 		m_state.ib = ib;
 	}
 	}
 
 
+	void set_uniform(UniformId id, UniformType type, void* value, uint8_t num)
+	{
+		m_constants.write_constant(id, type, value, num);
+	}
+
 	void set_texture(uint8_t unit, TextureId texture, uint32_t flags)
 	void set_texture(uint8_t unit, TextureId texture, uint32_t flags)
 	{
 	{
 		m_flags |= STATE_TEXTURE_0 << unit;
 		m_flags |= STATE_TEXTURE_0 << unit;
@@ -321,6 +311,7 @@ struct RenderContext
 	void push()
 	void push()
 	{
 	{
 		m_commands.commit();
 		m_commands.commit();
+		m_constants.commit();
 	}
 	}
 
 
 public:
 public:
@@ -342,8 +333,8 @@ public:
 	ViewRect m_viewports[MAX_RENDER_LAYERS];
 	ViewRect m_viewports[MAX_RENDER_LAYERS];
 	ViewRect m_scissors[MAX_RENDER_LAYERS];
 	ViewRect m_scissors[MAX_RENDER_LAYERS];
 
 
-	// Commands
 	CommandBuffer m_commands;
 	CommandBuffer m_commands;
+	ConstantBuffer m_constants;
 };
 };
 
 
 } // namespace crown
 } // namespace crown

+ 69 - 8
engine/renderers/Renderer.h

@@ -73,7 +73,8 @@ public:
 	void create_gpu_program_impl(GPUProgramId id, ShaderId vertex, ShaderId pixel);
 	void create_gpu_program_impl(GPUProgramId id, ShaderId vertex, ShaderId pixel);
 	void destroy_gpu_program_impl(GPUProgramId id);
 	void destroy_gpu_program_impl(GPUProgramId id);
 
 
-	void create_uniform_impl(UniformId id, const char* name, UniformType type);
+	void create_uniform_impl(UniformId id, const char* name, UniformType type, uint8_t num);
+	void update_uniform_impl(UniformId id, size_t size, const void* data);
 	void destroy_uniform_impl(UniformId id);
 	void destroy_uniform_impl(UniformId id);
 
 
 	void create_render_target_impl(RenderTargetId id, uint16_t width, uint16_t height, RenderTargetFormat format);
 	void create_render_target_impl(RenderTargetId id, uint16_t width, uint16_t height, RenderTargetFormat format);
@@ -214,14 +215,29 @@ public:
 		m_submit->m_commands.write(id);
 		m_submit->m_commands.write(id);
 	}
 	}
 
 
-	// UniformId create_uniform(const char* name, UniformType type)
-	// {
+	inline UniformId create_uniform(const char* name, UniformType type, uint8_t num)
+	{
+		const UniformId id = m_uniforms.create();
+		size_t len = string::strlen(name);
 
 
-	// }
-	// void destroy_uniform(UniformId id)
-	// {
+		CE_ASSERT(len < CROWN_MAX_UNIFORM_NAME_LENGTH, "Max uniform name length is %d", CROWN_MAX_UNIFORM_NAME_LENGTH);
+
+		m_submit->m_commands.write(COMMAND_CREATE_UNIFORM);
+		m_submit->m_commands.write(id);
+		m_submit->m_commands.write(len);
+		m_submit->m_commands.write(name, len);
+		m_submit->m_commands.write(type);
+		m_submit->m_commands.write(num);
+
+		return id;
+	}
+
+	inline void destroy_uniform(UniformId id)
+	{
+		m_submit->m_commands.write(COMMAND_DESTROY_UNIFORM);
+		m_submit->m_commands.write(id);
+	}
 
 
-	// }
 	// 
 	// 
 	// RenderTargetId create_render_target(uint16_t width, uint16_t height, RenderTargetFormat format)
 	// RenderTargetId create_render_target(uint16_t width, uint16_t height, RenderTargetFormat format)
 	// {
 	// {
@@ -403,10 +419,30 @@ public:
 				}
 				}
 				case COMMAND_CREATE_UNIFORM:
 				case COMMAND_CREATE_UNIFORM:
 				{
 				{
+					UniformId id;
+					size_t len;
+					char name[CROWN_MAX_UNIFORM_NAME_LENGTH];
+					UniformType type;
+					uint8_t num;
+
+					cmds.read(id);
+					cmds.read(len);
+					cmds.read(name, len);
+					name[len] = '\0';
+					cmds.read(type);
+					cmds.read(num);
+
+					create_uniform_impl(id, name, type, num);
+
 					break;
 					break;
 				}
 				}
 				case COMMAND_DESTROY_UNIFORM:
 				case COMMAND_DESTROY_UNIFORM:
 				{
 				{
+					UniformId id;
+					cmds.read(id);
+
+					destroy_uniform_impl(id);
+
 					break;
 					break;
 				}
 				}
 				case COMMAND_END:
 				case COMMAND_END:
@@ -426,6 +462,25 @@ public:
 		cmds.clear();
 		cmds.clear();
 	}
 	}
 
 
+	inline void update_uniforms(ConstantBuffer& cbuf)
+	{
+		UniformType type;
+
+		while ((type = (UniformType)cbuf.read()) != UNIFORM_END)
+		{
+			UniformId id;
+			size_t size;
+
+			cbuf.read(&id, sizeof(UniformId));
+			cbuf.read(&size, sizeof(size_t));
+			const void* data = cbuf.read(size);
+
+			update_uniform_impl(id, size, data);
+		}
+
+		cbuf.clear();
+	}
+
 	inline void set_state(uint64_t flags)
 	inline void set_state(uint64_t flags)
 	{
 	{
 		m_submit->set_state(flags);
 		m_submit->set_state(flags);
@@ -451,6 +506,11 @@ public:
 		m_submit->set_index_buffer(ib);
 		m_submit->set_index_buffer(ib);
 	}
 	}
 
 
+	inline void set_uniform(UniformId id, UniformType type, void* value, uint8_t num)
+	{
+		m_submit->set_uniform(id, type, value, num);
+	}
+
 	inline void set_texture(uint8_t unit, TextureId texture, uint32_t flags)
 	inline void set_texture(uint8_t unit, TextureId texture, uint32_t flags)
 	{
 	{
 		m_submit->set_texture(unit, texture, flags);
 		m_submit->set_texture(unit, texture, flags);
@@ -507,6 +567,7 @@ public:
 		swap_contexts();
 		swap_contexts();
 
 
 		execute_commands(m_draw->m_commands);
 		execute_commands(m_draw->m_commands);
+		update_uniforms(m_draw->m_constants);
 
 
 		if (m_is_initialized)
 		if (m_is_initialized)
 		{
 		{
@@ -529,7 +590,7 @@ protected:
 	IdTable<CROWN_MAX_TEXTURES> m_textures;
 	IdTable<CROWN_MAX_TEXTURES> m_textures;
 	IdTable<CROWN_MAX_SHADERS> m_shaders;
 	IdTable<CROWN_MAX_SHADERS> m_shaders;
 	IdTable<CROWN_MAX_GPU_PROGRAMS> m_gpu_programs;
 	IdTable<CROWN_MAX_GPU_PROGRAMS> m_gpu_programs;
-	// IdTable<CROWN_MAX_UNIFORMS> m_uniforms;
+	IdTable<CROWN_MAX_UNIFORMS> m_uniforms;
 	// IdTable<CROWN_MAX_RENDER_TARGETS> m_render_targets;
 	// IdTable<CROWN_MAX_RENDER_TARGETS> m_render_targets;
 
 
 	bool m_is_initialized;
 	bool m_is_initialized;

+ 15 - 9
engine/renderers/gl/GLRenderer.cpp

@@ -490,17 +490,23 @@ void Renderer::destroy_gpu_program_impl(GPUProgramId id)
 	m_impl->m_gpu_programs[id.index].destroy();
 	m_impl->m_gpu_programs[id.index].destroy();
 }
 }
 
 
-// //-----------------------------------------------------------------------------
-// void Renderer::create_uniform_impl(UniformId id, const char* name, UniformType type)
-// {
-
-// }
+//-----------------------------------------------------------------------------
+void Renderer::create_uniform_impl(UniformId id, const char* name, UniformType type, uint8_t num)
+{
+	m_impl->m_uniforms[id.index].create(name, type, num);
+}
 
 
-// //-----------------------------------------------------------------------------
-// void Renderer::destroy_uniform_impl(UniformId id)
-// {
+//-----------------------------------------------------------------------------
+void Renderer::update_uniform_impl(UniformId id, size_t size, const void* data)
+{
+	m_impl->m_uniforms[id.index].update(size, data);
+}
 
 
-// }
+//-----------------------------------------------------------------------------
+void Renderer::destroy_uniform_impl(UniformId id)
+{
+	m_impl->m_uniforms[id.index].destroy();
+}
 
 
 // //-----------------------------------------------------------------------------
 // //-----------------------------------------------------------------------------
 // void Renderer::create_render_target_impl(RenderTargetId id, uint16_t width, uint16_t height, RenderTargetFormat format)
 // void Renderer::create_render_target_impl(RenderTargetId id, uint16_t width, uint16_t height, RenderTargetFormat format)

+ 23 - 0
engine/renderers/gl/GLRenderer.h

@@ -478,4 +478,27 @@ struct RenderTarget
 	GLuint m_gl_rbo;
 	GLuint m_gl_rbo;
 };
 };
 
 
+struct Uniform
+{
+	void create(const char* name, UniformType type, uint8_t num)
+	{
+		Log::d("Uniform created, name = %s, type = %d, num = %d", name, type, num);
+	}
+
+	void update(size_t size, const void* data)
+	{
+		Log::d("Uniform updated, new size = %d, new ptr = %d", size, *((int32_t*)data));
+	}
+
+	void destroy()
+	{
+		Log::d("Uniform destroyed");
+	}
+
+public:
+
+	UniformType m_type;
+	uint8_t m_num;
+};
+
 } // namespace crown
 } // namespace crown