More work in progress.

This commit is contained in:
aignacio_sf 2006-01-18 01:20:11 +00:00
parent 2f0857570c
commit 3e8cd1e273
2 changed files with 256 additions and 77 deletions

View File

@ -33,26 +33,26 @@ CLP(ShaderContext)(ShaderExpansion *s, GSG *gsg) : ShaderContext(s) {
#ifdef HAVE_CGDX9
dxgsg9_cat.debug ( ) << "SHADER: Create ShaderContext \n";
DBG_SH1 dxgsg9_cat.debug ( ) << "SHADER: Create ShaderContext \n"; DBG_E
_cg_context = (CGcontext)0;
// _cg_context = (CGcontext)0;
_cg_profile[SHADER_type_vert] = CG_PROFILE_UNKNOWN;
_cg_profile[SHADER_type_frag] = CG_PROFILE_UNKNOWN;
_cg_program[SHADER_type_vert] = (CGprogram)0;
_cg_program[SHADER_type_frag] = (CGprogram)0;
if (header == "//Cg") {
// Create the Cg context.
_cg_context = cgCreateContext();
if (_cg_context == 0) {
// CGcontext is created once during Reset ( )
if (gsg -> _cg_context == 0) {
release_resources();
cerr << "Cg not supported by this video card.\n";
return;
}
cgD3D9SetDevice(gsg -> _d3d_device);
// IGNORE THIS FOR NOW, SEEMS TO BE LOADING IN API SPECIFIC PROFILES
// IGNORE THIS FOR NOW, SEEMS TO BE LOADING IN GL SPECIFIC PROFILES
if (false)
{
// Parse any directives in the source.
@ -83,13 +83,14 @@ if (false)
return;
}
this -> _name = s->get_name ( );
// Compile the program.
try_cg_compile(s, gsg);
cerr << _cg_errors;
return;
}
#endif
cerr << s->get_name() << ": unrecognized shader language " << header << "\n";
}
@ -176,15 +177,15 @@ try_cg_compile(ShaderExpansion *s, GSG *gsg)
cgGetError();
_cg_program[0] =
cgCreateProgram(_cg_context, CG_SOURCE, s->_text.c_str(),
cgCreateProgram(gsg -> _cg_context, CG_SOURCE, s->_text.c_str(),
_cg_profile[0], "vshader", (const char**)NULL);
print_cg_compile_errors(s->get_name(), _cg_context);
print_cg_compile_errors(s->get_name(), gsg -> _cg_context);
cgGetError();
_cg_program[1] =
cgCreateProgram(_cg_context, CG_SOURCE, s->_text.c_str(),
cgCreateProgram(gsg -> _cg_context, CG_SOURCE, s->_text.c_str(),
_cg_profile[1], "fshader", (const char**)NULL);
print_cg_compile_errors(s->get_name(), _cg_context);
print_cg_compile_errors(s->get_name(), gsg -> _cg_context);
if ((_cg_program[SHADER_type_vert]==0)||(_cg_program[SHADER_type_frag]==0)) {
release_resources();
@ -198,6 +199,9 @@ try_cg_compile(ShaderExpansion *s, GSG *gsg)
// omission on nvidia's part. The following code fetches the output listing,
// detects the error, repairs the code, and resumbits the repaired code to Cg.
if ((_cg_profile[1] == CG_PROFILE_ARBFP1) && (gsg->get_supports_shadow_filter ( ))) {
DBG_SH1 dxgsg9_cat.debug ( ) << "SHADER COMPILE HACK\n"; DBG_E
bool shadowunit[32];
bool anyshadow = false;
memset(shadowunit, 0, sizeof(shadowunit));
@ -253,9 +257,9 @@ try_cg_compile(ShaderExpansion *s, GSG *gsg)
}
cgDestroyProgram(_cg_program[1]);
_cg_program[1] =
cgCreateProgram(_cg_context, CG_OBJECT, result.c_str(),
cgCreateProgram(gsg -> _cg_context, CG_OBJECT, result.c_str(),
_cg_profile[1], "fshader", (const char**)NULL);
print_cg_compile_errors(s->get_name(), _cg_context);
print_cg_compile_errors(s->get_name(), gsg -> _cg_context);
if (_cg_program[SHADER_type_frag]==0) {
release_resources();
return false;
@ -281,7 +285,7 @@ try_cg_compile(ShaderExpansion *s, GSG *gsg)
DWORD assembly_flags;
// ?????
paramater_shadowing = !TRUE;
paramater_shadowing = FALSE;
assembly_flags = 0;
cgD3D9LoadProgram(_cg_program[SHADER_type_vert], paramater_shadowing, assembly_flags);
@ -291,7 +295,7 @@ try_cg_compile(ShaderExpansion *s, GSG *gsg)
+ cgGetProfileString(_cg_profile[SHADER_type_vert]) + " "
+ cgGetProfileString(_cg_profile[SHADER_type_frag]) + "\n";
dxgsg9_cat.debug ( ) << "SHADER: try_cg_compile \n";
DBG_SH1 dxgsg9_cat.debug ( ) << "SHADER: try_cg_compile \n"; DBG_E
return true;
}
@ -316,9 +320,7 @@ CLP(ShaderContext)::
void CLP(ShaderContext)::
release_resources() {
#ifdef HAVE_CGDX9
if (_cg_context) {
cgDestroyContext(_cg_context);
_cg_context = (CGcontext)0;
{
_cg_profile[SHADER_type_vert] = (CGprofile)0;
_cg_profile[SHADER_type_frag] = (CGprofile)0;
_cg_program[SHADER_type_vert] = (CGprogram)0;
@ -337,9 +339,9 @@ release_resources() {
void CLP(ShaderContext)::
bind(GSG *gsg) {
#ifdef HAVE_CGDX9
if (_cg_context != 0) {
if (gsg -> _cg_context != 0) {
dxgsg9_cat.debug ( ) << "SHADER: bind \n";
DBG_SH5 dxgsg9_cat.debug ( ) << "SHADER: bind \n"; DBG_E
// clear the last cached FVF to make sure the next SetFVF call goes through
gsg -> _last_fvf = 0;
@ -380,17 +382,18 @@ dxgsg9_cat.debug ( ) << "SHADER: bind \n";
<< D3DERRORSTRING(hr);
}
dxgsg9_cat.debug ( )
<< "SHADER: V "
<< vertex_shader
<< " P "
<< pixel_shader
<< " CG VS"
<< _cg_program[SHADER_type_vert]
<< " CG PS"
<< _cg_program[SHADER_type_frag]
<< "\n";
DBG_SH5 dxgsg9_cat.debug ( )
<< this -> _name
<< "\nSHADER: V "
<< vertex_shader
<< " P "
<< pixel_shader
<< " CG VS"
<< _cg_program[SHADER_type_vert]
<< " CG PS"
<< _cg_program[SHADER_type_frag]
<< "\n";
DBG_E
}
#endif
}
@ -404,7 +407,7 @@ void CLP(ShaderContext)::
unbind(GSG *gsg)
{
#ifdef HAVE_CGDX9
if (_cg_context != 0) {
if (gsg -> _cg_context != 0) {
// ????? cgD3D9DisableProfile(_cg_profile[SHADER_type_vert]);
// ????? cgD3D9DisableProfile(_cg_profile[SHADER_type_frag]);
HRESULT hr;
@ -422,7 +425,7 @@ unbind(GSG *gsg)
<< D3DERRORSTRING(hr);
}
dxgsg9_cat.debug ( ) << "SHADER: unbind \n";
DBG_SH5 dxgsg9_cat.debug ( ) << "SHADER: unbind \n"; DBG_E
}
#endif
@ -442,6 +445,11 @@ issue_cg_auto_bind(const ShaderAutoBind &bind, GSG *gsg)
LMatrix4f temp_matrix;
CGparameter p = bind.parameter;
HRESULT hr;
DBG_SH1 dxgsg9_cat.debug ( ) << "SHADER: issue_cg_auto_bind " << bind.value << "\n"; DBG_E
switch(bind.value) {
case SIC_mat_modelview:
case SIC_inv_modelview:
@ -471,13 +479,23 @@ issue_cg_auto_bind(const ShaderAutoBind &bind, GSG *gsg)
{
case CG_GL_MODELVIEW_MATRIX:
// which one ?????
p_matrix = &(gsg -> _external_transform -> get_mat ( ));
// SHADER ISSUE: which matrix ?????
//p_matrix = &(gsg -> _external_transform -> get_mat ( ));
p_matrix = &(gsg -> _internal_transform -> get_mat ( ));
// SHADER ISSUE: ***** DX_TRANSPOSE REQUIRED FOR COMPATIBILITY
temp_matrix.transpose_from (*p_matrix);
p_matrix = &temp_matrix;
break;
case CG_GL_PROJECTION_MATRIX:
p_matrix = &gsg->_projection_mat;
// SHADER ISSUE: ***** DX_TRANSPOSE REQUIRED FOR COMPATIBILITY
temp_matrix.transpose_from (*p_matrix);
p_matrix = &temp_matrix;
break;
case CG_GL_TEXTURE_MATRIX:
@ -485,25 +503,99 @@ p_matrix = &(gsg -> _internal_transform -> get_mat ( ));
tex_matrix_attrib = gsg->_state._tex_matrix;
// using default ?????
// SHADER ISSUE: using default ????? GL texture matrix = which DX texture matrix ?????
p_matrix = &(tex_matrix_attrib -> get_mat ( ));
// SHADER ISSUE: ***** DX_TRANSPOSE REQUIRED FOR COMPATIBILITY
temp_matrix.transpose_from (*p_matrix);
p_matrix = &temp_matrix;
break;
case CG_GL_MODELVIEW_PROJECTION_MATRIX:
const LMatrix4f *model_matrix;
const LMatrix4f *projection_matrix;
// which one ?????
model_matrix = &(gsg -> _external_transform -> get_mat ( ));
model_matrix = &(gsg -> _internal_transform -> get_mat ( ));
DBG_SH4 dxgsg9_cat.debug ( ) << "SHADER: issue_cg_auto_bind CG_GL_MODELVIEW_PROJECTION_MATRIX " << bind.value << "\n"; DBG_E
projection_matrix = &gsg->_projection_mat;
// which one ?????
// temp_matrix.multiply (*projection_matrix, *model_matrix);
temp_matrix.multiply (*model_matrix, *projection_matrix);
// which matrix ?????
// which multiply order ?????
static int state = 3;
switch (state & 0x03)
{
case 0:
model_matrix = &(gsg -> _external_transform -> get_mat ( ));
temp_matrix.multiply (*projection_matrix, *model_matrix);
break;
case 1:
model_matrix = &(gsg -> _internal_transform -> get_mat ( ));
temp_matrix.multiply (*projection_matrix, *model_matrix);
break;
case 2:
model_matrix = &(gsg -> _external_transform -> get_mat ( ));
temp_matrix.multiply (*model_matrix, *projection_matrix);
break;
case 3:
model_matrix = &(gsg -> _internal_transform -> get_mat ( ));
temp_matrix.multiply (*model_matrix, *projection_matrix);
break;
}
DBG_SH4
const float *data;
data = model_matrix -> get_data ( );
dxgsg9_cat.debug ( ) << "MODELVIEW MATRIX \n" <<
data[ 0] << " " << data[ 1] << " " << data[ 2] << " " << data[ 3] << "\n" <<
data[ 4] << " " << data[ 5] << " " << data[ 6] << " " << data[ 7] << "\n" <<
data[ 8] << " " << data[ 9] << " " << data[10] << " " << data[11] << "\n" <<
data[12] << " " << data[13] << " " << data[14] << " " << data[15] << "\n";
model_matrix = &(gsg -> _external_transform -> get_mat ( ));
data = model_matrix -> get_data ( );
dxgsg9_cat.debug ( ) << "EXTERNAL MODELVIEW MATRIX \n" <<
data[ 0] << " " << data[ 1] << " " << data[ 2] << " " << data[ 3] << "\n" <<
data[ 4] << " " << data[ 5] << " " << data[ 6] << " " << data[ 7] << "\n" <<
data[ 8] << " " << data[ 9] << " " << data[10] << " " << data[11] << "\n" <<
data[12] << " " << data[13] << " " << data[14] << " " << data[15] << "\n";
data = projection_matrix -> get_data ( );
dxgsg9_cat.debug ( ) << "PROJECTION MATRIX \n" <<
data[ 0] << " " << data[ 1] << " " << data[ 2] << " " << data[ 3] << "\n" <<
data[ 4] << " " << data[ 5] << " " << data[ 6] << " " << data[ 7] << "\n" <<
data[ 8] << " " << data[ 9] << " " << data[10] << " " << data[11] << "\n" <<
data[12] << " " << data[13] << " " << data[14] << " " << data[15] << "\n";
D3DMATRIX d3d_matrix;
data = &d3d_matrix._11;
gsg -> _d3d_device -> GetTransform (D3DTS_WORLDMATRIX(0), &d3d_matrix);
dxgsg9_cat.debug ( ) << "D3DTS_WORLDMATRIX(0) \n" <<
data[ 0] << " " << data[ 1] << " " << data[ 2] << " " << data[ 3] << "\n" <<
data[ 4] << " " << data[ 5] << " " << data[ 6] << " " << data[ 7] << "\n" <<
data[ 8] << " " << data[ 9] << " " << data[10] << " " << data[11] << "\n" <<
data[12] << " " << data[13] << " " << data[14] << " " << data[15] << "\n";
DBG_E
/*
gsg -> _d3d_device -> GetTransform (D3DTS_WORLDMATRIX(1), &d3d_matrix);
dxgsg9_cat.debug ( ) << "D3DTS_WORLDMATRIX(1) \n" <<
data[ 0] << " " << data[ 1] << " " << data[ 2] << " " << data[ 3] << "\n" <<
data[ 4] << " " << data[ 5] << " " << data[ 6] << " " << data[ 7] << "\n" <<
data[ 8] << " " << data[ 9] << " " << data[10] << " " << data[11] << "\n" <<
data[12] << " " << data[13] << " " << data[14] << " " << data[15] << "\n";
gsg -> _d3d_device -> GetTransform (D3DTS_WORLDMATRIX(2), &d3d_matrix);
dxgsg9_cat.debug ( ) << "D3DTS_WORLDMATRIX(2) \n" <<
data[ 0] << " " << data[ 1] << " " << data[ 2] << " " << data[ 3] << "\n" <<
data[ 4] << " " << data[ 5] << " " << data[ 6] << " " << data[ 7] << "\n" <<
data[ 8] << " " << data[ 9] << " " << data[10] << " " << data[11] << "\n" <<
data[12] << " " << data[13] << " " << data[14] << " " << data[15] << "\n";
*/
// SHADER ISSUE: ***** DX_TRANSPOSE REQUIRED FOR COMPATIBILITY
temp_matrix.transpose_in_place ( );
p_matrix = &temp_matrix;
break;
}
@ -527,21 +619,61 @@ temp_matrix.multiply (*model_matrix, *projection_matrix);
p_matrix = &matrix;
break;
}
cgD3D9SetUniformArray (p, 0, 16, p_matrix -> get_data ( ));
hr = cgD3D9SetUniform (p, p_matrix -> get_data ( ));
if (FAILED (hr)) {
dxgsg9_cat.error()
<< "cgD3D9SetUniform "
<< bind.value << " failed "
<< " size " << cgD3D9TypeToSize(cgGetParameterType(p))
<< D3DERRORSTRING(hr);
switch (hr)
{
case CGD3D9ERR_INVALIDPARAM:
dxgsg9_cat.error() << "CGD3D9ERR_INVALIDPARAM\n";
break;
case CGD3D9ERR_NODEVICE:
dxgsg9_cat.error() << "CGD3D9ERR_NODEVICE\n";
break;
case CGD3D9ERR_NOTLOADED:
dxgsg9_cat.error() << "CGD3D9ERR_NOTLOADED\n";
break;
case CGD3D9ERR_NOTUNIFORM:
dxgsg9_cat.error() << "CGD3D9ERR_NOTUNIFORM\n";
break;
case CGD3D9ERR_NULLVALUE:
dxgsg9_cat.error() << "CGD3D9ERR_NULLVALUE\n";
break;
case CGD3D9ERR_OUTOFRANGE:
dxgsg9_cat.error() << "CGD3D9ERR_OUTOFRANGE\n";
break;
}
}
return;
case SIC_sys_windowsize:
t[0] = gsg->get_current_display_region ( )->get_pixel_width();
t[1] = gsg->get_current_display_region ( )->get_pixel_height();
t[2] = 1;
t[3] = 1;
cgD3D9SetUniformArray (p, 0, 4, t.get_data());
hr = cgD3D9SetUniform (p, t.get_data());
if (FAILED (hr)) {
dxgsg9_cat.error()
<< "cgD3D9SetUniform " << bind.value << " failed "
<< D3DERRORSTRING(hr);
}
return;
case SIC_sys_pixelsize:
t[0] = 1.0 / gsg->get_current_display_region ( )->get_pixel_width();
t[1] = 1.0 / gsg->get_current_display_region ( )->get_pixel_height();
t[2] = 1;
t[3] = 1;
cgD3D9SetUniformArray (p, 0, 4, t.get_data());
hr = cgD3D9SetUniform (p, t.get_data());
if (FAILED (hr)) {
dxgsg9_cat.error()
<< "cgD3D9SetUniform " << bind.value << " failed "
<< D3DERRORSTRING(hr);
}
return;
case SIC_sys_cardcenter:
px = gsg->get_current_display_region ( )->get_pixel_width();
@ -552,7 +684,12 @@ temp_matrix.multiply (*model_matrix, *projection_matrix);
t[1] = yhi*0.5;
t[2] = 1;
t[3] = 1;
cgD3D9SetUniformArray (p, 0, 4, t.get_data());
hr = cgD3D9SetUniform (p, t.get_data());
if (FAILED (hr)) {
dxgsg9_cat.error()
<< "cgD3D9SetUniform " << bind.value << " failed "
<< D3DERRORSTRING(hr);
}
return;
}
}
@ -570,13 +707,18 @@ void CLP(ShaderContext)::
issue_parameters(GSG *gsg)
{
#ifdef HAVE_CGDX9
if (_cg_context != 0) {
DBG_SH3 dxgsg9_cat.debug ( ) << "SHADER: issue_parameters\n"; DBG_E
if (gsg -> _cg_context != 0) {
// Pass in k-float parameters.
for (int i=0; i<(int)_cg_fbind.size(); i++) {
InternalName *id = _cg_fbind[i].name;
const ShaderInput *input = gsg->_target._shader->get_shader_input(id);
// cgD3D9SetParameter4fv(_cg_fbind[i].parameter, input->get_vector().get_data());
cgD3D9SetUniformArray (_cg_fbind[i].parameter, 0, 4, input->get_vector().get_data());
DBG_SH3 dxgsg9_cat.debug ( ) << "SHADER: issue_parameters, _cg_fbind \n"; DBG_E
cgD3D9SetUniform (_cg_fbind[i].parameter, input->get_vector().get_data());
}
// Pass in k-float4x4 parameters.
@ -587,7 +729,9 @@ issue_parameters(GSG *gsg)
if (input->get_nodepath().is_empty()) {
dat = LMatrix4f::ident_mat().get_data();
cgD3D9SetUniformArray (_cg_npbind[i].parameter, 0, 16, dat);
DBG_SH3 dxgsg9_cat.debug ( ) << "SHADER: issue_parameters, _cg_npbind \n"; DBG_E
cgD3D9SetUniform (_cg_npbind[i].parameter, dat);
} else {
dat = input->get_nodepath().node()->get_transform()->get_mat().get_data();
@ -611,10 +755,10 @@ issue_parameters(GSG *gsg)
matrix [14] = dat[11];
matrix [15] = dat[15];
cgD3D9SetUniformArray (_cg_npbind[i].parameter, 0, 16, matrix);
}
DBG_SH3 dxgsg9_cat.debug ( ) << "SHADER: issue_parameters, _cg_npbind 2 \n"; DBG_E
// cgD3D9SetMatrixParameterfc(_cg_npbind[i].parameter, dat);
cgD3D9SetUniform (_cg_npbind[i].parameter, matrix);
}
}
// Pass in system parameters
@ -624,6 +768,9 @@ issue_parameters(GSG *gsg)
// Pass in trans,tpose,row,col,xvec,yvec,zvec,pos parameters
for (int i=0; i<(int)_cg_parameter_bind.size(); i++) {
DBG_SH3 dxgsg9_cat.debug ( ) << "SHADER: issue_parameters, _cg_parameter_bind \n"; DBG_E
bind_cg_transform(_cg_parameter_bind[i], gsg);
}
}
@ -643,7 +790,7 @@ void CLP(ShaderContext)::
issue_transform(GSG *gsg)
{
#ifdef HAVE_CGDX9
if (_cg_context != 0) {
if (gsg -> _cg_context != 0) {
// Pass in modelview, projection, etc.
for (int i=0; i<(int)_cg_auto_trans.size(); i++) {
issue_cg_auto_bind(_cg_auto_trans[i], gsg);
@ -665,9 +812,12 @@ void CLP(ShaderContext)::
disable_shader_vertex_arrays(GSG *gsg)
{
#ifdef HAVE_CGDX9
if (_cg_context) {
if (gsg -> _cg_context) {
for (int i=0; i<(int)_cg_varying.size(); i++) {
// ????? cgD3D9DisableClientState(_cg_varying[i].parameter);
// ORIGINAL GL CODE: NO EQUIVALENT IN DX
// cgGLDisableClientState(_cg_varying[i].parameter);
}
}
#endif
@ -689,7 +839,10 @@ update_shader_vertex_arrays(CLP(ShaderContext) *prev, GSG *gsg)
{
if (prev) prev->disable_shader_vertex_arrays(gsg);
#ifdef HAVE_CGDX9
if (_cg_context) {
if (gsg -> _cg_context) {
// RETURN
//return;
/* ?????
#ifdef SUPPORT_IMMEDIATE_MODE
@ -704,6 +857,9 @@ update_shader_vertex_arrays(CLP(ShaderContext) *prev, GSG *gsg)
Geom::NumericType numeric_type;
int start, stride, num_values;
int nvarying = _cg_varying.size();
DBG_SH1 dxgsg9_cat.debug ( ) << "SHADER: update_shader_vertex_arrays: nvarying " << nvarying << "\n"; DBG_E
for (int i=0; i<nvarying; i++) {
InternalName *name = _cg_varying[i].name;
int texslot = _cg_varying[i].append_uv;
@ -722,6 +878,8 @@ update_shader_vertex_arrays(CLP(ShaderContext) *prev, GSG *gsg)
}
if (gsg->_vertex_data->get_array_info(name, array_data, num_values,
numeric_type, start, stride)) {
// ?????
/*
const unsigned char *client_pointer = gsg->setup_array_data(array_data);
@ -731,16 +889,25 @@ update_shader_vertex_arrays(CLP(ShaderContext) *prev, GSG *gsg)
*/
// Set DirectX Vertex Declaration
/*
HRESULT hr;
IDirect3DVertexDeclaration9 *vertex_declaration;
vertex_declaration = 0;
*/
dxgsg9_cat.debug ( ) << "SHADER: update_shader_vertex_arrays \n";
DBG_SH1 dxgsg9_cat.debug ( ) << "SHADER: update_shader_vertex_arrays " << i << "\n"; DBG_E
DBG_SH1 dxgsg9_cat.debug ( )
<< "\n name " << name -> get_name ( )
<< " num_values " << num_values
<< " numeric_type " << numeric_type
<< " start " << start
<< " stride " << stride
<< "\n"; DBG_E
/*
hr = gsg -> _d3d_device -> SetVertexDeclaration (vertex_declaration);
if (FAILED (hr)) {
dxgsg9_cat.error()
@ -765,6 +932,7 @@ stride = 0;
<< "SetStreamSource failed "
<< D3DERRORSTRING(hr);
}
*/
// ????? cgD3D9EnableClientState(_cg_varying[i].parameter);
} else {
@ -785,7 +953,7 @@ void CLP(ShaderContext)::
disable_shader_texture_bindings(GSG *gsg)
{
#ifdef HAVE_CGDX9
if (_cg_context) {
if (gsg -> _cg_context) {
for (int i=0; i<(int)_cg_texbind.size(); i++) {
int texunit = cgGetParameterResourceIndex(_cg_texbind[i].parameter);
@ -802,6 +970,8 @@ disable_shader_texture_bindings(GSG *gsg)
// This is probably faster - but maybe not as safe?
// cgD3D9DisableTextureParameter(_cg_texbind[i].parameter);
*/
// NOT SURE IF THIS IS CORRECT FROM GL TO DX
HRESULT hr;
hr = gsg -> _d3d_device -> SetTexture (texunit, NULL);
@ -833,7 +1003,7 @@ update_shader_texture_bindings(CLP(ShaderContext) *prev, GSG *gsg)
{
if (prev) prev->disable_shader_texture_bindings(gsg);
#ifdef HAVE_CGDX9
if (_cg_context) {
if (gsg -> _cg_context) {
for (int i=0; i<(int)_cg_texbind.size(); i++) {
Texture *tex = 0;
InternalName *id = _cg_texbind[i].name;
@ -862,6 +1032,8 @@ update_shader_texture_bindings(CLP(ShaderContext) *prev, GSG *gsg)
continue;
}
int texunit = cgGetParameterResourceIndex(_cg_texbind[i].parameter);
// ?????
/*
gsg->_glActiveTexture(GL_TEXTURE0 + texunit);
@ -872,6 +1044,7 @@ update_shader_texture_bindings(CLP(ShaderContext) *prev, GSG *gsg)
}
GLP(Enable)(target);
*/
// NOT SURE IF THIS IS CORRECT FROM GL TO DX
gsg->apply_texture(texunit, tc);
}
}
@ -960,6 +1133,9 @@ bind_cg_transform(const ShaderTransBind &stb, GSG *gsg)
// data[ 8] << " " << data[ 9] << " " << data[10] << " " << data[11] << "\n" <<
// data[12] << " " << data[13] << " " << data[14] << " " << data[15] << "\n";
DBG_SH4 dxgsg9_cat.debug ( ) << "bind_cg_transform " << stb.trans_piece << "\n"; DBG_E
data = total->get_mat().get_data();
switch (stb.trans_piece) {
/*
@ -979,7 +1155,7 @@ bind_cg_transform(const ShaderTransBind &stb, GSG *gsg)
float matrix [16];
case SHADER_data_matrix:
cgD3D9SetUniformArray (stb.parameter, 0, 16, data);
cgD3D9SetUniform (stb.parameter, data);
break;
case SHADER_data_transpose:
matrix [0] = data[0];
@ -998,47 +1174,47 @@ bind_cg_transform(const ShaderTransBind &stb, GSG *gsg)
matrix [13] = data[7];
matrix [14] = data[11];
matrix [15] = data[15];
cgD3D9SetUniformArray (stb.parameter, 0, 16, matrix);
cgD3D9SetUniform (stb.parameter, matrix);
break;
case SHADER_data_row0:
cgD3D9SetUniformArray (stb.parameter, 0, 4, data);
cgD3D9SetUniform (stb.parameter, data);
break;
case SHADER_data_row1:
cgD3D9SetUniformArray (stb.parameter, 0, 4, data + 4);
cgD3D9SetUniform (stb.parameter, data + 4);
break;
case SHADER_data_row2:
cgD3D9SetUniformArray (stb.parameter, 0, 4, data + 8);
cgD3D9SetUniform (stb.parameter, data + 8);
break;
case SHADER_data_row3:
cgD3D9SetUniformArray (stb.parameter, 0, 4, data + 12);
cgD3D9SetUniform (stb.parameter, data + 12);
break;
case SHADER_data_col0:
vector [0] = data[0];
vector [1] = data[4];
vector [2] = data[8];
vector [3] = data[12];
cgD3D9SetUniformArray (stb.parameter, 0, 4, vector);
cgD3D9SetUniform (stb.parameter, vector);
break;
case SHADER_data_col1:
vector [0] = data[1];
vector [1] = data[5];
vector [2] = data[9];
vector [3] = data[13];
cgD3D9SetUniformArray (stb.parameter, 0, 4, vector);
cgD3D9SetUniform (stb.parameter, vector);
break;
case SHADER_data_col2:
vector [0] = data[2];
vector [1] = data[6];
vector [2] = data[10];
vector [3] = data[14];
cgD3D9SetUniformArray (stb.parameter, 0, 4, vector);
cgD3D9SetUniform (stb.parameter, vector);
break;
case SHADER_data_col3:
vector [0] = data[3];
vector [1] = data[7];
vector [2] = data[11];
vector [3] = data[15];
cgD3D9SetUniformArray (stb.parameter, 0, 4, vector);
cgD3D9SetUniform (stb.parameter, vector);
break;
}
}
@ -1552,5 +1728,3 @@ compile_cg_parameter(CGparameter p)
return false;
}
#endif

View File

@ -46,14 +46,15 @@ class CLP(GraphicsStateGuardian);
// Description : xyz
////////////////////////////////////////////////////////////////////
typedef CLP(GraphicsStateGuardian) GSG;
class EXPCL_PANDADX CLP(ShaderContext): public ShaderContext {
public:
typedef CLP(GraphicsStateGuardian) GSG;
CLP(ShaderContext)(ShaderExpansion *s, GSG *gsg);
~CLP(ShaderContext)();
INLINE bool valid(void);
INLINE bool valid(GSG *gsg);
void bind(GSG *gsg);
void unbind(GSG *gsg);
void issue_parameters(GSG *gsg);
@ -63,6 +64,9 @@ public:
void disable_shader_texture_bindings(GSG *gsg);
void update_shader_texture_bindings(CLP(ShaderContext) *prev, GSG *gsg);
// FOR DEBUGGING
string _name;
private:
#ifdef HAVE_CGDX9
@ -116,7 +120,8 @@ private:
PT(InternalName) name;
int append_uv;
};
CGcontext _cg_context;
// CGcontext _cg_context;
CGprofile _cg_profile[2];
CGprogram _cg_program[2];
string _cg_errors;