Style fixes for Renderer.Gl.

This commit is contained in:
Paul Chote
2013-07-18 17:42:40 +12:00
parent 61cb279c1d
commit 1b4e387ecc
2 changed files with 40 additions and 38 deletions

View File

@@ -12,8 +12,6 @@ using System;
using System.Drawing; using System.Drawing;
using OpenRA.FileFormats.Graphics; using OpenRA.FileFormats.Graphics;
using OpenRA.Renderer.SdlCommon; using OpenRA.Renderer.SdlCommon;
using Tao.OpenGl;
using Tao.Sdl;
[assembly: Renderer(typeof(OpenRA.Renderer.Glsl.DeviceFactory))] [assembly: Renderer(typeof(OpenRA.Renderer.Glsl.DeviceFactory))]
@@ -30,7 +28,7 @@ namespace OpenRA.Renderer.Glsl
public class GraphicsDevice : SdlGraphics public class GraphicsDevice : SdlGraphics
{ {
static string[] RequiredExtensions = static string[] requiredExtensions =
{ {
"GL_ARB_vertex_shader", "GL_ARB_vertex_shader",
"GL_ARB_fragment_shader", "GL_ARB_fragment_shader",
@@ -39,8 +37,8 @@ namespace OpenRA.Renderer.Glsl
}; };
public GraphicsDevice(Size size, WindowMode window) public GraphicsDevice(Size size, WindowMode window)
: base(size, window, RequiredExtensions) {} : base(size, window, requiredExtensions) { }
public override IShader CreateShader(string name) { return new Shader( this, name ); } public override IShader CreateShader(string name) { return new Shader(this, name); }
} }
} }

View File

@@ -21,20 +21,20 @@ namespace OpenRA.Renderer.Glsl
{ {
public class Shader : IShader public class Shader : IShader
{ {
int program;
readonly Dictionary<string, int> samplers = new Dictionary<string, int>(); readonly Dictionary<string, int> samplers = new Dictionary<string, int>();
readonly Dictionary<int, ITexture> textures = new Dictionary<int, ITexture>(); readonly Dictionary<int, ITexture> textures = new Dictionary<int, ITexture>();
int program;
public Shader(GraphicsDevice dev, string type) public Shader(GraphicsDevice dev, string name)
{ {
// Vertex shader // Vertex shader
string vertexCode; string vertexCode;
using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.vert".F(Path.DirectorySeparatorChar, type)))) using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.vert".F(Path.DirectorySeparatorChar, name))))
vertexCode = file.ReadToEnd(); vertexCode = file.ReadToEnd();
int v = Gl.glCreateShaderObjectARB(Gl.GL_VERTEX_SHADER_ARB); var v = Gl.glCreateShaderObjectARB(Gl.GL_VERTEX_SHADER_ARB);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
Gl.glShaderSourceARB(v,1,new string[]{vertexCode},null); Gl.glShaderSourceARB(v, 1, new string[] { vertexCode }, null);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
Gl.glCompileShaderARB(v); Gl.glCompileShaderARB(v);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
@@ -43,15 +43,16 @@ namespace OpenRA.Renderer.Glsl
Gl.glGetObjectParameterivARB(v, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success); Gl.glGetObjectParameterivARB(v, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
if (success == 0) if (success == 0)
throw new InvalidProgramException("Compile error in {0}{1}.vert".F(Path.DirectorySeparatorChar, type)); throw new InvalidProgramException("Compile error in {0}{1}.vert".F(Path.DirectorySeparatorChar, name));
// Fragment shader // Fragment shader
string fragmentCode; string fragmentCode;
using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, type)))) using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, name))))
fragmentCode = file.ReadToEnd(); fragmentCode = file.ReadToEnd();
int f = Gl.glCreateShaderObjectARB(Gl.GL_FRAGMENT_SHADER_ARB);
var f = Gl.glCreateShaderObjectARB(Gl.GL_FRAGMENT_SHADER_ARB);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
Gl.glShaderSourceARB(f,1,new string[]{fragmentCode},null); Gl.glShaderSourceARB(f, 1, new string[] { fragmentCode }, null);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
Gl.glCompileShaderARB(f); Gl.glCompileShaderARB(f);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
@@ -59,15 +60,14 @@ namespace OpenRA.Renderer.Glsl
Gl.glGetObjectParameterivARB(f, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success); Gl.glGetObjectParameterivARB(f, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
if (success == 0) if (success == 0)
throw new InvalidProgramException("Compile error in glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, type)); throw new InvalidProgramException("Compile error in glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, name));
// Assemble program // Assemble program
program = Gl.glCreateProgramObjectARB(); program = Gl.glCreateProgramObjectARB();
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
Gl.glAttachObjectARB(program,v); Gl.glAttachObjectARB(program, v);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
Gl.glAttachObjectARB(program,f); Gl.glAttachObjectARB(program, f);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
Gl.glLinkProgramARB(program); Gl.glLinkProgramARB(program);
@@ -76,32 +76,35 @@ namespace OpenRA.Renderer.Glsl
Gl.glGetObjectParameterivARB(program, Gl.GL_OBJECT_LINK_STATUS_ARB, out success); Gl.glGetObjectParameterivARB(program, Gl.GL_OBJECT_LINK_STATUS_ARB, out success);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
if (success == 0) if (success == 0)
throw new InvalidProgramException("Linking error in {0} shader".F(type)); throw new InvalidProgramException("Linking error in {0} shader".F(name));
Gl.glUseProgramObjectARB(program); Gl.glUseProgramObjectARB(program);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
int numUniforms; int numUniforms;
Gl.glGetObjectParameterivARB( program, Gl.GL_ACTIVE_UNIFORMS, out numUniforms ); Gl.glGetObjectParameterivARB(program, Gl.GL_ACTIVE_UNIFORMS, out numUniforms);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
int nextTexUnit = 0; int nextTexUnit = 0;
for( int i = 0 ; i < numUniforms ; i++ ) for (var i = 0; i < numUniforms; i++)
{ {
int uLen, uSize, uType, loc; int length, size, type;
var sb = new StringBuilder(128); var sb = new StringBuilder(128);
Gl.glGetActiveUniformARB( program, i, 128, out uLen, out uSize, out uType, sb );
Gl.glGetActiveUniformARB(program, i, 128, out length, out size, out type, sb);
var sampler = sb.ToString(); var sampler = sb.ToString();
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
if( uType == Gl.GL_SAMPLER_2D_ARB )
if (type == Gl.GL_SAMPLER_2D_ARB)
{ {
samplers.Add( sampler, nextTexUnit ); samplers.Add(sampler, nextTexUnit);
loc = Gl.glGetUniformLocationARB(program, sampler);
var loc = Gl.glGetUniformLocationARB(program, sampler);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
Gl.glUniform1iARB( loc, nextTexUnit ); Gl.glUniform1iARB(loc, nextTexUnit);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
++nextTexUnit;
nextTexUnit++;
} }
} }
} }
@@ -110,8 +113,7 @@ namespace OpenRA.Renderer.Glsl
{ {
Gl.glUseProgramObjectARB(program); Gl.glUseProgramObjectARB(program);
/* bind the textures */ // bind the textures
foreach (var kv in textures) foreach (var kv in textures)
{ {
Gl.glActiveTextureARB(Gl.GL_TEXTURE0_ARB + kv.Key); Gl.glActiveTextureARB(Gl.GL_TEXTURE0_ARB + kv.Key);
@@ -127,6 +129,7 @@ namespace OpenRA.Renderer.Glsl
{ {
if (t == null) if (t == null)
return; return;
int texUnit; int texUnit;
if (samplers.TryGetValue(name, out texUnit)) if (samplers.TryGetValue(name, out texUnit))
textures[texUnit] = t; textures[texUnit] = t;
@@ -136,9 +139,9 @@ namespace OpenRA.Renderer.Glsl
{ {
Gl.glUseProgramObjectARB(program); Gl.glUseProgramObjectARB(program);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
int param = Gl.glGetUniformLocationARB(program, name); var param = Gl.glGetUniformLocationARB(program, name);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
Gl.glUniform1fARB(param,x); Gl.glUniform1fARB(param, x);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
} }
@@ -146,17 +149,17 @@ namespace OpenRA.Renderer.Glsl
{ {
Gl.glUseProgramObjectARB(program); Gl.glUseProgramObjectARB(program);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
int param = Gl.glGetUniformLocationARB(program, name); var param = Gl.glGetUniformLocationARB(program, name);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
Gl.glUniform2fARB(param,x,y); Gl.glUniform2fARB(param, x, y);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
} }
public void SetVec(string name, float[] vec, int length) public void SetVec(string name, float[] vec, int length)
{ {
int param = Gl.glGetUniformLocationARB(program, name); var param = Gl.glGetUniformLocationARB(program, name);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
switch(length) switch (length)
{ {
case 1: Gl.glUniform1fv(param, 1, vec); break; case 1: Gl.glUniform1fv(param, 1, vec); break;
case 2: Gl.glUniform2fv(param, 1, vec); break; case 2: Gl.glUniform2fv(param, 1, vec); break;
@@ -164,6 +167,7 @@ namespace OpenRA.Renderer.Glsl
case 4: Gl.glUniform4fv(param, 1, vec); break; case 4: Gl.glUniform4fv(param, 1, vec); break;
default: throw new InvalidDataException("Invalid vector length"); default: throw new InvalidDataException("Invalid vector length");
} }
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
} }
@@ -174,7 +178,7 @@ namespace OpenRA.Renderer.Glsl
Gl.glUseProgramObjectARB(program); Gl.glUseProgramObjectARB(program);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
int param = Gl.glGetUniformLocationARB(program, name); var param = Gl.glGetUniformLocationARB(program, name);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
Gl.glUniformMatrix4fv(param, 1, Gl.GL_FALSE, mtx); Gl.glUniformMatrix4fv(param, 1, Gl.GL_FALSE, mtx);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();