//-------------------------------------------------------------------------------------- HRESULT Effect9::FromSource( IDirect3DDevice9* pDevice, const SourceInfo& sf, const D3DXMACRO* pDefines, ID3DXInclude* pInclude, DWORD flags, Effect9** ppEffectOut ) { HRESULT hr; hr = S_OK; if( NULL == ppEffectOut ) return E_INVALIDARG; // Clear the output parameter *ppEffectOut = NULL; // Attempt to create the D3DXEffect ID3DXEffect* pD3DXEffect = NULL; ID3DXBuffer* pErrors = NULL; if(sf.GetSourceType() == SOURCEINFO_RESOURCE) { hr = SASCreateEffectFromResource( pDevice, sf.GetResourceModule(), sf.GetResourceName(), sf.GetResourceType(), pDefines, pInclude, flags, NULL, &pD3DXEffect, &pErrors ); } else if(sf.GetSourceType() == SOURCEINFO_FILE) { hr = D3DXCreateEffectFromFile( pDevice, sf.GetFilePath(), pDefines, pInclude, flags, NULL, &pD3DXEffect, &pErrors ); if( hr == E_NOTIMPL) hr = D3DXCreateEffectFromFile( pDevice, sf.GetFilePath(), pDefines, pInclude, (flags | D3DXSHADER_USE_LEGACY_D3DX9_31_DLL), NULL, &pD3DXEffect, &pErrors ); } if( pErrors ) Sas::Host::OutAnsi( FAILED(hr)?LEVEL_ERROR:LEVEL_WARNING, "%s", (LPSTR)pErrors->GetBufferPointer() ); if( FAILED(hr) ) goto e_Exit; D3DXHANDLE technique = NULL; hr= pD3DXEffect->FindNextValidTechnique(NULL, &technique); if( FAILED(hr) ) { Sas::Host::Out( LEVEL_ERROR, L"No technique in the effect is valid on your hardware." ); goto e_Exit; } pD3DXEffect->SetTechnique(technique); // Now that we have a D3DXEffect we can create a Sas::Effect hr = FromD3DXEffect( pD3DXEffect, sf, ppEffectOut ); e_Exit: SAFE_RELEASE(pErrors); SAFE_RELEASE( pD3DXEffect ); if(SUCCEEDED(hr)) Sas::Host::Out( LEVEL_STATUS, L"Loading effect '%s'", sf.GetDescription() ); else Sas::Host::Out( LEVEL_ERROR, L"Could not load effect '%s'", sf.GetDescription() ); return hr; }
//-------------------------------------------------------------------------------------- HRESULT Effect10::FromSource( ID3D10Device* pDevice, const SourceInfo& sf, const D3D10_SHADER_MACRO* pDefines, ID3D10Include* pInclude, DWORD HlslFlags, DWORD FxFlags, Effect10** ppEffectOut ) { HRESULT hr; if( NULL == ppEffectOut ) return E_INVALIDARG; // Clear the output parameter *ppEffectOut = NULL; // Attempt to create the D3DXEffect ID3D10Effect* pD3DEffect = NULL; ID3D10Blob* pErrors = NULL; if(sf.GetSourceType() == SOURCEINFO_RESOURCE) { hr = D3DX10CreateEffectFromResource( sf.GetResourceModule(), sf.GetResourceName(), sf.GetResourceName(), pDefines, pInclude, "fx_4_0", HlslFlags, FxFlags, pDevice, NULL, NULL, &pD3DEffect, &pErrors, NULL ); } else if(sf.GetSourceType() == SOURCEINFO_FILE) { hr = D3DX10CreateEffectFromFile( sf.GetFilePath(), pDefines, pInclude, "fx_4_0", HlslFlags, FxFlags, pDevice, NULL, NULL, &pD3DEffect, &pErrors, NULL ); } if( pErrors ) Sas::Host::OutAnsi( FAILED(hr)?LEVEL_ERROR:LEVEL_WARNING, "%s",(LPSTR)pErrors->GetBufferPointer() ); if( FAILED(hr) ) goto e_Exit; D3D10_EFFECT_DESC desc; pD3DEffect->GetDesc(&desc); if(desc.Techniques <= 0) { Sas::Host::Out( LEVEL_ERROR, L"Effect does not have a Technique10." ); hr = E_FAIL; goto e_Exit; } // Now that we have a D3DXEffect we can create a Sas::Effect hr = FromD3DEffect( pD3DEffect, sf, ppEffectOut ); e_Exit: SAFE_RELEASE(pErrors); SAFE_RELEASE( pD3DEffect ); if(SUCCEEDED(hr)) Sas::Host::Out( LEVEL_STATUS, L"Loading effect '%s'", sf.GetDescription() ); else Sas::Host::Out( LEVEL_ERROR, L"Could not load effect '%s'", sf.GetDescription() ); return hr; }