>From nobody Mon Sep 17 00:00:00 2001 From: Jason Green Date: Fri, 26 May 2006 01:04:37 -0400 To: wine-patches Subject: [PATCH 1/5] Add ability to generate GLSL shader objects for vertex and pixel shaders. - Also modifies the baseshader declarations, and a few minor trace/formatting cleanups. --- dlls/wined3d/baseshader.c | 26 ++++++++++++++++++++++---- dlls/wined3d/pixelshader.c | 25 +++++++++++++++++++++++-- dlls/wined3d/vertexshader.c | 31 +++++++++++++++++++++++++++++-- 3 files changed, 74 insertions(+), 8 deletions(-) 77c5f0e5fc62b66943b762730d927ee2553ef842 diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c index 4e30421..cba12f5 100644 --- a/dlls/wined3d/baseshader.c +++ b/dlls/wined3d/baseshader.c @@ -549,8 +549,28 @@ void generate_glsl_declarations( shader_reg_maps* reg_maps, SHADER_BUFFER* buffer) { + IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface; + int i; + FIXME("GLSL not fully implemented yet.\n"); + /* Declare the constants (aka uniforms) */ + shader_addline(buffer, "uniform vec4 C[%u];\n", This->baseShader.limits.constant_float); + + /* Declare address variables */ + for (i = 0; i < This->baseShader.limits.address; i++) { + if (reg_maps->address & (1 << i)) + shader_addline(buffer, "ivec4 A%ld;\n", i); + } + + /* Declare temporary variables */ + for(i = 0; i < This->baseShader.limits.temporary; i++) { + if (reg_maps->temporary & (1 << i)) + shader_addline(buffer, "vec4 R%lu;\n", i); + } + + /* Start the main program */ + shader_addline(buffer, "void main() {\n"); } /** Shared code in order to generate the bulk of the shader string. @@ -585,7 +605,6 @@ void generate_base_shader( /* Pre-declare registers */ if (wined3d_settings.shader_mode == SHADER_GLSL) { generate_glsl_declarations(iface, ®_maps, buffer); - shader_addline(buffer, "void main() {\n"); } else { generate_arb_declarations(iface, ®_maps, buffer); } @@ -680,8 +699,7 @@ void generate_base_shader( /** Prints the GLSL info log which will contain error messages if they exist */ void print_glsl_info_log( WineD3D_GL_Info *gl_info, - GLhandleARB obj) -{ + GLhandleARB obj) { int infologLength = 0; char *infoLog; @@ -693,7 +711,7 @@ void print_glsl_info_log( { infoLog = (char *)HeapAlloc(GetProcessHeap(), 0, infologLength); GL_EXTCALL(glGetInfoLogARB(obj, infologLength, NULL, infoLog)); - FIXME("Error received from GLSL shader #%u: %s", obj, debugstr_a(infoLog)); + FIXME("Error received from GLSL shader #%u: %s\n", obj, debugstr_a(infoLog)); HeapFree(GetProcessHeap(), 0, infoLog); } } diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c index be4fbb8..5720ea0 100644 --- a/dlls/wined3d/pixelshader.c +++ b/dlls/wined3d/pixelshader.c @@ -1298,8 +1298,29 @@ #endif buffer.bsize = 0; buffer.lineNo = 0; - /* TODO: Optionally, generate the GLSL shader instead */ - if (GL_SUPPORT(ARB_VERTEX_PROGRAM)) { + if (wined3d_settings.shader_mode == SHADER_GLSL) { + + /* Create the hw GLSL shader object and assign it as the baseShader.prgId */ + GLhandleARB shader_obj = GL_EXTCALL(glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB)); + int success_flag = 0; + + /* Generate the bulk of the shader code */ + generate_base_shader( (IWineD3DBaseShader*) This, &buffer, pFunction); + + shader_addline(&buffer, "}\n\0"); + + TRACE("Compiling shader object %u\n", shader_obj); + GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer.buffer, NULL)); + GL_EXTCALL(glCompileShaderARB(shader_obj)); + GL_EXTCALL(glGetObjectParameterivARB(shader_obj, + GL_OBJECT_COMPILE_STATUS_ARB, &success_flag)); + if (success_flag == FALSE) /* Print any compile errors in our shader */ + print_glsl_info_log(&GLINFO_LOCATION, shader_obj); + + /* Store the shader object */ + This->baseShader.prgId = shader_obj; + + } else if (wined3d_settings.shader_mode == SHADER_ARB) { /* Create the hw ARB shader */ shader_addline(&buffer, "!!ARBfp1.0\n"); diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c index cb8d973..03f0ce0 100644 --- a/dlls/wined3d/vertexshader.c +++ b/dlls/wined3d/vertexshader.c @@ -1063,8 +1063,35 @@ #endif buffer.bsize = 0; buffer.lineNo = 0; - /* TODO: Optionally, generate the GLSL shader instead */ - if (GL_SUPPORT(ARB_VERTEX_PROGRAM)) { + if (wined3d_settings.shader_mode == SHADER_GLSL) { + + /* Create the hw GLSL shader program and assign it as the baseShader.prgId */ + GLhandleARB shader_obj = GL_EXTCALL(glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB)); + int i; + int success_flag = 0; + + /* Declare all named attributes (TODO: Add this to the reg_maps and only declare those that are needed)*/ + for (i = 0; i < 16; ++i) + shader_addline(&buffer, "attribute vec4 attrib%i;\n", i); + + /* Generate the bulk of the shader code */ + generate_base_shader( (IWineD3DBaseShader*) This, &buffer, pFunction); + + shader_addline(&buffer, "}\n\0"); + + TRACE("Compiling shader object %u\n", shader_obj); + GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer.buffer, NULL)); + GL_EXTCALL(glCompileShaderARB(shader_obj)); + GL_EXTCALL(glGetObjectParameterivARB(shader_obj, + GL_OBJECT_COMPILE_STATUS_ARB, &success_flag)); + if (success_flag == FALSE) /* Print any compile errors in our shader */ + print_glsl_info_log(&GLINFO_LOCATION, shader_obj); + + /* Store the shader object */ + This->baseShader.prgId = shader_obj; + + } else if (wined3d_settings.shader_mode == SHADER_ARB) { + /* Create the hw ARB shader */ shader_addline(&buffer, "!!ARBvp1.0\n"); -- 1.3.3