#ifndef IPixelShader11_h__ #define IPixelShader11_h__ #include #include #include #include "render/IShader.h" #include "render/IMacroDefine.h" #include #include "Globals.h" #include "D3Dcompiler.h" namespace LifeGraphics { class IPixelShader11 : public IShader { public: ID3D11PixelShader* g_shader; ID3DBlob* g_bytecode; ID3D11Device* g_device; IPixelShader11(ID3D11Device* device) { g_device = device; } ~IPixelShader11() { SAFE_RELEASE(g_bytecode); SAFE_RELEASE(g_shader); } void* Disassemble() { /*ID3D10Blob* errorMsg = NULL; D3D10DisassembleShader(g_bytecode->GetBufferPointer(), g_bytecode->GetBufferSize(),TRUE, "OLOLO", &errorMsg); return errorMsg->GetBufferPointer();*/ return 0; } SHADER_TYPE getShaderType() { return ST_PS; } char* GetByteCode() { return (char*)0; } void Compile(LifeCore::IDataStreamPtr stream, std::vector* defines) { char* shader = new char[stream->Length()]; stream->Read(shader, stream->Length()); Compile(shader, stream->Length(), defines); delete[]shader; } void Compile(const char* pData, int length, std::vector* defines) { DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS; #ifdef _DEBUG dwShaderFlags |= D3DCOMPILE_DEBUG; #endif HRESULT hr; g_bytecode = NULL; // char* ololo = new char[10*1024*1024]; // void* lol = malloc(10*1024*1024); ID3D10Blob* errorMsg = NULL; if(!defines) { hr = D3DX11CompileFromMemory(pData, length, "system_shader", NULL, NULL, "main_PS", "ps_5_0",dwShaderFlags,0,NULL, &g_bytecode,&errorMsg, NULL); } else { //create macro D3D10_SHADER_MACRO* macros = new D3D10_SHADER_MACRO[defines->size() + 1]; int cnt = defines->size(); for(int i = 0; i < cnt; i++) { macros[i].Definition = defines[0][i].definition.c_str(); macros[i].Name = defines[0][i].name.c_str(); } D3D10_SHADER_MACRO m; m.Definition = NULL; m.Name = NULL; macros[cnt] = m; hr = D3DX11CompileFromMemory(pData, length, "system_shader", macros, NULL, "main_PS", "ps_5_0",dwShaderFlags,0,NULL, &g_bytecode, &errorMsg, NULL); delete[] macros; } if(hr != S_OK) { printf("SHADER COMPILE ERROR: %s", errorMsg->GetBufferPointer()); } SAFE_RELEASE(errorMsg); hr = g_device->CreatePixelShader(g_bytecode->GetBufferPointer(), g_bytecode->GetBufferSize(), NULL, &g_shader); SAFE_RELEASE(g_bytecode); } void Load(LifeCore::IDataStreamPtr src) { printf("Load VS is not implemented: %i\n", src->Length()); } void CompleteAsyncRequest(IResource* source) { // printf("VS async not implemented: %s\n", source->Name.c_str()); } }; } #endif // IPixelShader11_h__