+++ /dev/null
-#include "stdafx.h"\r
-/*\r
-* Copyright (c) 2007-2010 SlimDX Group\r
-* \r
-* Permission is hereby granted, free of charge, to any person obtaining a copy\r
-* of this software and associated documentation files (the "Software"), to deal\r
-* in the Software without restriction, including without limitation the rights\r
-* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
-* copies of the Software, and to permit persons to whom the Software is\r
-* furnished to do so, subject to the following conditions:\r
-* \r
-* The above copyright notice and this permission notice shall be included in\r
-* all copies or substantial portions of the Software.\r
-* \r
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
-* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
-* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
-* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
-* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
-* THE SOFTWARE.\r
-*/\r
-#include "../VersionConfig.h"\r
-#if SLIMDX_D3DX_VERSION < 42\r
-\r
-#include <d3d9.h>\r
-#include <d3dx9.h>\r
-\r
-#include "../stack_array.h"\r
-#include "../DataStream.h"\r
-#include "../ComObject.h"\r
-\r
-#include "Direct3D9Exception.h"\r
-\r
-#include "Device.h"\r
-#include "VertexShader9.h"\r
-#include "PixelShader9.h"\r
-#include "FragmentLinker.h"\r
-\r
-using namespace System;\r
-using namespace System::Runtime::InteropServices;\r
-\r
-namespace SlimDX\r
-{\r
-namespace Direct3D9\r
-{\r
- FragmentLinker::FragmentLinker( SlimDX::Direct3D9::Device^ device, int cacheSize )\r
- {\r
- IDirect3DDevice9* devicePointer = device->InternalPointer;\r
- ID3DXFragmentLinker* linker;\r
-\r
- HRESULT hr = D3DXCreateFragmentLinker( devicePointer, cacheSize, &linker );\r
- RECORD_D3D9( hr );\r
- if( FAILED( hr ) )\r
- throw gcnew Direct3D9Exception( Result::Last );\r
-\r
- Construct(linker);\r
- }\r
- \r
- DataStream^ FragmentLinker::Gather( array<Byte>^ sourceData, array<Macro>^ defines,\r
- Include^ includeFile, ShaderFlags flags, [Out] String^% errors )\r
- {\r
- ID3DXBuffer* fragmentBuffer;\r
- ID3DXBuffer* errorBuffer;\r
- pin_ptr<const Byte> pinnedData = &sourceData[0];\r
-\r
- IncludeShim includeShim = IncludeShim( includeFile );\r
- ID3DXInclude* includePtr = NULL;\r
- if( includeFile != nullptr )\r
- includePtr = &includeShim;\r
-\r
- array<GCHandle>^ handles;\r
- stack_array<D3DXMACRO> macros = Macro::Marshal( defines, handles );\r
- D3DXMACRO* macrosPtr = macros.size() > 0 ? ¯os[0] : NULL;\r
-\r
-#pragma warning(push)\r
-#pragma warning(disable:4996)\r
- HRESULT hr = D3DXGatherFragments( reinterpret_cast<LPCSTR>( pinnedData ), sourceData->Length, macrosPtr, includePtr,\r
- static_cast<DWORD>( flags ), &fragmentBuffer, &errorBuffer );\r
-#pragma warning(pop)\r
-\r
- //clean up after marshaling macros\r
- Macro::Unmarshal( handles );\r
- //marshal errors if necessary\r
- errors = Utilities::BufferToString( errorBuffer );\r
- \r
- if( RECORD_D3D9( hr ).IsFailure )\r
- return nullptr;\r
-\r
- return gcnew DataStream( fragmentBuffer );\r
- }\r
-\r
-// We know that Gather is obsolete, we declared it ourselves\r
-#pragma warning(disable:4947)\r
- DataStream^ FragmentLinker::Gather( String^ sourceData, array<Macro>^ defines,\r
- Include^ includeFile, ShaderFlags flags, [Out] String^% errors )\r
- {\r
- array<Byte>^ sourceBytes = System::Text::ASCIIEncoding::ASCII->GetBytes( sourceData );\r
- return Gather( sourceBytes, defines, includeFile, flags, errors );\r
- }\r
-#pragma warning(default:4947)\r
-\r
- DataStream^ FragmentLinker::GatherFromFile( String^ fileName, array<Macro>^ defines,\r
- Include^ includeFile, ShaderFlags flags, [Out] String^% errors )\r
- {\r
- ID3DXBuffer* fragmentBuffer;\r
- ID3DXBuffer* errorBuffer;\r
- pin_ptr<const wchar_t> pinnedFile = PtrToStringChars( fileName );\r
-\r
- IncludeShim includeShim = IncludeShim( includeFile );\r
- ID3DXInclude* includePtr = NULL;\r
- if( includeFile != nullptr )\r
- includePtr = &includeShim;\r
-\r
- array<GCHandle>^ handles;\r
- stack_array<D3DXMACRO> macros = Macro::Marshal( defines, handles );\r
- D3DXMACRO* macrosPtr = macros.size() > 0 ? ¯os[0] : NULL;\r
-\r
-#pragma warning(push)\r
-#pragma warning(disable:4996)\r
- HRESULT hr = D3DXGatherFragmentsFromFile( reinterpret_cast<LPCTSTR>( pinnedFile ), macrosPtr, includePtr,\r
- static_cast<DWORD>( flags ), &fragmentBuffer, &errorBuffer );\r
-#pragma warning(pop)\r
-\r
- //clean up after marshaling macros\r
- Macro::Unmarshal( handles );\r
- //marshal errors if necessary\r
- errors = Utilities::BufferToString( errorBuffer );\r
- \r
- if( RECORD_D3D9( hr ).IsFailure )\r
- return nullptr;\r
-\r
- return gcnew DataStream( fragmentBuffer );\r
- }\r
-\r
- Result FragmentLinker::AddFragments( array<int>^ fragments )\r
- {\r
- pin_ptr<int> pinnedFragments = &fragments[0];\r
- HRESULT hr = InternalPointer->AddFragments( reinterpret_cast<const DWORD*>( pinnedFragments ) );\r
- return RECORD_D3D9( hr );\r
- }\r
-\r
- Result FragmentLinker::AddFragments( DataStream^ fragments )\r
- {\r
- HRESULT hr = InternalPointer->AddFragments( reinterpret_cast<const DWORD*>( fragments->PositionPointer ) );\r
- return RECORD_D3D9( hr );\r
- }\r
-\r
- DataStream^ FragmentLinker::GetFragment( EffectHandle^ name )\r
- {\r
- D3DXHANDLE handle = name != nullptr ? name->InternalHandle : NULL;\r
- ID3DXBuffer* fragment;\r
-\r
- HRESULT hr = InternalPointer->GetFragment( handle, &fragment );\r
- GC::KeepAlive( name );\r
- \r
- if( RECORD_D3D9( hr ).IsFailure )\r
- return nullptr;\r
-\r
- return gcnew DataStream( fragment );\r
- }\r
-\r
- DataStream^ FragmentLinker::Fragments::get()\r
- {\r
- ID3DXBuffer* fragments;\r
-\r
- HRESULT hr = InternalPointer->GetAllFragments( &fragments );\r
- \r
- if( RECORD_D3D9( hr ).IsFailure )\r
- return nullptr;\r
-\r
- return gcnew DataStream( fragments );\r
- }\r
-\r
- SlimDX::Direct3D9::Device^ FragmentLinker::Device::get()\r
- {\r
- IDirect3DDevice9* device;\r
- //This method always returns the value S_OK.\r
- InternalPointer->GetDevice( &device );\r
-\r
- return SlimDX::Direct3D9::Device::FromPointer( device );\r
- }\r
-\r
- FragmentDescription FragmentLinker::GetFragmentDescription( EffectHandle^ name )\r
- {\r
- D3DXHANDLE handle = name != nullptr ? name->InternalHandle : NULL;\r
- D3DXFRAGMENT_DESC description;\r
-\r
- HRESULT hr = InternalPointer->GetFragmentDesc( handle, &description );\r
- GC::KeepAlive( name );\r
- if( RECORD_D3D9( hr ).IsFailure )\r
- return FragmentDescription();\r
-\r
- FragmentDescription outDesc;\r
- outDesc.Name = gcnew String( description.Name );\r
- outDesc.Target = description.Target;\r
-\r
- return outDesc;\r
- }\r
-\r
- EffectHandle^ FragmentLinker::GetFragmentHandle( int index )\r
- {\r
- D3DXHANDLE handle = InternalPointer->GetFragmentHandleByIndex( index );\r
- if( handle == NULL )\r
- return nullptr;\r
-\r
- return gcnew EffectHandle( handle );\r
- }\r
-\r
- EffectHandle^ FragmentLinker::GetFragmentHandle( String^ name )\r
- {\r
- array<Byte>^ nameBytes = System::Text::ASCIIEncoding::ASCII->GetBytes( name );\r
- pin_ptr<const Byte> pinnedName = &nameBytes[0];\r
-\r
- D3DXHANDLE handle = InternalPointer->GetFragmentHandleByName( reinterpret_cast<LPCSTR>( pinnedName ) );\r
- if( handle == NULL )\r
- return nullptr;\r
-\r
- return gcnew EffectHandle( handle );\r
- }\r
-\r
- void FragmentLinker::ClearCache()\r
- {\r
- //This method always returns the value S_OK.\r
- InternalPointer->ClearCache();\r
- }\r
-\r
- ShaderBytecode^ FragmentLinker::LinkShader( String^ profile, ShaderFlags flags, array<EffectHandle^>^ fragmentHandles, [Out] String^% errors )\r
- {\r
- ID3DXBuffer* bytecode;\r
- ID3DXBuffer* errorBuffer;\r
- array<Byte>^ profileBytes = System::Text::ASCIIEncoding::ASCII->GetBytes( profile );\r
- pin_ptr<const Byte> pinnedProfile = &profileBytes[0];\r
-\r
- stack_array<D3DXHANDLE> handles = stackalloc( D3DXHANDLE, fragmentHandles->Length );\r
- for( int i = 0; i < fragmentHandles->Length; ++i )\r
- handles[i] = fragmentHandles[i] != nullptr ? fragmentHandles[i]->InternalHandle : NULL;\r
-\r
- HRESULT hr = InternalPointer->LinkShader( reinterpret_cast<LPCSTR>( pinnedProfile ), static_cast<DWORD>( flags ), &handles[0], fragmentHandles->Length, &bytecode, &errorBuffer );\r
- GC::KeepAlive( fragmentHandles );\r
- RECORD_D3D9( hr );\r
- \r
- //marshal errors if necessary\r
- errors = Utilities::BufferToString( errorBuffer );\r
- if( Result::Last.IsFailure )\r
- return nullptr;\r
-\r
- return ShaderBytecode::FromPointer( bytecode );\r
- }\r
-\r
- VertexShader^ FragmentLinker::LinkVertexShader( String^ profile, ShaderFlags flags, array<EffectHandle^>^ fragmentHandles, [Out] String^% errors )\r
- {\r
- IDirect3DVertexShader9* shader;\r
- ID3DXBuffer* errorBuffer;\r
- array<Byte>^ profileBytes = System::Text::ASCIIEncoding::ASCII->GetBytes( profile );\r
- pin_ptr<const Byte> pinnedProfile = &profileBytes[0];\r
-\r
- stack_array<D3DXHANDLE> handles = stackalloc( D3DXHANDLE, fragmentHandles->Length );\r
- for( int i = 0; i < fragmentHandles->Length; ++i )\r
- handles[i] = fragmentHandles[i] != nullptr ? fragmentHandles[i]->InternalHandle : NULL;\r
-\r
- HRESULT hr = InternalPointer->LinkVertexShader( reinterpret_cast<LPCSTR>( pinnedProfile ), static_cast<DWORD>( flags ), &handles[0], fragmentHandles->Length, &shader, &errorBuffer );\r
- GC::KeepAlive( fragmentHandles );\r
- RECORD_D3D9( hr );\r
- \r
- //marshal errors if necessary\r
- errors = Utilities::BufferToString( errorBuffer );\r
- if( Result::Last.IsFailure )\r
- return nullptr;\r
-\r
- return VertexShader::FromPointer( shader );\r
- }\r
-\r
- PixelShader^ FragmentLinker::LinkPixelShader( String^ profile, ShaderFlags flags, array<EffectHandle^>^ fragmentHandles, [Out] String^% errors )\r
- {\r
- IDirect3DPixelShader9* shader;\r
- ID3DXBuffer* errorBuffer;\r
- array<Byte>^ profileBytes = System::Text::ASCIIEncoding::ASCII->GetBytes( profile );\r
- pin_ptr<const Byte> pinnedProfile = &profileBytes[0];\r
-\r
- stack_array<D3DXHANDLE> handles = stackalloc( D3DXHANDLE, fragmentHandles->Length);\r
- for( int i = 0; i < fragmentHandles->Length; ++i )\r
- handles[i] = fragmentHandles[i] != nullptr ? fragmentHandles[i]->InternalHandle : NULL;\r
-\r
- HRESULT hr = InternalPointer->LinkPixelShader( reinterpret_cast<LPCSTR>( pinnedProfile ), static_cast<DWORD>( flags ), &handles[0], fragmentHandles->Length, &shader, &errorBuffer );\r
- GC::KeepAlive( fragmentHandles );\r
- RECORD_D3D9( hr );\r
- \r
- //marshal errors if necessary\r
- errors = Utilities::BufferToString( errorBuffer );\r
- if( Result::Last.IsFailure )\r
- return nullptr;\r
-\r
- return PixelShader::FromPointer( shader );\r
- }\r
-\r
- int FragmentLinker::FragmentCount::get()\r
- {\r
- return InternalPointer->GetNumberOfFragments();\r
- }\r
-}\r
-}\r
-#endif\r