mirror of https://github.com/PCSX2/pcsx2.git
zzogl:
* 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:
parent
d062ca1727
commit
05fc11daf5
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue