deargui-vpl/ref/virtools/Samples/Behaviors/Shader/Sources/GetShaderCapabilities.cpp

165 lines
5.0 KiB
C++

#include "stdafx.h"
#include "GetShaderCapabilities.h"
#include "CKRasterizer.h"
#define GETEFFECTCAPABILITIES_GUID CKGUID(0x53b7731f,0x360737f8)
//-----------------------------------------------------------------------------
int GetShaderCapabilities_2(const CKBehaviorContext& behcontext)
{
CKBehavior* beh = behcontext.Behavior;
CKRenderContext* rc = behcontext.CurrentRenderContext;
CKRasterizerContext* rstCtx = NULL;
if (rc)
rstCtx = rc->GetRasterizerContext();
// Gets the manager.
int id = 0;
CKShaderManager* fxman = (CKShaderManager*)behcontext.Context->GetManagerByGuid(ShaderManagerGUID);
// On
if (beh->IsInputActive(0))
{
int platform = VXPLATFORM_UNKNOWN;
platform = VxGetPlatform();
int rstversion = RSTVERSION_UNKNOWN;
int vsProfile = CPL_PROFILE_NONE;
int psProfile = CPL_PROFILE_NONE;
float vsversion = 0;
float psversion = 0;
// If the effect manager is available.
if (fxman && fxman->IsSupported())
fxman->GetVSPSVersion(vsversion, psversion);
if (rstCtx && rstCtx->m_Driver->m_2DCaps.Family == CKRST_DIRECTX)
{
VxDirectXData* dxdata = NULL;
dxdata = rc->GetDirectXInfo();
if (dxdata) {
switch(dxdata->DxVersion) {
case 0x0900 :
rstversion = RSTVERSION_DX9;
if(vsversion == 1.1f)
vsProfile = CPL_PROFILE_VS_1_1;
else if(vsversion == 2.0f)
vsProfile = CPL_PROFILE_VS_2_0;
else if(vsversion == 3.0f)
vsProfile = CPL_PROFILE_VS_3_0;
if(psversion == 1.1f)
psProfile = CPL_PROFILE_PS_1_1;
else if(psversion == 1.3f)
psProfile = CPL_PROFILE_PS_1_3;
else if(psversion == 1.4f)
psProfile = CPL_PROFILE_PS_1_4;
else if(psversion == 2.0f)
psProfile = CPL_PROFILE_PS_2_0;
else if(psversion > 2.0f && psversion < 3.0f)
psProfile = CPL_PROFILE_PS_2_0a;
else if(psversion == 3.0f)
psProfile = CPL_PROFILE_PS_3_0;
break;
case 0x0801 :
rstversion = RSTVERSION_DX8;
break;
case 0x0800 :
rstversion = RSTVERSION_DX8;
break;
case 0x0700 :
rstversion = RSTVERSION_DX7;
break;
case 0x0500 :
rstversion = RSTVERSION_DX5;
break;
}
}
}
else if (rstCtx && rstCtx->m_Driver->m_2DCaps.Family == CKRST_OPENGL) {
rstversion = RSTVERSION_OGL;
if(vsversion == 1.1f)
vsProfile = CPL_PROFILE_VP20;
else if(vsversion == 2.0f)
vsProfile = CPL_PROFILE_VP30;
else if(vsversion == 3.0f)
vsProfile = CPL_PROFILE_VP40;
else if(vsversion == 2.1f)
vsProfile = CPL_PROFILE_ARBVP1;
else if(vsversion == 2.2f)
vsProfile = CPL_PROFILE_ARBVP1; // CG_PROFILE_GLSLV
if(psversion == 1.1f)
psProfile = CPL_PROFILE_FP20;
else if(psversion == 2.0f)
psProfile = CPL_PROFILE_FP30;
else if(psversion == 3.0f)
psProfile = CPL_PROFILE_FP40;
else if(psversion == 2.1f)
psProfile = CPL_PROFILE_ARBFP1;
else if(psversion == 2.2f)
psProfile = CPL_PROFILE_ARBFP1; // CG_PROFILE_GLSLF
}
beh->SetOutputParameterValue(PARAMOUT_PLATFORM, &platform);
beh->SetOutputParameterValue(PARAMOUT_RSTVERSION, &rstversion);
beh->SetOutputParameterValue(PARAMOUT_VSPROFILE, &vsProfile);
beh->SetOutputParameterValue(PARAMOUT_PSPROFILE, &psProfile);
beh->ActivateOutput(0);
}
return CKBR_OK;
}
//-----------------------------------------------------------------------------
CKERROR CreateGetShaderCapabilitiesProto_2(CKBehaviorPrototype **pproto)
{
CKBehaviorPrototype *proto = CreateCKBehaviorPrototype("Get Generic Shader Capabilities");
if(!proto) return CKERR_OUTOFMEMORY;
proto->DeclareInput("In");
proto->DeclareOutput("Out");
proto->DeclareOutParameter("Platform", CKPGUID_HOST_PLATFORM);
proto->DeclareOutParameter("Rasterizer Version", CKENUMGUID_RASTERIZERVERSION);
proto->DeclareOutParameter("Best VS Compilation Profile", CKENUMGUID_COMPILATIONPROFILE);
proto->DeclareOutParameter("Best PS Compilation Profile", CKENUMGUID_COMPILATIONPROFILE);
proto->SetFlags(CK_BEHAVIORPROTOTYPE_NORMAL);
proto->SetFunction(GetShaderCapabilities_2);
*pproto = proto;
return CK_OK;
}
//-----------------------------------------------------------------------------
CKObjectDeclaration *FillBehaviorGetShaderCapabilities_2()
{
CKObjectDeclaration *od = CreateCKObjectDeclaration("Get Generic Shader Capabilities");
od->SetDescription("Gets shaders (HLSL / CGFX) related hardware capabilities");
/* rem:
<SPAN CLASS=in>In: </SPAN>triggers the process<BR>
<SPAN CLASS=out>Out: </SPAN>is activated when the process is completed.<BR>
<BR>
<SPAN CLASS=pin>Material: </SPAN>The material.<BR>
<SPAN CLASS=pin>Technique: </SPAN>The name of the technique.<BR>
<SPAN CLASS=pin>Find Next Technique: </SPAN>Finds the next technique from the technique found.<BR>
*/
od->SetCategory("Shaders/General");
od->SetType(CKDLL_BEHAVIORPROTOTYPE);
od->SetGuid(GETEFFECTCAPABILITIES_GUID);
od->SetAuthorGuid(VIRTOOLS_GUID);
od->SetAuthorName("Virtools");
od->SetVersion(0x00010000);
od->SetCreationFunction(CreateGetShaderCapabilitiesProto_2);
od->SetCompatibleClassId(CKCID_BEOBJECT);
return od;
}