Преглед изворни кода

Add initial support to vertex and pixel shaders

Daniele Bartolini пре 12 година
родитељ
комит
db43d8a51b
3 измењених фајлова са 192 додато и 1 уклоњено
  1. 14 0
      src/renderers/Renderer.h
  2. 139 1
      src/renderers/gl/GLRenderer.cpp
  3. 39 0
      src/renderers/gl/GLRenderer.h

+ 14 - 0
src/renderers/Renderer.h

@@ -67,6 +67,9 @@ typedef Id VertexBufferId;
 typedef Id IndexBufferId;
 typedef Id RenderBufferId;
 typedef Id TextureId;
+typedef Id VertexShaderId;
+typedef Id PixelShaderId;
+typedef Id GPUProgramId;
 
 class Renderer
 {
@@ -105,6 +108,17 @@ public:
 	virtual void			update_texture(TextureId id, uint32_t x, uint32_t y, uint32_t width, uint32_t height, const void* data) = 0;
 	virtual void			destroy_texture(TextureId id) = 0;
 
+	virtual VertexShaderId	create_vertex_shader(const char* program) = 0;
+	virtual void			destroy_vertex_shader(VertexShaderId id) = 0;
+
+	virtual PixelShaderId 	create_pixel_shader(const char* program) = 0;
+	virtual void			destroy_pixel_shader(PixelShaderId id) = 0;
+
+	virtual GPUProgramId	create_gpu_program(VertexShaderId vs, PixelShaderId ps) = 0;
+	virtual void			destroy_gpu_program(GPUProgramId id) = 0;
+
+	virtual void			bind_gpu_program(GPUProgramId id) const = 0;
+
 	//virtual RenderBufferId	create_render_buffer(uint32_t width, uint32_t height, PixelFormat format) = 0;
 	//virtual void			destroy_render_buffer(RenderBufferId id) = 0;
 

+ 139 - 1
src/renderers/gl/GLRenderer.cpp

@@ -63,7 +63,10 @@ GLRenderer::GLRenderer() :
 	m_active_texture_unit(0),
 
 	m_vertex_buffers_id_table(m_allocator, MAX_VERTEX_BUFFERS),
-	m_index_buffers_id_table(m_allocator, MAX_INDEX_BUFFERS)
+	m_index_buffers_id_table(m_allocator, MAX_INDEX_BUFFERS),
+	m_vertex_shaders_id_table(m_allocator, MAX_VERTEX_SHADERS),
+	m_pixel_shaders_id_table(m_allocator, MAX_PIXEL_SHADERS),
+	m_gpu_programs_id_table(m_allocator, 128)
 	//m_render_buffers_id_table(m_allocator, MAX_RENDER_BUFFERS)
 {
 	m_min_max_point_size[0] = 0.0f;
@@ -321,6 +324,141 @@ void GLRenderer::destroy_texture(TextureId id)
 	glDeleteTextures(1, &gl_texture.gl_object);
 }
 
+//-----------------------------------------------------------------------------
+VertexShaderId GLRenderer::create_vertex_shader(const char* program)
+{
+	assert(program != NULL);
+
+	const VertexShaderId& id = m_vertex_shaders_id_table.create();
+
+	GLVertexShader& gl_shader = m_vertex_shaders[id.index];
+
+	gl_shader.gl_object = glCreateShader(GL_VERTEX_SHADER);
+
+	glShaderSource(gl_shader.gl_object, 1, &program, NULL);
+
+	glCompileShader(gl_shader.gl_object);
+
+	GLint success;
+	glGetShaderiv(gl_shader.gl_object, GL_COMPILE_STATUS, &success);
+
+	if (!success)
+	{
+		GLchar info_log[256];
+
+		glGetShaderInfoLog(gl_shader.gl_object, 256, NULL, info_log);
+
+		Log::e("Vertex shader compilation failed.");
+		Log::e("Log: %s", info_log);
+		assert(0);
+	}
+
+	return id;
+}
+
+//-----------------------------------------------------------------------------
+void GLRenderer::destroy_vertex_shader(VertexShaderId id)
+{
+	assert(m_vertex_shaders_id_table.has(id));
+
+	GLVertexShader& gl_shader = m_vertex_shaders[id.index];
+
+	glDeleteShader(gl_shader.gl_object);
+}
+
+//-----------------------------------------------------------------------------
+PixelShaderId GLRenderer::create_pixel_shader(const char* program)
+{
+	assert(program != NULL);
+
+	const PixelShaderId& id = m_pixel_shaders_id_table.create();
+
+	GLPixelShader& gl_shader = m_pixel_shaders[id.index];
+
+	gl_shader.gl_object = glCreateShader(GL_FRAGMENT_SHADER);
+
+	glShaderSource(gl_shader.gl_object, 1, &program, NULL);
+
+	glCompileShader(gl_shader.gl_object);
+
+	GLint success;
+	glGetShaderiv(gl_shader.gl_object, GL_COMPILE_STATUS, &success);
+
+	if (!success)
+	{
+		GLchar info_log[256];
+
+		glGetShaderInfoLog(gl_shader.gl_object, 256, NULL, info_log);
+
+		Log::e("Pixel shader compilation failed.");
+		Log::e("Log: %s", info_log);
+		assert(0);
+	}
+
+	return id;	
+}
+
+//-----------------------------------------------------------------------------
+void GLRenderer::destroy_pixel_shader(PixelShaderId id)
+{
+	assert(m_pixel_shaders_id_table.has(id));
+
+	GLPixelShader& gl_shader = m_pixel_shaders[id.index];
+
+	glDeleteShader(gl_shader.gl_object);	
+}
+
+//-----------------------------------------------------------------------------
+GPUProgramId GLRenderer::create_gpu_program(VertexShaderId vs, PixelShaderId ps)
+{
+	assert(m_vertex_shaders_id_table.has(vs));
+	assert(m_pixel_shaders_id_table.has(ps));
+
+	const GPUProgramId id = m_gpu_programs_id_table.create();
+
+	GLGPUProgram& gl_program = m_gpu_programs[id.index];
+
+	gl_program.gl_object = glCreateProgram();
+
+	glAttachShader(gl_program.gl_object, m_vertex_shaders[id.index].gl_object);
+	glAttachShader(gl_program.gl_object, m_pixel_shaders[id.index].gl_object);
+
+	glLinkProgram(gl_program.gl_object);
+
+	GLint success;
+	glGetProgramiv(gl_program.gl_object, GL_LINK_STATUS, &success);
+
+	if (!success)
+	{
+		GLchar info_log[256];
+		glGetProgramInfoLog(gl_program.gl_object, 256, NULL, info_log);
+		Log::e("GPU program compilation failed.\n");
+		Log::e("Log: %s", info_log);
+	}
+
+	return id;
+}
+
+//-----------------------------------------------------------------------------
+void GLRenderer::destroy_gpu_program(GPUProgramId id)
+{
+	assert(m_gpu_programs_id_table.has(id));
+
+	GLGPUProgram& gl_program = m_gpu_programs[id.index];
+
+	glDeleteProgram(gl_program.gl_object);
+}
+
+//-----------------------------------------------------------------------------
+void GLRenderer::bind_gpu_program(GPUProgramId id) const
+{
+	assert(m_gpu_programs_id_table.has(id));
+
+	const GLGPUProgram& gl_program = m_gpu_programs[id.index];
+
+	glUseProgram(gl_program.gl_object);
+}
+
 //-----------------------------------------------------------------------------
 // RenderBufferId GLRenderer::create_render_buffer(uint32_t width, uint32_t height, PixelFormat format)
 // {

+ 39 - 0
src/renderers/gl/GLRenderer.h

@@ -32,6 +32,8 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include "VertexBuffer.h"
 #include "IndexBuffer.h"
 #include "RenderBuffer.h"
+#include "VertexShader.h"
+#include "PixelShader.h"
 #include "IdTable.h"
 #include "MallocAllocator.h"
 
@@ -71,6 +73,23 @@ struct GLRenderBuffer
 	GLuint				gl_render_buffer;
 };
 
+//-----------------------------------------------------------------------------
+struct GLVertexShader
+{
+	GLuint				gl_object;
+};
+
+//-----------------------------------------------------------------------------
+struct GLPixelShader
+{
+	GLuint				gl_object;
+};
+
+struct GLGPUProgram
+{
+	GLuint				gl_object;
+};
+
 /// OpenGL renderer
 class GLRenderer : public Renderer
 {
@@ -91,6 +110,17 @@ public:
 	void				update_texture(TextureId id, uint32_t x, uint32_t y, uint32_t width, uint32_t height, const void* data);
 	void				destroy_texture(TextureId id);
 
+	VertexShaderId		create_vertex_shader(const char* program);
+	void				destroy_vertex_shader(VertexShaderId id);
+
+	PixelShaderId 		create_pixel_shader(const char* program);
+	void				destroy_pixel_shader(PixelShaderId id);
+
+	GPUProgramId		create_gpu_program(VertexShaderId vs, PixelShaderId ps);
+	void				destroy_gpu_program(GPUProgramId id);
+
+	void				bind_gpu_program(GPUProgramId id) const;
+
 	// RenderBufferId	create_render_buffer(uint32_t width, uint32_t height, PixelFormat format);
 	// void				destroy_render_buffer(RenderBufferId id);
 
@@ -204,6 +234,15 @@ private:
 	IdTable				m_index_buffers_id_table;
 	GLIndexBuffer		m_index_buffers[MAX_INDEX_BUFFERS];
 
+	IdTable 			m_vertex_shaders_id_table;
+	GLVertexShader		m_vertex_shaders[MAX_VERTEX_SHADERS];
+
+	IdTable 			m_pixel_shaders_id_table;
+	GLPixelShader		m_pixel_shaders[MAX_PIXEL_SHADERS];
+
+	IdTable 			m_gpu_programs_id_table;
+	GLGPUProgram		m_gpu_programs[128];
+
 	// Render buffer management
 	//IdTable				m_render_buffers_id_table;
 	//GLRenderBuffer		m_render_buffers[MAX_RENDER_BUFFERS];