109 lines
2.7 KiB
C++
109 lines
2.7 KiB
C++
#ifndef IPixelShader11_h__
|
|||
|
|
#define IPixelShader11_h__
|
||
|
|
|
||
|
|
#include <d3d11.h>
|
||
|
|
#include <dxgi.h>
|
||
|
|
#include <d3dx11.h>
|
||
|
|
#include "render/IShader.h"
|
||
|
|
#include "render/IMacroDefine.h"
|
||
|
|
#include <vector>
|
||
|
|
#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<IMacroDefine>* 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<IMacroDefine>* 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__
|