2012-04-12 17:52:43 +00:00
|
|
|
/* ZZ Open GL graphics plugin
|
|
|
|
* Copyright 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
|
|
|
|
*/
|
2010-08-09 18:57:00 +00:00
|
|
|
|
2010-03-19 00:31:15 +00:00
|
|
|
#ifndef __ZEROGS_SHADERS_H__
|
|
|
|
#define __ZEROGS_SHADERS_H__
|
|
|
|
|
|
|
|
#include <Cg/cg.h>
|
|
|
|
#include <Cg/cgGL.h>
|
2010-03-24 09:19:10 +00:00
|
|
|
#include "PS2Edefs.h"
|
2010-03-19 00:31:15 +00:00
|
|
|
|
2010-07-03 07:57:56 +00:00
|
|
|
#include <cstdio>
|
|
|
|
#include <vector>
|
|
|
|
|
2012-04-17 17:06:58 +00:00
|
|
|
#define ZZshProgram CGprogram
|
|
|
|
#define ZZshContext CGcontext
|
|
|
|
|
2010-07-03 07:57:56 +00:00
|
|
|
using namespace std;
|
|
|
|
|
2010-03-19 00:31:15 +00:00
|
|
|
#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_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
|
|
|
|
|
2010-03-19 06:38:44 +00:00
|
|
|
static __forceinline int GET_SHADER_INDEX(int type, int texfilter, int texwrap, int fog, int writedepth, int testaem, int exactcolor, int context, int ps)
|
2010-03-19 00:31:15 +00:00
|
|
|
{
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2010-09-12 07:15:52 +00:00
|
|
|
extern ZZshContext g_cgcontext;
|
2010-03-19 00:31:15 +00:00
|
|
|
|
2012-04-29 18:50:07 +00:00
|
|
|
static CGprogram LoadShaderFromType(const char* srcdir, const char* srcfile, int type, int texfilter, int texwrap, int fog, int writedepth, int testaem, int exactcolor, int ps, int context)
|
2010-03-19 00:31:15 +00:00
|
|
|
{
|
|
|
|
assert( texwrap < NUM_TEXWRAPS);
|
|
|
|
assert( type < NUM_TYPES );
|
|
|
|
|
|
|
|
char str[255], strctx[255];
|
|
|
|
sprintf(str, "Texture%s%d_%sPS", fog?"Fog":"", texfilter, g_pTexTypes[type]);
|
|
|
|
sprintf(strctx, "-I%s%s", srcdir, context?"ctx1":"ctx0");
|
|
|
|
|
|
|
|
vector<const char*> macros;
|
|
|
|
macros.push_back(strctx);
|
|
|
|
#ifdef _DEBUG
|
|
|
|
macros.push_back("-bestprecision");
|
|
|
|
#endif
|
|
|
|
if( g_pPsTexWrap[texwrap] != NULL ) macros.push_back(g_pPsTexWrap[texwrap]);
|
|
|
|
if( writedepth ) macros.push_back("-DWRITE_DEPTH");
|
|
|
|
if( testaem ) macros.push_back("-DTEST_AEM");
|
|
|
|
if( exactcolor ) macros.push_back("-DEXACT_COLOR");
|
|
|
|
if( ps & SHADER_ACCURATE ) macros.push_back("-DACCURATE_DECOMPRESSION");
|
|
|
|
macros.push_back(NULL);
|
|
|
|
|
2010-09-12 07:15:52 +00:00
|
|
|
ZZshProgram prog = cgCreateProgramFromFile(g_cgcontext, CG_SOURCE, srcfile, CG_PROFILE_ARBFP1, str, ¯os[0]);
|
2010-03-19 00:31:15 +00:00
|
|
|
if( !cgIsProgram(prog) ) {
|
|
|
|
printf("Failed to load shader %s: \n%s\n", str, cgGetLastListing(g_cgcontext));
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return prog;
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
#endif
|