libobs-d3d11: Store compiled shader data (for rebuilding)
This commit is contained in:
parent
29eea269fc
commit
1ecb1550af
@ -46,7 +46,6 @@ gs_vertex_shader::gs_vertex_shader(gs_device_t *device, const char *file,
|
||||
hasTangents (false),
|
||||
nTexUnits (0)
|
||||
{
|
||||
vector<D3D11_INPUT_ELEMENT_DESC> inputs;
|
||||
ShaderProcessor processor(device);
|
||||
ComPtr<ID3D10Blob> shaderBlob;
|
||||
string outputString;
|
||||
@ -55,20 +54,23 @@ gs_vertex_shader::gs_vertex_shader(gs_device_t *device, const char *file,
|
||||
processor.Process(shaderString, file);
|
||||
processor.BuildString(outputString);
|
||||
processor.BuildParams(params);
|
||||
processor.BuildInputLayout(inputs);
|
||||
GetBuffersExpected(inputs);
|
||||
processor.BuildInputLayout(layoutData);
|
||||
GetBuffersExpected(layoutData);
|
||||
BuildConstantBuffer();
|
||||
|
||||
Compile(outputString.c_str(), file, "vs_4_0", shaderBlob.Assign());
|
||||
|
||||
hr = device->device->CreateVertexShader(shaderBlob->GetBufferPointer(),
|
||||
shaderBlob->GetBufferSize(), NULL, shader.Assign());
|
||||
data.resize(shaderBlob->GetBufferSize());
|
||||
memcpy(&data[0], shaderBlob->GetBufferPointer(), data.size());
|
||||
|
||||
hr = device->device->CreateVertexShader(data.data(), data.size(),
|
||||
NULL, shader.Assign());
|
||||
if (FAILED(hr))
|
||||
throw HRError("Failed to create vertex shader", hr);
|
||||
|
||||
hr = device->device->CreateInputLayout(inputs.data(),
|
||||
(UINT)inputs.size(), shaderBlob->GetBufferPointer(),
|
||||
shaderBlob->GetBufferSize(), layout.Assign());
|
||||
hr = device->device->CreateInputLayout(layoutData.data(),
|
||||
(UINT)layoutData.size(),
|
||||
data.data(), data.size(), layout.Assign());
|
||||
if (FAILED(hr))
|
||||
throw HRError("Failed to create input layout", hr);
|
||||
|
||||
@ -93,8 +95,11 @@ gs_pixel_shader::gs_pixel_shader(gs_device_t *device, const char *file,
|
||||
|
||||
Compile(outputString.c_str(), file, "ps_4_0", shaderBlob.Assign());
|
||||
|
||||
hr = device->device->CreatePixelShader(shaderBlob->GetBufferPointer(),
|
||||
shaderBlob->GetBufferSize(), NULL, shader.Assign());
|
||||
data.resize(shaderBlob->GetBufferSize());
|
||||
memcpy(&data[0], shaderBlob->GetBufferPointer(), data.size());
|
||||
|
||||
hr = device->device->CreatePixelShader(data.data(), data.size(),
|
||||
NULL, shader.Assign());
|
||||
if (FAILED(hr))
|
||||
throw HRError("Failed to create vertex shader", hr);
|
||||
}
|
||||
|
@ -387,6 +387,8 @@ struct gs_shader {
|
||||
ComPtr<ID3D11Buffer> constants;
|
||||
size_t constantSize;
|
||||
|
||||
vector<uint8_t> data;
|
||||
|
||||
inline void UpdateParam(vector<uint8_t> &constData,
|
||||
gs_shader_param ¶m, bool &upload);
|
||||
void UploadParams();
|
||||
@ -423,6 +425,8 @@ struct gs_vertex_shader : gs_shader {
|
||||
|
||||
gs_shader_param *world, *viewProj;
|
||||
|
||||
vector<D3D11_INPUT_ELEMENT_DESC> layoutData;
|
||||
|
||||
bool hasNormals;
|
||||
bool hasColors;
|
||||
bool hasTangents;
|
||||
|
Loading…
x
Reference in New Issue
Block a user