* some parameters was set after the shader setup. Extend the API to do the shader setup before the draw
* remove the useless shader compatibility bits


git-svn-id: http://pcsx2.googlecode.com/svn/trunk@5212 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
gregory.hainaut 2012-05-15 06:45:26 +00:00
parent d062ca1727
commit 05fc11daf5
5 changed files with 61 additions and 53 deletions

View File

@ -151,8 +151,14 @@ extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmen
extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT; extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT;
extern PFNGLDRAWBUFFERSPROC glDrawBuffers; extern PFNGLDRAWBUFFERSPROC glDrawBuffers;
#ifdef GLSL4_API
#include "ZZoglShaders.h"
#endif
static __forceinline void DrawTriangleArray() static __forceinline void DrawTriangleArray()
{ {
#ifdef GLSL4_API
ZZshSetupShader();
#endif
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
GL_REPORT_ERRORD(); GL_REPORT_ERRORD();
} }

View File

@ -836,7 +836,9 @@ void ZZDestroy()
vb_buffer_allocated = false; // mark the buffer unallocated vb_buffer_allocated = false; // mark the buffer unallocated
} }
#ifdef GLSL4_API
delete vertex_array; delete vertex_array;
#endif
g_nCurVBOIndex = 0; g_nCurVBOIndex = 0;

View File

@ -89,6 +89,9 @@ int icurctx = -1;
void Draw(const VB& curvb) void Draw(const VB& curvb)
{ {
#ifdef GLSL4_API
ZZshSetupShader();
#endif
glDrawArrays(primtype[curvb.curprim.prim], 0, curvb.nCount); glDrawArrays(primtype[curvb.curprim.prim], 0, curvb.nCount);
} }
@ -851,8 +854,14 @@ inline void FlushSetTexture(VB& curvb, FRAGMENTSHADER* pfragment, CRenderTarget*
if( curvb.ptexClamp[1] != 0 ) if( curvb.ptexClamp[1] != 0 )
ZZshGLSetTextureParameter(pfragment->prog, pfragment->sBitwiseANDY, curvb.ptexClamp[1], "Clamp 1"); ZZshGLSetTextureParameter(pfragment->prog, pfragment->sBitwiseANDY, curvb.ptexClamp[1], "Clamp 1");
// FIXME condition is a bit strange for GLSL
#ifdef GLSL4_API
if( s_ptexCurSet[context] != 0)
ZZshGLSetTextureParameter(pfragment->prog, pfragment->sMemory, s_ptexCurSet[context], "Clamp memory");
#else
if( pfragment->sMemory != NULL && s_ptexCurSet[context] != 0) if( pfragment->sMemory != NULL && s_ptexCurSet[context] != 0)
ZZshGLSetTextureParameter(pfragment->prog, pfragment->sMemory, s_ptexCurSet[context], "Clamp memory"); ZZshGLSetTextureParameter(pfragment->prog, pfragment->sMemory, s_ptexCurSet[context], "Clamp memory");
#endif
} }
// Reset program and texture variables; // Reset program and texture variables;

View File

@ -404,7 +404,6 @@ struct FRAGMENTSHADER
ZZshShaderLink prog; // it link to FRAGMENTSHADER structure, for compability between GLSL and CG ZZshShaderLink prog; // it link to FRAGMENTSHADER structure, for compability between GLSL and CG
ZZshProgram program; ZZshProgram program;
ZZshShaderType ShaderType; // Not every PS and VS are used together, only compatible ones.
uint context; uint context;
FragmentUniform uniform_buffer[ZZSH_CTX_ALL]; FragmentUniform uniform_buffer[ZZSH_CTX_ALL];
@ -576,7 +575,6 @@ struct VERTEXSHADER
ZZshShaderLink prog; ZZshShaderLink prog;
ZZshProgram program; ZZshProgram program;
ZZshShaderType ShaderType;
uint context; uint context;
ZZshParameter sBitBltPos, sBitBltTex, fBitBltTrans; // vertex shader constants ZZshParameter sBitBltPos, sBitBltTex, fBitBltTrans; // vertex shader constants
@ -729,6 +727,7 @@ extern GSVertexBufferStateOGL *vertex_array;
extern void init_shader(); extern void init_shader();
extern void PutParametersInProgram(VERTEXSHADER* vs, FRAGMENTSHADER* ps); extern void PutParametersInProgram(VERTEXSHADER* vs, FRAGMENTSHADER* ps);
extern void init_shader(); extern void init_shader();
extern void ZZshSetupShader();
#endif #endif

View File

@ -71,6 +71,8 @@
#define NUMBER_OF_SAMPLERS 11 #define NUMBER_OF_SAMPLERS 11
#define MAX_SHADER_NAME_SIZE 25 #define MAX_SHADER_NAME_SIZE 25
#define DEFINE_STRING_SIZE 256 #define DEFINE_STRING_SIZE 256
// #define ENABLE_MARKER // Fire some marker for opengl Debugger (apitrace, gdebugger)
//------------------ Constants //------------------ Constants
// Used in a logarithmic Z-test, as (1-o(1))/log(MAX_U32). // Used in a logarithmic Z-test, as (1-o(1))/log(MAX_U32).
@ -109,7 +111,6 @@ const char* ShaderCallerName = "";
const char* ShaderHandleName = ""; const char* ShaderHandleName = "";
const char* ShaderNames[MAX_ACTIVE_SHADERS] = {""}; const char* ShaderNames[MAX_ACTIVE_SHADERS] = {""};
ZZshShaderType ShaderTypes[MAX_ACTIVE_SHADERS] = {ZZ_SH_NONE};
ZZshProgram CompiledPrograms[MAX_ACTIVE_SHADERS][MAX_ACTIVE_SHADERS] = {{0}}; ZZshProgram CompiledPrograms[MAX_ACTIVE_SHADERS][MAX_ACTIVE_SHADERS] = {{0}};
@ -239,11 +240,23 @@ void ZZshGLEnableProfile() {
// The same function for texture, also to cgGLEnable // The same function for texture, also to cgGLEnable
void ZZshGLSetTextureParameter(ZZshParameter param, GLuint texobj, const char* name) { void ZZshGLSetTextureParameter(ZZshParameter param, GLuint texobj, const char* name) {
#ifdef ENABLE_MARKER
char* debug = new char[100];
sprintf(debug, "CS: texture %d, param %d", texobj, param);
if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, debug);
#endif
g_cs.set_texture(param, texobj); g_cs.set_texture(param, texobj);
} }
void ZZshGLSetTextureParameter(ZZshShaderLink prog, ZZshParameter param, GLuint texobj, const char* name) { void ZZshGLSetTextureParameter(ZZshShaderLink prog, ZZshParameter param, GLuint texobj, const char* name) {
FRAGMENTSHADER* shader = (FRAGMENTSHADER*)prog.link; FRAGMENTSHADER* shader = (FRAGMENTSHADER*)prog.link;
#ifdef ENABLE_MARKER
char* debug = new char[100];
sprintf(debug, "FS(%d):texture %d, param %d", shader->program, texobj, param);
if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, debug);
#endif
shader->set_texture(param, texobj); shader->set_texture(param, texobj);
} }
@ -258,10 +271,20 @@ void ZZshSetParameter4fv(ZZshShaderLink& prog, ZZshParameter param, const float*
VERTEXSHADER* shader = (VERTEXSHADER*)prog.link; VERTEXSHADER* shader = (VERTEXSHADER*)prog.link;
shader->ZZshSetParameter4fv(param, v); shader->ZZshSetParameter4fv(param, v);
} }
#ifdef ENABLE_MARKER
char* debug = new char[100];
sprintf(debug, "prog: uniform (%s) (%f)", name, *v);
if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, debug);
#endif
} }
void ZZshSetParameter4fv(ZZshParameter param, const float* v, const char* name) { void ZZshSetParameter4fv(ZZshParameter param, const float* v, const char* name) {
g_cs.ZZshSetParameter4fv(param, v); g_cs.ZZshSetParameter4fv(param, v);
#ifdef ENABLE_MARKER
char* debug = new char[100];
sprintf(debug, "CS: uniform (%s) (%f)", name, *v);
if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, debug);
#endif
} }
// The same stuff, but also with retry of param, name should be USED name of param for prog. // The same stuff, but also with retry of param, name should be USED name of param for prog.
@ -288,15 +311,6 @@ void ZZshDefaultOneColor( FRAGMENTSHADER& ptr ) {
const GLchar * EmptyVertex = "void main(void) {gl_Position = ftransform();}"; const GLchar * EmptyVertex = "void main(void) {gl_Position = ftransform();}";
const GLchar * EmptyFragment = "void main(void) {gl_FragColor = gl_Color;}"; const GLchar * EmptyFragment = "void main(void) {gl_FragColor = gl_Color;}";
ZZshShaderType ZZshGetShaderType(const char* name) {
if (strncmp(name, "TextureFog", 10) == 0) return ZZ_SH_TEXTURE_FOG;
if (strncmp(name, "Texture", 7) == 0) return ZZ_SH_TEXTURE;
if (strncmp(name, "RegularFog", 10) == 0) return ZZ_SH_REGULAR_FOG;
if (strncmp(name, "Regular", 7) == 0) return ZZ_SH_REGULAR;
if (strncmp(name, "Zero", 4) == 0) return ZZ_SH_ZERO;
return ZZ_SH_CRTC;
}
inline bool GetCompilationLog(ZZshProgram program) { inline bool GetCompilationLog(ZZshProgram program) {
#if defined(DEVBUILD) || defined(_DEBUG) #if defined(DEVBUILD) || defined(_DEBUG)
GLint log_length = 0; GLint log_length = 0;
@ -362,7 +376,6 @@ inline bool CompileShader(ZZshProgram& program, const char* DefineString, const
return false; return false;
} }
ShaderTypes[program] = ZZshGetShaderType(name);
ShaderNames[program] = name; ShaderNames[program] = name;
GL_REPORT_ERRORD(); GL_REPORT_ERRORD();
@ -374,9 +387,6 @@ inline bool CompileShader(ZZshProgram& program, const char* DefineString, const
inline bool LoadShaderFromFile(ZZshProgram& program, const char* DefineString, const char* name, GLenum ShaderType, bool empty = false) { // Linux specific, as I presume inline bool LoadShaderFromFile(ZZshProgram& program, const char* DefineString, const char* name, GLenum ShaderType, bool empty = false) { // Linux specific, as I presume
// Emit annotation for apitrace
// if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, DefineString);
if (!CompileShader(program, DefineString, name, ShaderType, empty)) { if (!CompileShader(program, DefineString, name, ShaderType, empty)) {
ZZLog::Error_Log("Failed to compile shader for %s: ", name); ZZLog::Error_Log("Failed to compile shader for %s: ", name);
return false; return false;
@ -403,48 +413,25 @@ static void PutParametersAndRun(VERTEXSHADER* vs, FRAGMENTSHADER* ps) {
GL_REPORT_ERRORD(); GL_REPORT_ERRORD();
} }
inline bool ZZshCheckShaderCompatibility(VERTEXSHADER* vs, FRAGMENTSHADER* ps) { void ZZshSetupShader() {
if (vs->ShaderType == ZZ_SH_ZERO) return true; // ZeroPS is compatible with everything VERTEXSHADER* vs = (VERTEXSHADER*)g_vsprog.link;
FRAGMENTSHADER* ps = (FRAGMENTSHADER*)g_psprog.link;
return (vs->ShaderType == ps->ShaderType); if (vs == NULL || ps == NULL) return;
PutParametersAndRun(vs, ps);
} }
static void ZZshSetShader(VERTEXSHADER* vs, FRAGMENTSHADER* ps) { static void ZZshSetShader(VERTEXSHADER* vs, FRAGMENTSHADER* ps) {
if (vs == NULL || ps == NULL) { if (vs == NULL || ps == NULL) return;
// if (vs == NULL) fprintf(stderr, "VS is null !!! \n");
// if (ps == NULL) fprintf(stderr, "PS is null !!! \n");
return;
}
// FIXME all Shader are compatible now
// I keep for the moment to avoid useless running of the program
if (!ZZshCheckShaderCompatibility(vs, ps)) { // We don't need to link uncompatible shaders
return;
}
int vss = (vs!=NULL)?vs->program:0;
int pss = (ps!=NULL)?ps->program:0;
if (vss !=0 && pss != 0) {
FRAGMENTSHADER* debug = ps; FRAGMENTSHADER* debug = ps;
glUseProgramStages(s_pipeline, GL_VERTEX_SHADER_BIT, vs->program); glUseProgramStages(s_pipeline, GL_VERTEX_SHADER_BIT, vs->program);
glUseProgramStages(s_pipeline, GL_FRAGMENT_SHADER_BIT, ps->program); glUseProgramStages(s_pipeline, GL_FRAGMENT_SHADER_BIT, ps->program);
PutParametersAndRun(vs, ps);
// // FIXME DEBUG PS SHADER
// if (ps->ShaderType == ZZ_SH_TEXTURE) {
// glUseProgramStages(s_pipeline, GL_FRAGMENT_SHADER_BIT, ppsDebug2.program);
// PutParametersAndRun(vs, &ppsDebug2);
// } else {
// glUseProgramStages(s_pipeline, GL_FRAGMENT_SHADER_BIT, ps->program);
//PutParametersAndRun(vs, ps); //PutParametersAndRun(vs, ps);
// }
GL_REPORT_ERRORD(); GL_REPORT_ERRORD();
} }
}
void ZZshSetVertexShader(ZZshShaderLink prog) { void ZZshSetVertexShader(ZZshShaderLink prog) {
g_vsprog = prog; g_vsprog = prog;
@ -496,6 +483,13 @@ void PutParametersInProgram(VERTEXSHADER* vs, FRAGMENTSHADER* ps) {
fragment_buffer->upload((void*)&ps->uniform_buffer[ps->context]); fragment_buffer->upload((void*)&ps->uniform_buffer[ps->context]);
g_cs.enable_texture(); g_cs.enable_texture();
#ifdef ENABLE_MARKER
char* debug = new char[100];
sprintf(debug, "FS(%d): enable texture", ps->program);
if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, debug);
#endif
ps->enable_texture(); ps->enable_texture();
} }
@ -504,7 +498,6 @@ static void SetupFragmentProgramParameters(FRAGMENTSHADER* pf, int context, int
// uniform parameters // uniform parameters
pf->prog.link = (void*)pf; // Setting autolink pf->prog.link = (void*)pf; // Setting autolink
pf->prog.isFragment = true; // Setting autolink pf->prog.isFragment = true; // Setting autolink
pf->ShaderType = ShaderTypes[pf->program];
pf->context = context; pf->context = context;
@ -514,7 +507,6 @@ void SetupVertexProgramParameters(VERTEXSHADER* pf, int context)
{ {
pf->prog.link = (void*)pf; // Setting autolink pf->prog.link = (void*)pf; // Setting autolink
pf->prog.isFragment = false; // Setting autolink pf->prog.isFragment = false; // Setting autolink
pf->ShaderType = ShaderTypes[pf->program];
pf->context = context; pf->context = context;
} }