Files

109 lines
2.7 KiB
C++
Raw Permalink Normal View History

2025-05-13 02:46:21 +03:00
#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__