Commit 0fd806f1 by Jamie Madill Committed by Commit Bot

D3D11: Consolidate Shader allocation.

Similar to the InputLayout init, this adds a small helper type to act as a wrapper around shader init data (binary and size). This also adds error trapping to the blit shader compilation. It also removes the LazyResource2 class, and the CompileXS helper methods. BUG=angleproject:2034 Change-Id: I3fd718393c8a0250e4263890f00d0e9147ec9567 Reviewed-on: https://chromium-review.googlesource.com/506776Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent fccbac2c
...@@ -195,7 +195,7 @@ class RendererD3D : public BufferFactoryD3D ...@@ -195,7 +195,7 @@ class RendererD3D : public BufferFactoryD3D
virtual gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) = 0; virtual gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) = 0;
// Shader operations // Shader operations
virtual gl::Error loadExecutable(const void *function, virtual gl::Error loadExecutable(const uint8_t *function,
size_t length, size_t length,
ShaderType type, ShaderType type,
const std::vector<D3DVarying> &streamOutVaryings, const std::vector<D3DVarying> &streamOutVaryings,
......
...@@ -182,7 +182,7 @@ class Blit11 : angle::NonCopyable ...@@ -182,7 +182,7 @@ class Blit11 : angle::NonCopyable
struct Shader struct Shader
{ {
ShaderDimension dimension; ShaderDimension dimension;
ID3D11PixelShader *pixelShader; d3d11::PixelShader pixelShader;
}; };
struct ShaderSupport struct ShaderSupport
...@@ -247,9 +247,10 @@ class Blit11 : angle::NonCopyable ...@@ -247,9 +247,10 @@ class Blit11 : angle::NonCopyable
size_t destPixelStride, size_t destPixelStride,
BlitConvertFunction *convertFunction); BlitConvertFunction *convertFunction);
void addBlitShaderToMap(BlitShaderType blitShaderType, gl::Error addBlitShaderToMap(BlitShaderType blitShaderType,
ShaderDimension dimension, ShaderDimension dimension,
ID3D11PixelShader *ps); const ShaderData &shaderData,
const char *name);
gl::Error getBlitShader(GLenum destFormat, gl::Error getBlitShader(GLenum destFormat,
GLenum sourceFormat, GLenum sourceFormat,
...@@ -262,9 +263,10 @@ class Blit11 : angle::NonCopyable ...@@ -262,9 +263,10 @@ class Blit11 : angle::NonCopyable
D3D11_SRV_DIMENSION viewDimension, D3D11_SRV_DIMENSION viewDimension,
const Shader **shaderOut); const Shader **shaderOut);
void addSwizzleShaderToMap(SwizzleShaderType swizzleShaderType, gl::Error addSwizzleShaderToMap(SwizzleShaderType swizzleShaderType,
ShaderDimension dimension, ShaderDimension dimension,
ID3D11PixelShader *ps); const ShaderData &shaderData,
const char *name);
void clearShaderMap(); void clearShaderMap();
void releaseResolveDepthStencilResources(); void releaseResolveDepthStencilResources();
......
...@@ -94,12 +94,6 @@ Clear11::ShaderManager::ShaderManager() ...@@ -94,12 +94,6 @@ Clear11::ShaderManager::ShaderManager()
Clear11::ShaderManager::~ShaderManager() Clear11::ShaderManager::~ShaderManager()
{ {
mVs9.release();
mPsFloat9.release();
mVs.release();
mPsFloat.release();
mPsUInt.release();
mPsSInt.release();
} }
gl::Error Clear11::ShaderManager::getShadersAndLayout(Renderer11 *renderer, gl::Error Clear11::ShaderManager::getShadersAndLayout(Renderer11 *renderer,
...@@ -108,14 +102,12 @@ gl::Error Clear11::ShaderManager::getShadersAndLayout(Renderer11 *renderer, ...@@ -108,14 +102,12 @@ gl::Error Clear11::ShaderManager::getShadersAndLayout(Renderer11 *renderer,
ID3D11VertexShader **vs, ID3D11VertexShader **vs,
ID3D11PixelShader **ps) ID3D11PixelShader **ps)
{ {
auto featureLevel = renderer->getRenderer11DeviceCaps().featureLevel; if (renderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
auto device = renderer->getDevice();
if (featureLevel <= D3D_FEATURE_LEVEL_9_3)
{ {
ASSERT(clearType == GL_FLOAT); ASSERT(clearType == GL_FLOAT);
*vs = mVs9.resolve(device); ANGLE_TRY(mVs9.resolve(renderer));
ANGLE_TRY(mPsFloat9.resolve(renderer));
if (!mIl9.valid()) if (!mIl9.valid())
{ {
...@@ -128,24 +120,29 @@ gl::Error Clear11::ShaderManager::getShadersAndLayout(Renderer11 *renderer, ...@@ -128,24 +120,29 @@ gl::Error Clear11::ShaderManager::getShadersAndLayout(Renderer11 *renderer,
ANGLE_TRY(renderer->allocateResource(ilDescArray, &vertexShader, &mIl9)); ANGLE_TRY(renderer->allocateResource(ilDescArray, &vertexShader, &mIl9));
} }
*vs = mVs9.get();
*il = mIl9.get(); *il = mIl9.get();
*ps = mPsFloat9.resolve(device); *ps = mPsFloat9.get();
return gl::NoError(); return gl::NoError();
} }
*vs = mVs.resolve(device); ANGLE_TRY(mVs.resolve(renderer));
*vs = mVs.get();
*il = nullptr; *il = nullptr;
switch (clearType) switch (clearType)
{ {
case GL_FLOAT: case GL_FLOAT:
*ps = mPsFloat.resolve(device); ANGLE_TRY(mPsFloat.resolve(renderer));
*ps = mPsFloat.get();
break; break;
case GL_UNSIGNED_INT: case GL_UNSIGNED_INT:
*ps = mPsUInt.resolve(device); ANGLE_TRY(mPsUInt.resolve(renderer));
*ps = mPsUInt.get();
break; break;
case GL_INT: case GL_INT:
*ps = mPsSInt.resolve(device); ANGLE_TRY(mPsSInt.resolve(renderer));
*ps = mPsSInt.get();
break; break;
default: default:
UNREACHABLE(); UNREACHABLE();
......
...@@ -36,8 +36,8 @@ namespace rx ...@@ -36,8 +36,8 @@ namespace rx
PixelTransfer11::PixelTransfer11(Renderer11 *renderer) PixelTransfer11::PixelTransfer11(Renderer11 *renderer)
: mRenderer(renderer), : mRenderer(renderer),
mResourcesLoaded(false), mResourcesLoaded(false),
mBufferToTextureVS(nullptr), mBufferToTextureVS(),
mBufferToTextureGS(nullptr), mBufferToTextureGS(),
mParamsConstantBuffer(), mParamsConstantBuffer(),
mCopyRasterizerState(), mCopyRasterizerState(),
mCopyDepthStencilState() mCopyDepthStencilState()
...@@ -46,15 +46,6 @@ PixelTransfer11::PixelTransfer11(Renderer11 *renderer) ...@@ -46,15 +46,6 @@ PixelTransfer11::PixelTransfer11(Renderer11 *renderer)
PixelTransfer11::~PixelTransfer11() PixelTransfer11::~PixelTransfer11()
{ {
for (auto shaderMapIt = mBufferToTexturePSMap.begin(); shaderMapIt != mBufferToTexturePSMap.end(); shaderMapIt++)
{
SafeRelease(shaderMapIt->second);
}
mBufferToTexturePSMap.clear();
SafeRelease(mBufferToTextureVS);
SafeRelease(mBufferToTextureGS);
} }
gl::Error PixelTransfer11::loadResources() gl::Error PixelTransfer11::loadResources()
...@@ -108,18 +99,11 @@ gl::Error PixelTransfer11::loadResources() ...@@ -108,18 +99,11 @@ gl::Error PixelTransfer11::loadResources()
mParamsConstantBuffer.setDebugName("PixelTransfer11 constant buffer"); mParamsConstantBuffer.setDebugName("PixelTransfer11 constant buffer");
// init shaders // init shaders
ID3D11Device *device = mRenderer->getDevice(); ANGLE_TRY(mRenderer->allocateResource(ShaderData(g_VS_BufferToTexture), &mBufferToTextureVS));
mBufferToTextureVS = d3d11::CompileVS(device, g_VS_BufferToTexture, "BufferToTexture VS"); mBufferToTextureVS.setDebugName("BufferToTexture VS");
if (!mBufferToTextureVS)
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal buffer to texture vertex shader.");
}
mBufferToTextureGS = d3d11::CompileGS(device, g_GS_BufferToTexture, "BufferToTexture GS"); ANGLE_TRY(mRenderer->allocateResource(ShaderData(g_GS_BufferToTexture), &mBufferToTextureGS));
if (!mBufferToTextureGS) mBufferToTextureGS.setDebugName("BufferToTexture GS");
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal buffer to texture geometry shader.");
}
ANGLE_TRY(buildShaderMap()); ANGLE_TRY(buildShaderMap());
...@@ -200,10 +184,11 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac ...@@ -200,10 +184,11 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac
UINT zero = 0; UINT zero = 0;
// Are we doing a 2D or 3D copy? // Are we doing a 2D or 3D copy?
ID3D11GeometryShader *geometryShader = ((destSize.depth > 1) ? mBufferToTextureGS : nullptr); ID3D11GeometryShader *geometryShader =
((destSize.depth > 1) ? mBufferToTextureGS.get() : nullptr);
auto stateManager = mRenderer->getStateManager(); auto stateManager = mRenderer->getStateManager();
deviceContext->VSSetShader(mBufferToTextureVS, nullptr, 0); deviceContext->VSSetShader(mBufferToTextureVS.get(), nullptr, 0);
deviceContext->GSSetShader(geometryShader, nullptr, 0); deviceContext->GSSetShader(geometryShader, nullptr, 0);
deviceContext->PSSetShader(pixelShader, nullptr, 0); deviceContext->PSSetShader(pixelShader, nullptr, 0);
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, bufferSRV); stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, bufferSRV);
...@@ -250,20 +235,24 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac ...@@ -250,20 +235,24 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac
gl::Error PixelTransfer11::buildShaderMap() gl::Error PixelTransfer11::buildShaderMap()
{ {
ID3D11Device *device = mRenderer->getDevice(); d3d11::PixelShader bufferToTextureFloat;
d3d11::PixelShader bufferToTextureInt;
d3d11::PixelShader bufferToTextureUint;
mBufferToTexturePSMap[GL_FLOAT] = d3d11::CompilePS(device, g_PS_BufferToTexture_4F, "BufferToTexture RGBA ps"); ANGLE_TRY(
mBufferToTexturePSMap[GL_INT] = d3d11::CompilePS(device, g_PS_BufferToTexture_4I, "BufferToTexture RGBA-I ps"); mRenderer->allocateResource(ShaderData(g_PS_BufferToTexture_4F), &bufferToTextureFloat));
mBufferToTexturePSMap[GL_UNSIGNED_INT] = d3d11::CompilePS(device, g_PS_BufferToTexture_4UI, "BufferToTexture RGBA-UI ps"); ANGLE_TRY(
mRenderer->allocateResource(ShaderData(g_PS_BufferToTexture_4I), &bufferToTextureInt));
ANGLE_TRY(
mRenderer->allocateResource(ShaderData(g_PS_BufferToTexture_4UI), &bufferToTextureUint));
// Check that all the shaders were created successfully bufferToTextureFloat.setDebugName("BufferToTexture RGBA ps");
for (auto shaderMapIt = mBufferToTexturePSMap.begin(); shaderMapIt != mBufferToTexturePSMap.end(); shaderMapIt++) bufferToTextureInt.setDebugName("BufferToTexture RGBA-I ps");
{ bufferToTextureUint.setDebugName("BufferToTexture RGBA-UI ps");
if (shaderMapIt->second == nullptr)
{ mBufferToTexturePSMap[GL_FLOAT] = std::move(bufferToTextureFloat);
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal buffer to texture pixel shader."); mBufferToTexturePSMap[GL_INT] = std::move(bufferToTextureInt);
} mBufferToTexturePSMap[GL_UNSIGNED_INT] = std::move(bufferToTextureUint);
}
return gl::NoError(); return gl::NoError();
} }
...@@ -277,7 +266,7 @@ ID3D11PixelShader *PixelTransfer11::findBufferToTexturePS(GLenum internalFormat) ...@@ -277,7 +266,7 @@ ID3D11PixelShader *PixelTransfer11::findBufferToTexturePS(GLenum internalFormat)
} }
auto shaderMapIt = mBufferToTexturePSMap.find(componentType); auto shaderMapIt = mBufferToTexturePSMap.find(componentType);
return (shaderMapIt == mBufferToTexturePSMap.end() ? nullptr : shaderMapIt->second); return (shaderMapIt == mBufferToTexturePSMap.end() ? nullptr : shaderMapIt->second.get());
} }
} // namespace rx } // namespace rx
...@@ -73,9 +73,9 @@ class PixelTransfer11 ...@@ -73,9 +73,9 @@ class PixelTransfer11
Renderer11 *mRenderer; Renderer11 *mRenderer;
bool mResourcesLoaded; bool mResourcesLoaded;
std::map<GLenum, ID3D11PixelShader *> mBufferToTexturePSMap; std::map<GLenum, d3d11::PixelShader> mBufferToTexturePSMap;
ID3D11VertexShader *mBufferToTextureVS; d3d11::VertexShader mBufferToTextureVS;
ID3D11GeometryShader *mBufferToTextureGS; d3d11::GeometryShader mBufferToTextureGS;
d3d11::Buffer mParamsConstantBuffer; d3d11::Buffer mParamsConstantBuffer;
CopyShaderParams mParamsData; CopyShaderParams mParamsData;
......
...@@ -3647,26 +3647,22 @@ gl::Error Renderer11::createRenderTargetCopy(RenderTargetD3D *source, RenderTarg ...@@ -3647,26 +3647,22 @@ gl::Error Renderer11::createRenderTargetCopy(RenderTargetD3D *source, RenderTarg
return gl::NoError(); return gl::NoError();
} }
gl::Error Renderer11::loadExecutable(const void *function, gl::Error Renderer11::loadExecutable(const uint8_t *function,
size_t length, size_t length,
ShaderType type, ShaderType type,
const std::vector<D3DVarying> &streamOutVaryings, const std::vector<D3DVarying> &streamOutVaryings,
bool separatedOutputBuffers, bool separatedOutputBuffers,
ShaderExecutableD3D **outExecutable) ShaderExecutableD3D **outExecutable)
{ {
ShaderData shaderData(function, length);
switch (type) switch (type)
{ {
case SHADER_VERTEX: case SHADER_VERTEX:
{ {
ID3D11VertexShader *vertexShader = nullptr; d3d11::VertexShader vertexShader;
ID3D11GeometryShader *streamOutShader = nullptr; d3d11::GeometryShader streamOutShader;
ANGLE_TRY(allocateResource(shaderData, &vertexShader));
HRESULT result = mDevice->CreateVertexShader(function, length, nullptr, &vertexShader);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
return gl::OutOfMemory() << "Failed to create vertex shader, " << result;
}
if (!streamOutVaryings.empty()) if (!streamOutVaryings.empty())
{ {
...@@ -3686,63 +3682,32 @@ gl::Error Renderer11::loadExecutable(const void *function, ...@@ -3686,63 +3682,32 @@ gl::Error Renderer11::loadExecutable(const void *function,
soDeclaration.push_back(entry); soDeclaration.push_back(entry);
} }
result = mDevice->CreateGeometryShaderWithStreamOutput( ANGLE_TRY(allocateResource(shaderData, &soDeclaration, &streamOutShader));
function, static_cast<unsigned int>(length), soDeclaration.data(),
static_cast<unsigned int>(soDeclaration.size()), nullptr, 0, 0, nullptr,
&streamOutShader);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
return gl::OutOfMemory() << "Failed to create steam output shader, " << result;
}
} }
*outExecutable = *outExecutable = new ShaderExecutable11(function, length, std::move(vertexShader),
new ShaderExecutable11(function, length, vertexShader, streamOutShader); std::move(streamOutShader));
} }
break; break;
case SHADER_PIXEL: case SHADER_PIXEL:
{ {
ID3D11PixelShader *pixelShader = nullptr; d3d11::PixelShader pixelShader;
ANGLE_TRY(allocateResource(shaderData, &pixelShader));
HRESULT result = mDevice->CreatePixelShader(function, length, nullptr, &pixelShader); *outExecutable = new ShaderExecutable11(function, length, std::move(pixelShader));
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
return gl::OutOfMemory() << "Failed to create pixel shader, " << result;
}
*outExecutable = new ShaderExecutable11(function, length, pixelShader);
} }
break; break;
case SHADER_GEOMETRY: case SHADER_GEOMETRY:
{ {
ID3D11GeometryShader *geometryShader = nullptr; d3d11::GeometryShader geometryShader;
ANGLE_TRY(allocateResource(shaderData, &geometryShader));
HRESULT result = *outExecutable = new ShaderExecutable11(function, length, std::move(geometryShader));
mDevice->CreateGeometryShader(function, length, nullptr, &geometryShader);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
return gl::OutOfMemory() << "Failed to create geometry shader, " << result;
}
*outExecutable = new ShaderExecutable11(function, length, geometryShader);
} }
break; break;
case SHADER_COMPUTE: case SHADER_COMPUTE:
{ {
ID3D11ComputeShader *computeShader = nullptr; d3d11::ComputeShader computeShader;
ANGLE_TRY(allocateResource(shaderData, &computeShader));
HRESULT result = *outExecutable = new ShaderExecutable11(function, length, std::move(computeShader));
mDevice->CreateComputeShader(function, length, nullptr, &computeShader);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
return gl::OutOfMemory() << "Failed to create compute shader, " << result;
}
*outExecutable = new ShaderExecutable11(function, length, computeShader);
} }
break; break;
default: default:
...@@ -3819,6 +3784,7 @@ gl::Error Renderer11::compileToExecutable(gl::InfoLog &infoLog, ...@@ -3819,6 +3784,7 @@ gl::Error Renderer11::compileToExecutable(gl::InfoLog &infoLog,
D3D_SHADER_MACRO loopMacros[] = {{"ANGLE_ENABLE_LOOP_FLATTEN", "1"}, {0, 0}}; D3D_SHADER_MACRO loopMacros[] = {{"ANGLE_ENABLE_LOOP_FLATTEN", "1"}, {0, 0}};
// TODO(jmadill): Use ComPtr?
ID3DBlob *binary = nullptr; ID3DBlob *binary = nullptr;
std::string debugInfo; std::string debugInfo;
ANGLE_TRY(mCompiler.compileToBinary(infoLog, shaderHLSL, profile, configs, loopMacros, &binary, ANGLE_TRY(mCompiler.compileToBinary(infoLog, shaderHLSL, profile, configs, loopMacros, &binary,
...@@ -3833,8 +3799,9 @@ gl::Error Renderer11::compileToExecutable(gl::InfoLog &infoLog, ...@@ -3833,8 +3799,9 @@ gl::Error Renderer11::compileToExecutable(gl::InfoLog &infoLog,
return gl::NoError(); return gl::NoError();
} }
gl::Error error = loadExecutable(binary->GetBufferPointer(), binary->GetBufferSize(), type, gl::Error error = loadExecutable(reinterpret_cast<const uint8_t *>(binary->GetBufferPointer()),
streamOutVaryings, separatedOutputBuffers, outExectuable); binary->GetBufferSize(), type, streamOutVaryings,
separatedOutputBuffers, outExectuable);
SafeRelease(binary); SafeRelease(binary);
if (error.isError()) if (error.isError())
......
...@@ -240,7 +240,7 @@ class Renderer11 : public RendererD3D ...@@ -240,7 +240,7 @@ class Renderer11 : public RendererD3D
gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) override; gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) override;
// Shader operations // Shader operations
gl::Error loadExecutable(const void *function, gl::Error loadExecutable(const uint8_t *function,
size_t length, size_t length,
ShaderType type, ShaderType type,
const std::vector<D3DVarying> &streamOutVaryings, const std::vector<D3DVarying> &streamOutVaryings,
......
...@@ -105,6 +105,14 @@ HRESULT CreateResource(ID3D11Device *device, ...@@ -105,6 +105,14 @@ HRESULT CreateResource(ID3D11Device *device,
} }
HRESULT CreateResource(ID3D11Device *device, HRESULT CreateResource(ID3D11Device *device,
const ShaderData *desc,
void * /*initData*/,
ID3D11ComputeShader **resourceOut)
{
return device->CreateComputeShader(desc->get(), desc->size(), nullptr, resourceOut);
}
HRESULT CreateResource(ID3D11Device *device,
const D3D11_DEPTH_STENCIL_DESC *desc, const D3D11_DEPTH_STENCIL_DESC *desc,
void * /*initData*/, void * /*initData*/,
ID3D11DepthStencilState **resourceOut) ID3D11DepthStencilState **resourceOut)
...@@ -121,6 +129,23 @@ HRESULT CreateResource(ID3D11Device *device, ...@@ -121,6 +129,23 @@ HRESULT CreateResource(ID3D11Device *device,
} }
HRESULT CreateResource(ID3D11Device *device, HRESULT CreateResource(ID3D11Device *device,
const ShaderData *desc,
const std::vector<D3D11_SO_DECLARATION_ENTRY> *initData,
ID3D11GeometryShader **resourceOut)
{
if (initData)
{
return device->CreateGeometryShaderWithStreamOutput(
desc->get(), desc->size(), initData->data(), static_cast<UINT>(initData->size()),
nullptr, 0, 0, nullptr, resourceOut);
}
else
{
return device->CreateGeometryShader(desc->get(), desc->size(), nullptr, resourceOut);
}
}
HRESULT CreateResource(ID3D11Device *device,
const InputElementArray *desc, const InputElementArray *desc,
const ShaderData *initData, const ShaderData *initData,
ID3D11InputLayout **resourceOut) ID3D11InputLayout **resourceOut)
...@@ -130,6 +155,14 @@ HRESULT CreateResource(ID3D11Device *device, ...@@ -130,6 +155,14 @@ HRESULT CreateResource(ID3D11Device *device,
} }
HRESULT CreateResource(ID3D11Device *device, HRESULT CreateResource(ID3D11Device *device,
const ShaderData *desc,
void * /*initData*/,
ID3D11PixelShader **resourceOut)
{
return device->CreatePixelShader(desc->get(), desc->size(), nullptr, resourceOut);
}
HRESULT CreateResource(ID3D11Device *device,
const D3D11_RASTERIZER_DESC *desc, const D3D11_RASTERIZER_DESC *desc,
void * /*initData*/, void * /*initData*/,
ID3D11RasterizerState **rasterizerState) ID3D11RasterizerState **rasterizerState)
...@@ -177,6 +210,14 @@ HRESULT CreateResource(ID3D11Device *device, ...@@ -177,6 +210,14 @@ HRESULT CreateResource(ID3D11Device *device,
return device->CreateTexture3D(desc, initData, texture); return device->CreateTexture3D(desc, initData, texture);
} }
HRESULT CreateResource(ID3D11Device *device,
const ShaderData *desc,
void * /*initData*/,
ID3D11VertexShader **resourceOut)
{
return device->CreateVertexShader(desc->get(), desc->size(), nullptr, resourceOut);
}
DXGI_FORMAT GetTypedDepthStencilFormat(DXGI_FORMAT dxgiFormat) DXGI_FORMAT GetTypedDepthStencilFormat(DXGI_FORMAT dxgiFormat)
{ {
switch (dxgiFormat) switch (dxgiFormat)
......
...@@ -32,10 +32,14 @@ using ShaderData = WrappedArray<uint8_t>; ...@@ -32,10 +32,14 @@ using ShaderData = WrappedArray<uint8_t>;
#define ANGLE_RESOURCE_TYPE_OP(NAME, OP) \ #define ANGLE_RESOURCE_TYPE_OP(NAME, OP) \
OP(NAME, BlendState, ID3D11BlendState, D3D11_BLEND_DESC, void) \ OP(NAME, BlendState, ID3D11BlendState, D3D11_BLEND_DESC, void) \
OP(NAME, Buffer, ID3D11Buffer, D3D11_BUFFER_DESC, const D3D11_SUBRESOURCE_DATA) \ OP(NAME, Buffer, ID3D11Buffer, D3D11_BUFFER_DESC, const D3D11_SUBRESOURCE_DATA) \
OP(NAME, ComputeShader, ID3D11ComputeShader, ShaderData, void) \
OP(NAME, DepthStencilState, ID3D11DepthStencilState, D3D11_DEPTH_STENCIL_DESC, void) \ OP(NAME, DepthStencilState, ID3D11DepthStencilState, D3D11_DEPTH_STENCIL_DESC, void) \
OP(NAME, DepthStencilView, ID3D11DepthStencilView, D3D11_DEPTH_STENCIL_VIEW_DESC, \ OP(NAME, DepthStencilView, ID3D11DepthStencilView, D3D11_DEPTH_STENCIL_VIEW_DESC, \
ID3D11Resource) \ ID3D11Resource) \
OP(NAME, GeometryShader, ID3D11GeometryShader, ShaderData, \
const std::vector<D3D11_SO_DECLARATION_ENTRY>) \
OP(NAME, InputLayout, ID3D11InputLayout, InputElementArray, const ShaderData) \ OP(NAME, InputLayout, ID3D11InputLayout, InputElementArray, const ShaderData) \
OP(NAME, PixelShader, ID3D11PixelShader, ShaderData, void) \
OP(NAME, RasterizerState, ID3D11RasterizerState, D3D11_RASTERIZER_DESC, void) \ OP(NAME, RasterizerState, ID3D11RasterizerState, D3D11_RASTERIZER_DESC, void) \
OP(NAME, RenderTargetView, ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC, \ OP(NAME, RenderTargetView, ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC, \
ID3D11Resource) \ ID3D11Resource) \
...@@ -43,7 +47,8 @@ using ShaderData = WrappedArray<uint8_t>; ...@@ -43,7 +47,8 @@ using ShaderData = WrappedArray<uint8_t>;
OP(NAME, ShaderResourceView, ID3D11ShaderResourceView, D3D11_SHADER_RESOURCE_VIEW_DESC, \ OP(NAME, ShaderResourceView, ID3D11ShaderResourceView, D3D11_SHADER_RESOURCE_VIEW_DESC, \
ID3D11Resource) \ ID3D11Resource) \
OP(NAME, Texture2D, ID3D11Texture2D, D3D11_TEXTURE2D_DESC, const D3D11_SUBRESOURCE_DATA) \ OP(NAME, Texture2D, ID3D11Texture2D, D3D11_TEXTURE2D_DESC, const D3D11_SUBRESOURCE_DATA) \
OP(NAME, Texture3D, ID3D11Texture3D, D3D11_TEXTURE3D_DESC, const D3D11_SUBRESOURCE_DATA) OP(NAME, Texture3D, ID3D11Texture3D, D3D11_TEXTURE3D_DESC, const D3D11_SUBRESOURCE_DATA) \
OP(NAME, VertexShader, ID3D11VertexShader, ShaderData, void)
#define ANGLE_RESOURCE_TYPE_LIST(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) RESTYPE, #define ANGLE_RESOURCE_TYPE_LIST(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) RESTYPE,
......
...@@ -13,80 +13,82 @@ ...@@ -13,80 +13,82 @@
namespace rx namespace rx
{ {
ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11PixelShader *executable) ShaderExecutable11::ShaderExecutable11(const void *function,
: ShaderExecutableD3D(function, length) size_t length,
d3d11::PixelShader &&executable)
: ShaderExecutableD3D(function, length),
mPixelExecutable(std::move(executable)),
mVertexExecutable(),
mGeometryExecutable(),
mStreamOutExecutable(),
mComputeExecutable()
{ {
mPixelExecutable = executable;
mVertexExecutable = nullptr;
mGeometryExecutable = nullptr;
mStreamOutExecutable = nullptr;
mComputeExecutable = nullptr;
} }
ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11VertexShader *executable, ID3D11GeometryShader *streamOut) ShaderExecutable11::ShaderExecutable11(const void *function,
: ShaderExecutableD3D(function, length) size_t length,
d3d11::VertexShader &&executable,
d3d11::GeometryShader &&streamOut)
: ShaderExecutableD3D(function, length),
mPixelExecutable(),
mVertexExecutable(std::move(executable)),
mGeometryExecutable(),
mStreamOutExecutable(std::move(streamOut)),
mComputeExecutable()
{ {
mVertexExecutable = executable;
mPixelExecutable = nullptr;
mGeometryExecutable = nullptr;
mStreamOutExecutable = streamOut;
mComputeExecutable = nullptr;
} }
ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11GeometryShader *executable) ShaderExecutable11::ShaderExecutable11(const void *function,
: ShaderExecutableD3D(function, length) size_t length,
d3d11::GeometryShader &&executable)
: ShaderExecutableD3D(function, length),
mPixelExecutable(),
mVertexExecutable(),
mGeometryExecutable(std::move(executable)),
mStreamOutExecutable(),
mComputeExecutable()
{ {
mGeometryExecutable = executable;
mVertexExecutable = nullptr;
mPixelExecutable = nullptr;
mStreamOutExecutable = nullptr;
mComputeExecutable = nullptr;
} }
ShaderExecutable11::ShaderExecutable11(const void *function, ShaderExecutable11::ShaderExecutable11(const void *function,
size_t length, size_t length,
ID3D11ComputeShader *executable) d3d11::ComputeShader &&executable)
: ShaderExecutableD3D(function, length) : ShaderExecutableD3D(function, length),
mPixelExecutable(),
mVertexExecutable(),
mGeometryExecutable(),
mStreamOutExecutable(),
mComputeExecutable(std::move(executable))
{ {
mComputeExecutable = executable;
mPixelExecutable = nullptr;
mVertexExecutable = nullptr;
mGeometryExecutable = nullptr;
mStreamOutExecutable = nullptr;
} }
ShaderExecutable11::~ShaderExecutable11() ShaderExecutable11::~ShaderExecutable11()
{ {
SafeRelease(mVertexExecutable);
SafeRelease(mPixelExecutable);
SafeRelease(mGeometryExecutable);
SafeRelease(mStreamOutExecutable);
SafeRelease(mComputeExecutable);
} }
ID3D11VertexShader *ShaderExecutable11::getVertexShader() const ID3D11VertexShader *ShaderExecutable11::getVertexShader() const
{ {
return mVertexExecutable; return mVertexExecutable.get();
} }
ID3D11PixelShader *ShaderExecutable11::getPixelShader() const ID3D11PixelShader *ShaderExecutable11::getPixelShader() const
{ {
return mPixelExecutable; return mPixelExecutable.get();
} }
ID3D11GeometryShader *ShaderExecutable11::getGeometryShader() const ID3D11GeometryShader *ShaderExecutable11::getGeometryShader() const
{ {
return mGeometryExecutable; return mGeometryExecutable.get();
} }
ID3D11GeometryShader *ShaderExecutable11::getStreamOutShader() const ID3D11GeometryShader *ShaderExecutable11::getStreamOutShader() const
{ {
return mStreamOutExecutable; return mStreamOutExecutable.get();
} }
ID3D11ComputeShader *ShaderExecutable11::getComputeShader() const ID3D11ComputeShader *ShaderExecutable11::getComputeShader() const
{ {
return mComputeExecutable; return mComputeExecutable.get();
} }
UniformStorage11::UniformStorage11(size_t initialSize) UniformStorage11::UniformStorage11(size_t initialSize)
......
...@@ -21,10 +21,13 @@ class UniformStorage11; ...@@ -21,10 +21,13 @@ class UniformStorage11;
class ShaderExecutable11 : public ShaderExecutableD3D class ShaderExecutable11 : public ShaderExecutableD3D
{ {
public: public:
ShaderExecutable11(const void *function, size_t length, ID3D11PixelShader *executable); ShaderExecutable11(const void *function, size_t length, d3d11::PixelShader &&executable);
ShaderExecutable11(const void *function, size_t length, ID3D11VertexShader *executable, ID3D11GeometryShader *streamOut); ShaderExecutable11(const void *function,
ShaderExecutable11(const void *function, size_t length, ID3D11GeometryShader *executable); size_t length,
ShaderExecutable11(const void *function, size_t length, ID3D11ComputeShader *executable); d3d11::VertexShader &&executable,
d3d11::GeometryShader &&streamOut);
ShaderExecutable11(const void *function, size_t length, d3d11::GeometryShader &&executable);
ShaderExecutable11(const void *function, size_t length, d3d11::ComputeShader &&executable);
virtual ~ShaderExecutable11(); virtual ~ShaderExecutable11();
...@@ -35,11 +38,11 @@ class ShaderExecutable11 : public ShaderExecutableD3D ...@@ -35,11 +38,11 @@ class ShaderExecutable11 : public ShaderExecutableD3D
ID3D11ComputeShader *getComputeShader() const; ID3D11ComputeShader *getComputeShader() const;
private: private:
ID3D11PixelShader *mPixelExecutable; d3d11::PixelShader mPixelExecutable;
ID3D11VertexShader *mVertexExecutable; d3d11::VertexShader mVertexExecutable;
ID3D11GeometryShader *mGeometryExecutable; d3d11::GeometryShader mGeometryExecutable;
ID3D11GeometryShader *mStreamOutExecutable; d3d11::GeometryShader mStreamOutExecutable;
ID3D11ComputeShader *mComputeExecutable; d3d11::ComputeShader mComputeExecutable;
}; };
class UniformStorage11 : public UniformStorageD3D class UniformStorage11 : public UniformStorageD3D
......
...@@ -83,8 +83,8 @@ SwapChain11::SwapChain11(Renderer11 *renderer, ...@@ -83,8 +83,8 @@ SwapChain11::SwapChain11(Renderer11 *renderer,
mQuadVB(), mQuadVB(),
mPassThroughSampler(), mPassThroughSampler(),
mPassThroughIL(), mPassThroughIL(),
mPassThroughVS(nullptr), mPassThroughVS(),
mPassThroughPS(nullptr), mPassThroughPS(),
mPassThroughRS(), mPassThroughRS(),
mColorRenderTarget(this, renderer, false), mColorRenderTarget(this, renderer, false),
mDepthStencilRenderTarget(this, renderer, true), mDepthStencilRenderTarget(this, renderer, true),
...@@ -123,8 +123,8 @@ void SwapChain11::release() ...@@ -123,8 +123,8 @@ void SwapChain11::release()
mQuadVB.reset(); mQuadVB.reset();
mPassThroughSampler.reset(); mPassThroughSampler.reset();
mPassThroughIL.reset(); mPassThroughIL.reset();
SafeRelease(mPassThroughVS); mPassThroughVS.reset();
SafeRelease(mPassThroughPS); mPassThroughPS.reset();
mPassThroughRS.reset(); mPassThroughRS.reset();
if (!mAppCreatedShareHandle) if (!mAppCreatedShareHandle)
...@@ -612,7 +612,7 @@ void SwapChain11::initPassThroughResources() ...@@ -612,7 +612,7 @@ void SwapChain11::initPassThroughResources()
// Make sure our resources are all not allocated, when we create // Make sure our resources are all not allocated, when we create
ASSERT(!mQuadVB.valid() && !mPassThroughSampler.valid()); ASSERT(!mQuadVB.valid() && !mPassThroughSampler.valid());
ASSERT(!mPassThroughIL.valid() && mPassThroughVS == nullptr && mPassThroughPS == nullptr); ASSERT(!mPassThroughIL.valid() && !mPassThroughVS.valid() && !mPassThroughPS.valid());
D3D11_BUFFER_DESC vbDesc; D3D11_BUFFER_DESC vbDesc;
vbDesc.ByteWidth = sizeof(d3d11::PositionTexCoordVertex) * 4; vbDesc.ByteWidth = sizeof(d3d11::PositionTexCoordVertex) * 4;
...@@ -658,24 +658,23 @@ void SwapChain11::initPassThroughResources() ...@@ -658,24 +658,23 @@ void SwapChain11::initPassThroughResources()
ASSERT(!err.isError()); ASSERT(!err.isError());
mPassThroughIL.setDebugName("Swap chain pass through layout"); mPassThroughIL.setDebugName("Swap chain pass through layout");
HRESULT result = device->CreateVertexShader(g_VS_Passthrough2D, sizeof(g_VS_Passthrough2D), err = mRenderer->allocateResource(vertexShaderData, &mPassThroughVS);
nullptr, &mPassThroughVS); ASSERT(!err.isError());
ASSERT(SUCCEEDED(result)); mPassThroughVS.setDebugName("Swap chain pass through vertex shader");
d3d11::SetDebugName(mPassThroughVS, "Swap chain pass through vertex shader");
if (mEGLSamples <= 1) if (mEGLSamples <= 1)
{ {
result = device->CreatePixelShader(g_PS_PassthroughRGBA2D, sizeof(g_PS_PassthroughRGBA2D), ShaderData pixelShaderData(g_PS_PassthroughRGBA2D);
nullptr, &mPassThroughPS); err = mRenderer->allocateResource(pixelShaderData, &mPassThroughPS);
} }
else else
{ {
result = device->CreatePixelShader( ShaderData pixelShaderData(g_PS_PassthroughRGBA2DMS);
g_PS_PassthroughRGBA2DMS, sizeof(g_PS_PassthroughRGBA2DMS), nullptr, &mPassThroughPS); err = mRenderer->allocateResource(pixelShaderData, &mPassThroughPS);
} }
ASSERT(SUCCEEDED(result)); ASSERT(!err.isError());
d3d11::SetDebugName(mPassThroughPS, "Swap chain pass through pixel shader"); mPassThroughPS.setDebugName("Swap chain pass through pixel shader");
// Use the default rasterizer state but without culling // Use the default rasterizer state but without culling
D3D11_RASTERIZER_DESC rasterizerDesc; D3D11_RASTERIZER_DESC rasterizerDesc;
...@@ -786,8 +785,8 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width, ...@@ -786,8 +785,8 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width,
// Apply shaders // Apply shaders
deviceContext->IASetInputLayout(mPassThroughIL.get()); deviceContext->IASetInputLayout(mPassThroughIL.get());
deviceContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); deviceContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
deviceContext->VSSetShader(mPassThroughVS, nullptr, 0); deviceContext->VSSetShader(mPassThroughVS.get(), nullptr, 0);
deviceContext->PSSetShader(mPassThroughPS, nullptr, 0); deviceContext->PSSetShader(mPassThroughPS.get(), nullptr, 0);
deviceContext->GSSetShader(nullptr, nullptr, 0); deviceContext->GSSetShader(nullptr, nullptr, 0);
auto stateManager = mRenderer->getStateManager(); auto stateManager = mRenderer->getStateManager();
......
...@@ -101,8 +101,8 @@ class SwapChain11 final : public SwapChainD3D ...@@ -101,8 +101,8 @@ class SwapChain11 final : public SwapChainD3D
d3d11::Buffer mQuadVB; d3d11::Buffer mQuadVB;
d3d11::SamplerState mPassThroughSampler; d3d11::SamplerState mPassThroughSampler;
d3d11::InputLayout mPassThroughIL; d3d11::InputLayout mPassThroughIL;
ID3D11VertexShader *mPassThroughVS; d3d11::VertexShader mPassThroughVS;
ID3D11PixelShader *mPassThroughPS; d3d11::PixelShader mPassThroughPS;
d3d11::RasterizerState mPassThroughRS; d3d11::RasterizerState mPassThroughRS;
SurfaceRenderTarget11 mColorRenderTarget; SurfaceRenderTarget11 mColorRenderTarget;
......
...@@ -184,86 +184,12 @@ inline bool isDeviceLostError(HRESULT errorCode) ...@@ -184,86 +184,12 @@ inline bool isDeviceLostError(HRESULT errorCode)
} }
} }
inline ID3D11VertexShader *CompileVS(ID3D11Device *device, const BYTE *byteCode, size_t N, const char *name)
{
ID3D11VertexShader *vs = nullptr;
HRESULT result = device->CreateVertexShader(byteCode, N, nullptr, &vs);
ASSERT(SUCCEEDED(result));
if (SUCCEEDED(result))
{
SetDebugName(vs, name);
return vs;
}
return nullptr;
}
template <unsigned int N>
ID3D11VertexShader *CompileVS(ID3D11Device *device, const BYTE (&byteCode)[N], const char *name)
{
return CompileVS(device, byteCode, N, name);
}
inline ID3D11GeometryShader *CompileGS(ID3D11Device *device, const BYTE *byteCode, size_t N, const char *name)
{
ID3D11GeometryShader *gs = nullptr;
HRESULT result = device->CreateGeometryShader(byteCode, N, nullptr, &gs);
ASSERT(SUCCEEDED(result));
if (SUCCEEDED(result))
{
SetDebugName(gs, name);
return gs;
}
return nullptr;
}
template <unsigned int N>
ID3D11GeometryShader *CompileGS(ID3D11Device *device, const BYTE (&byteCode)[N], const char *name)
{
return CompileGS(device, byteCode, N, name);
}
inline ID3D11PixelShader *CompilePS(ID3D11Device *device, const BYTE *byteCode, size_t N, const char *name)
{
ID3D11PixelShader *ps = nullptr;
HRESULT result = device->CreatePixelShader(byteCode, N, nullptr, &ps);
ASSERT(SUCCEEDED(result));
if (SUCCEEDED(result))
{
SetDebugName(ps, name);
return ps;
}
return nullptr;
}
template <unsigned int N>
ID3D11PixelShader *CompilePS(ID3D11Device *device, const BYTE (&byteCode)[N], const char *name)
{
return CompilePS(device, byteCode, N, name);
}
template <typename ResourceType>
class LazyResource : angle::NonCopyable
{
public:
LazyResource() : mResource(nullptr), mAssociatedDevice(nullptr) {}
virtual ~LazyResource() { release(); }
virtual ResourceType *resolve(ID3D11Device *device) = 0;
void release() { SafeRelease(mResource); }
protected:
void checkAssociatedDevice(ID3D11Device *device);
ResourceType *mResource;
ID3D11Device *mAssociatedDevice;
};
template <ResourceType ResourceT> template <ResourceType ResourceT>
class LazyResource2 : angle::NonCopyable class LazyResource : angle::NonCopyable
{ {
public: public:
constexpr LazyResource2() : mResource() {} constexpr LazyResource() : mResource() {}
virtual ~LazyResource2() {} virtual ~LazyResource() {}
virtual gl::Error resolve(Renderer11 *renderer) = 0; virtual gl::Error resolve(Renderer11 *renderer) = 0;
void reset() { mResource.reset(); } void reset() { mResource.reset(); }
...@@ -290,69 +216,27 @@ class LazyResource2 : angle::NonCopyable ...@@ -290,69 +216,27 @@ class LazyResource2 : angle::NonCopyable
Resource11<GetD3D11Type<ResourceT>> mResource; Resource11<GetD3D11Type<ResourceT>> mResource;
}; };
template <typename ResourceType>
void LazyResource<ResourceType>::checkAssociatedDevice(ID3D11Device *device)
{
ASSERT(mAssociatedDevice == nullptr || device == mAssociatedDevice);
mAssociatedDevice = device;
}
template <typename D3D11ShaderType> template <typename D3D11ShaderType>
class LazyShader final : public LazyResource<D3D11ShaderType> class LazyShader final : public LazyResource<GetResourceTypeFromD3D11<D3D11ShaderType>()>
{ {
public: public:
// All parameters must be constexpr. Not supported in VS2013. // All parameters must be constexpr. Not supported in VS2013.
LazyShader(const BYTE *byteCode, constexpr LazyShader(const BYTE *byteCode, size_t byteCodeSize, const char *name)
size_t byteCodeSize, : mByteCode(byteCode, byteCodeSize), mName(name)
const char *name)
: mByteCode(byteCode),
mByteCodeSize(byteCodeSize),
mName(name)
{ {
} }
D3D11ShaderType *resolve(ID3D11Device *device) override; gl::Error resolve(Renderer11 *renderer) override
{
return this->resolveImpl(renderer, mByteCode, nullptr, mName);
}
private: private:
const BYTE *mByteCode; ShaderData mByteCode;
size_t mByteCodeSize;
const char *mName; const char *mName;
}; };
template <> class LazyInputLayout final : public LazyResource<ResourceType::InputLayout>
inline ID3D11VertexShader *LazyShader<ID3D11VertexShader>::resolve(ID3D11Device *device)
{
checkAssociatedDevice(device);
if (mResource == nullptr)
{
mResource = CompileVS(device, mByteCode, mByteCodeSize, mName);
}
return mResource;
}
template <>
inline ID3D11GeometryShader *LazyShader<ID3D11GeometryShader>::resolve(ID3D11Device *device)
{
checkAssociatedDevice(device);
if (mResource == nullptr)
{
mResource = CompileGS(device, mByteCode, mByteCodeSize, mName);
}
return mResource;
}
template <>
inline ID3D11PixelShader *LazyShader<ID3D11PixelShader>::resolve(ID3D11Device *device)
{
checkAssociatedDevice(device);
if (mResource == nullptr)
{
mResource = CompilePS(device, mByteCode, mByteCodeSize, mName);
}
return mResource;
}
class LazyInputLayout final : public LazyResource2<ResourceType::InputLayout>
{ {
public: public:
constexpr LazyInputLayout(const D3D11_INPUT_ELEMENT_DESC *inputDesc, constexpr LazyInputLayout(const D3D11_INPUT_ELEMENT_DESC *inputDesc,
...@@ -374,7 +258,7 @@ class LazyInputLayout final : public LazyResource2<ResourceType::InputLayout> ...@@ -374,7 +258,7 @@ class LazyInputLayout final : public LazyResource2<ResourceType::InputLayout>
const char *mDebugName; const char *mDebugName;
}; };
class LazyBlendState final : public LazyResource2<ResourceType::BlendState> class LazyBlendState final : public LazyResource<ResourceType::BlendState>
{ {
public: public:
LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugName); LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugName);
......
...@@ -2697,7 +2697,7 @@ gl::Error Renderer9::createRenderTargetCopy(RenderTargetD3D *source, RenderTarge ...@@ -2697,7 +2697,7 @@ gl::Error Renderer9::createRenderTargetCopy(RenderTargetD3D *source, RenderTarge
return gl::NoError(); return gl::NoError();
} }
gl::Error Renderer9::loadExecutable(const void *function, gl::Error Renderer9::loadExecutable(const uint8_t *function,
size_t length, size_t length,
ShaderType type, ShaderType type,
const std::vector<D3DVarying> &streamOutVaryings, const std::vector<D3DVarying> &streamOutVaryings,
...@@ -2817,8 +2817,9 @@ gl::Error Renderer9::compileToExecutable(gl::InfoLog &infoLog, ...@@ -2817,8 +2817,9 @@ gl::Error Renderer9::compileToExecutable(gl::InfoLog &infoLog,
return gl::NoError(); return gl::NoError();
} }
error = loadExecutable(binary->GetBufferPointer(), binary->GetBufferSize(), type, error = loadExecutable(reinterpret_cast<const uint8_t *>(binary->GetBufferPointer()),
streamOutVaryings, separatedOutputBuffers, outExectuable); binary->GetBufferSize(), type, streamOutVaryings, separatedOutputBuffers,
outExectuable);
SafeRelease(binary); SafeRelease(binary);
if (error.isError()) if (error.isError())
......
...@@ -244,7 +244,7 @@ class Renderer9 : public RendererD3D ...@@ -244,7 +244,7 @@ class Renderer9 : public RendererD3D
gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) override; gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) override;
// Shader operations // Shader operations
gl::Error loadExecutable(const void *function, gl::Error loadExecutable(const uint8_t *function,
size_t length, size_t length,
ShaderType type, ShaderType type,
const std::vector<D3DVarying> &streamOutVaryings, const std::vector<D3DVarying> &streamOutVaryings,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment