GFXD3D9Device generic shader support.

This commit is contained in:
rextimmy 2016-07-02 17:08:28 +10:00
parent 48aed0e0ca
commit 7d82877f4e
2 changed files with 58 additions and 27 deletions

View file

@ -33,6 +33,7 @@
#include "gfx/D3D9/gfxD3D9OcclusionQuery.h" #include "gfx/D3D9/gfxD3D9OcclusionQuery.h"
#include "gfx/D3D9/gfxD3D9Shader.h" #include "gfx/D3D9/gfxD3D9Shader.h"
#include "windowManager/platformWindow.h" #include "windowManager/platformWindow.h"
#include "materials/shaderData.h"
#ifndef TORQUE_OS_XENON #ifndef TORQUE_OS_XENON
# include "windowManager/win32/win32Window.h" # include "windowManager/win32/win32Window.h"
#endif #endif
@ -83,6 +84,9 @@ GFXD3D9Device::GFXD3D9Device( LPDIRECT3D9 d3d, U32 index )
mOcclusionQuerySupported = false; mOcclusionQuerySupported = false;
for (U32 i = 0; i < GS_COUNT; ++i)
mModelViewProjSC[i] = NULL;
// Set up the Enum translation tables // Set up the Enum translation tables
GFXD3D9EnumTranslate::init(); GFXD3D9EnumTranslate::init();
@ -139,40 +143,65 @@ GFXD3D9Device::~GFXD3D9Device()
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// setupGenericShaders - This function is totally not needed on PC because there // setupGenericShaders
// is fixed-function support in D3D9
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
inline void GFXD3D9Device::setupGenericShaders( GenericShaderType type /* = GSColor */ ) inline void GFXD3D9Device::setupGenericShaders( GenericShaderType type /* = GSColor */ )
{ {
#ifdef WANT_TO_SIMULATE_UI_ON_360 AssertFatal(type != GSTargetRestore, ""); //not used
if( mGenericShader[GSColor] == NULL )
if (mGenericShader[GSColor] == NULL)
{ {
mGenericShader[GSColor] = createShader( "shaders/common/genericColorV.hlsl", ShaderData *shaderData;
"shaders/common/genericColorP.hlsl",
2.f );
mGenericShader[GSModColorTexture] = createShader( "shaders/common/genericModColorTextureV.hlsl", shaderData = new ShaderData();
"shaders/common/genericModColorTextureP.hlsl", shaderData->setField("DXVertexShaderFile", "shaders/common/fixedFunction/colorV.hlsl");
2.f ); shaderData->setField("DXPixelShaderFile", "shaders/common/fixedFunction/colorP.hlsl");
shaderData->setField("pixVersion", "3.0");
shaderData->registerObject();
mGenericShader[GSColor] = shaderData->getShader();
mGenericShaderBuffer[GSColor] = mGenericShader[GSColor]->allocConstBuffer();
mModelViewProjSC[GSColor] = mGenericShader[GSColor]->getShaderConstHandle("$modelView");
Sim::getRootGroup()->addObject(shaderData);
mGenericShader[GSAddColorTexture] = createShader( "shaders/common/genericAddColorTextureV.hlsl", shaderData = new ShaderData();
"shaders/common/genericAddColorTextureP.hlsl", shaderData->setField("DXVertexShaderFile", "shaders/common/fixedFunction/modColorTextureV.hlsl");
2.f ); shaderData->setField("DXPixelShaderFile", "shaders/common/fixedFunction/modColorTextureP.hlsl");
shaderData->setField("pixVersion", "3.0");
shaderData->registerObject();
mGenericShader[GSModColorTexture] = shaderData->getShader();
mGenericShaderBuffer[GSModColorTexture] = mGenericShader[GSModColorTexture]->allocConstBuffer();
mModelViewProjSC[GSModColorTexture] = mGenericShader[GSModColorTexture]->getShaderConstHandle("$modelView");
Sim::getRootGroup()->addObject(shaderData);
shaderData = new ShaderData();
shaderData->setField("DXVertexShaderFile", "shaders/common/fixedFunction/addColorTextureV.hlsl");
shaderData->setField("DXPixelShaderFile", "shaders/common/fixedFunction/addColorTextureP.hlsl");
shaderData->setField("pixVersion", "3.0");
shaderData->registerObject();
mGenericShader[GSAddColorTexture] = shaderData->getShader();
mGenericShaderBuffer[GSAddColorTexture] = mGenericShader[GSAddColorTexture]->allocConstBuffer();
mModelViewProjSC[GSAddColorTexture] = mGenericShader[GSAddColorTexture]->getShaderConstHandle("$modelView");
Sim::getRootGroup()->addObject(shaderData);
shaderData = new ShaderData();
shaderData->setField("DXVertexShaderFile", "shaders/common/fixedFunction/textureV.hlsl");
shaderData->setField("DXPixelShaderFile", "shaders/common/fixedFunction/textureP.hlsl");
shaderData->setField("pixVersion", "3.0");
shaderData->registerObject();
mGenericShader[GSTexture] = shaderData->getShader();
mGenericShaderBuffer[GSTexture] = mGenericShader[GSTexture]->allocConstBuffer();
mModelViewProjSC[GSTexture] = mGenericShader[GSTexture]->getShaderConstHandle("$modelView");
Sim::getRootGroup()->addObject(shaderData);
//Force an update
mViewportDirty = true;
} }
mGenericShader[type]->process(); MatrixF tempMatrix = mProjectionMatrix * mViewMatrix * mWorldMatrix[mWorldStackSize];
mGenericShaderBuffer[type]->setSafe(mModelViewProjSC[type], tempMatrix);
MatrixF world, view, proj; setShader(mGenericShader[type]);
mWorldMatrix[mWorldStackSize].transposeTo( world ); setShaderConstBuffer(mGenericShaderBuffer[type]);
mViewMatrix.transposeTo( view );
mProjectionMatrix.transposeTo( proj );
mTempMatrix = world * view * proj;
setVertexShaderConstF( VC_WORLD_PROJ, (F32 *)&mTempMatrix, 4 );
#else
disableShaders();
#endif
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View file

@ -150,6 +150,10 @@ protected:
IDirect3DVertexShader9 *mLastVertShader; IDirect3DVertexShader9 *mLastVertShader;
IDirect3DPixelShader9 *mLastPixShader; IDirect3DPixelShader9 *mLastPixShader;
GFXShaderRef mGenericShader[GS_COUNT];
GFXShaderConstBufferRef mGenericShaderBuffer[GS_COUNT];
GFXShaderConstHandle *mModelViewProjSC[GS_COUNT];
S32 mCreateFenceType; S32 mCreateFenceType;
LPDIRECT3D9 mD3D; ///< D3D Handle LPDIRECT3D9 mD3D; ///< D3D Handle
@ -326,8 +330,6 @@ public:
/// Reset /// Reset
virtual void reset( D3DPRESENT_PARAMETERS &d3dpp ) = 0; virtual void reset( D3DPRESENT_PARAMETERS &d3dpp ) = 0;
GFXShaderRef mGenericShader[GS_COUNT];
virtual void setupGenericShaders( GenericShaderType type = GSColor ); virtual void setupGenericShaders( GenericShaderType type = GSColor );
// Function only really used on the, however a centralized function for // Function only really used on the, however a centralized function for