mirror of https://github.com/PCSX2/pcsx2.git
229 lines
6.9 KiB
C++
229 lines
6.9 KiB
C++
/* ZZ Open GL graphics plugin
|
|
* Copyright (c)2009-2010 zeydlitz@gmail.com, arcum42@gmail.com
|
|
* Based on Zerofrog's ZeroGS KOSMOS (c)2005-2008
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
#ifndef __ZEROGS_SHADERS_H__
|
|
#define __ZEROGS_SHADERS_H__
|
|
|
|
// I'll need to figure out a way to get rid of this dependency... --arcum42
|
|
#include "GS.h"
|
|
#include <Cg/cg.h>
|
|
#include <Cg/cgGL.h>
|
|
|
|
#define NUM_FILTERS 2 // texture filtering
|
|
#define NUM_TYPES 5 // types of texture read modes
|
|
#define NUM_TEXWRAPS 4 // texture wrapping
|
|
|
|
#define SHADER_REDUCED 1 // equivalent to ps2.0
|
|
#define SHADER_ACCURATE 2 // for older cards with less accurate math (ps2.x+)
|
|
|
|
#define NUM_SHADERS (NUM_FILTERS*NUM_TYPES*NUM_TEXWRAPS*32) // # shaders for a given ps
|
|
|
|
const static char* g_pShaders[] = { "full", "reduced", "accurate", "accurate-reduced" };
|
|
const static char* g_pPsTexWrap[] = { "-DREPEAT", "-DCLAMP", "-DREGION_REPEAT", NULL };
|
|
const static char* g_pTexTypes[] = { "32", "tex32", "clut32", "tex32to16", "tex16to8h" };
|
|
|
|
#define TEXWRAP_REPEAT 0
|
|
#define TEXWRAP_CLAMP 1
|
|
#define TEXWRAP_REGION_REPEAT 2
|
|
#define TEXWRAP_REPEAT_CLAMP 3
|
|
|
|
inline int GET_SHADER_INDEX(int type, int texfilter, int texwrap, int fog, int writedepth, int testaem, int exactcolor, int context, int ps)
|
|
{
|
|
return type + texfilter*NUM_TYPES + NUM_FILTERS*NUM_TYPES*texwrap + NUM_TEXWRAPS*NUM_FILTERS*NUM_TYPES*(fog+2*writedepth+4*testaem+8*exactcolor+16*context+32*ps);
|
|
}
|
|
|
|
struct SHADERHEADER
|
|
{
|
|
unsigned int index, offset, size; // if highest bit of index is set, pixel shader
|
|
};
|
|
|
|
#define SH_WRITEDEPTH 0x2000 // depth is written
|
|
#define SH_CONTEXT1 0x1000 // context1 is used
|
|
|
|
#define SH_REGULARVS 0x8000
|
|
#define SH_TEXTUREVS 0x8001
|
|
#define SH_REGULARFOGVS 0x8002
|
|
#define SH_TEXTUREFOGVS 0x8003
|
|
#define SH_REGULARPS 0x8004
|
|
#define SH_REGULARFOGPS 0x8005
|
|
#define SH_BITBLTVS 0x8006
|
|
#define SH_BITBLTPS 0x8007
|
|
#define SH_BITBLTDEPTHPS 0x8009
|
|
#define SH_CRTCTARGPS 0x800a
|
|
#define SH_CRTCPS 0x800b
|
|
#define SH_CRTC24PS 0x800c
|
|
#define SH_ZEROPS 0x800e
|
|
#define SH_BASETEXTUREPS 0x800f
|
|
#define SH_BITBLTAAPS 0x8010
|
|
#define SH_CRTCTARGINTERPS 0x8012
|
|
#define SH_CRTCINTERPS 0x8013
|
|
#define SH_CRTC24INTERPS 0x8014
|
|
#define SH_BITBLTDEPTHMRTPS 0x8016
|
|
#define SH_CONVERT16TO32PS 0x8020
|
|
#define SH_CONVERT32TO16PS 0x8021
|
|
#define SH_CRTC_NEARESTPS 0x8022
|
|
#define SH_CRTCINTER_NEARESTPS 0x8023
|
|
|
|
|
|
struct FRAGMENTSHADER
|
|
{
|
|
FRAGMENTSHADER() : prog(0), sMemory(0), sFinal(0), sBitwiseANDX(0), sBitwiseANDY(0), sInterlace(0), sCLUT(0), sOneColor(0), sBitBltZ(0),
|
|
fTexAlpha2(0), fTexOffset(0), fTexDims(0), fTexBlock(0), fClampExts(0), fTexWrapMode(0),
|
|
fRealTexDims(0), fTestBlack(0), fPageOffset(0), fTexAlpha(0) {}
|
|
|
|
CGprogram prog;
|
|
CGparameter sMemory, sFinal, sBitwiseANDX, sBitwiseANDY, sInterlace, sCLUT;
|
|
CGparameter sOneColor, sBitBltZ, sInvTexDims;
|
|
CGparameter fTexAlpha2, fTexOffset, fTexDims, fTexBlock, fClampExts, fTexWrapMode, fRealTexDims, fTestBlack, fPageOffset, fTexAlpha;
|
|
|
|
#ifdef _DEBUG
|
|
string filename;
|
|
#endif
|
|
|
|
void set_uniform_param(CGparameter &var, const char *name)
|
|
{
|
|
CGparameter p;
|
|
p = cgGetNamedParameter(prog, name);
|
|
|
|
if (p != NULL && cgIsParameterUsed(p, prog) == CG_TRUE) var = p;
|
|
}
|
|
|
|
bool set_texture(GLuint texobj, const char *name)
|
|
{
|
|
CGparameter p;
|
|
|
|
p = cgGetNamedParameter(prog, name);
|
|
|
|
if (p != NULL && cgIsParameterUsed(p, prog) == CG_TRUE)
|
|
{
|
|
cgGLSetTextureParameter(p, texobj);
|
|
cgGLEnableTextureParameter(p);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool connect(CGparameter &tex, const char *name)
|
|
{
|
|
CGparameter p;
|
|
|
|
p = cgGetNamedParameter(prog, name);
|
|
|
|
if (p != NULL && cgIsParameterUsed(p, prog) == CG_TRUE)
|
|
{
|
|
cgConnectParameter(tex, p);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool set_texture(CGparameter &tex, const char *name)
|
|
{
|
|
CGparameter p;
|
|
|
|
p = cgGetNamedParameter(prog, name);
|
|
|
|
if (p != NULL && cgIsParameterUsed(p, prog) == CG_TRUE)
|
|
{
|
|
//cgGLEnableTextureParameter(p);
|
|
tex = p;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool set_shader_const(Vector v, const char *name)
|
|
{
|
|
CGparameter p;
|
|
|
|
p = cgGetNamedParameter(prog, name);
|
|
|
|
if (p != NULL && cgIsParameterUsed(p, prog) == CG_TRUE)
|
|
{
|
|
cgGLSetParameter4fv(p, v);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
};
|
|
|
|
struct VERTEXSHADER
|
|
{
|
|
VERTEXSHADER() : prog(0), sBitBltPos(0), sBitBltTex(0) {}
|
|
CGprogram prog;
|
|
CGparameter sBitBltPos, sBitBltTex, fBitBltTrans; // vertex shader constants
|
|
};
|
|
|
|
// ------------------------- Variables -------------------------------
|
|
|
|
extern u8* s_lpShaderResources;
|
|
extern CGprofile cgvProf, cgfProf;
|
|
extern int g_nPixelShaderVer;
|
|
extern CGprogram pvs[16];
|
|
extern FRAGMENTSHADER ppsRegular[4], ppsTexture[NUM_SHADERS];
|
|
extern FRAGMENTSHADER ppsCRTC[2], ppsCRTC24[2], ppsCRTCTarg[2];
|
|
extern CGprogram g_vsprog, g_psprog;
|
|
extern CGparameter g_vparamPosXY[2], g_fparamFogColor;
|
|
|
|
// ------------------------- Functions -------------------------------
|
|
extern const char* ShaderCallerName;
|
|
extern const char* ShaderHandleName;
|
|
|
|
inline void SetShaderCaller(const char* Name) {
|
|
ShaderCallerName = Name;
|
|
}
|
|
|
|
inline void SetHandleName(const char* Name) {
|
|
ShaderHandleName = Name;
|
|
}
|
|
|
|
extern bool ZZcgCheckProfilesSupport();
|
|
extern bool ZZcgStartUsingShaders();
|
|
extern void ZZcgGLDisableProfile();
|
|
extern void ZZcgGLEnableProfile();
|
|
extern void ZZcgSetParameter4fv(CGparameter param, const float* v, const char* name);
|
|
extern void ZZcgGLSetTextureParameter(CGparameter param, GLuint texobj, const char* name);
|
|
extern void ZZcgDefaultOneColor( FRAGMENTSHADER ptr );
|
|
extern void ZZcgSetVertexShader(CGprogram prog);
|
|
extern void ZZcgSetPixelShader(CGprogram prog);
|
|
|
|
#define SAFE_RELEASE_PROG(x) { if( (x) != NULL ) { cgDestroyProgram(x); x = NULL; } }
|
|
|
|
namespace ZeroGS {
|
|
// Shaders variables
|
|
extern Vector g_vdepth;
|
|
extern Vector vlogz;
|
|
extern VERTEXSHADER pvsBitBlt;
|
|
extern FRAGMENTSHADER ppsBitBlt[2], ppsBitBltDepth, ppsOne;
|
|
extern FRAGMENTSHADER ppsBaseTexture, ppsConvert16to32, ppsConvert32to16;
|
|
bool LoadEffects();
|
|
bool LoadExtraEffects();
|
|
FRAGMENTSHADER* LoadShadeEffect(int type, int texfilter, int fog, int testaem, int exactcolor, const clampInfo& clamp, int context, bool* pbFailed);
|
|
|
|
// only sets a limited amount of state (for Update)
|
|
void SetTexClamping(int context, FRAGMENTSHADER* pfragment);
|
|
void SetTexVariablesInt(int context, int bilinear, const tex0Info& tex0, bool CheckVB, FRAGMENTSHADER* pfragment, int force);
|
|
}
|
|
|
|
#endif
|