summaryrefslogtreecommitdiff
path: root/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp')
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp283
1 files changed, 156 insertions, 127 deletions
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp
index 4755132deaf..a5b3641f54e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp
@@ -82,7 +82,7 @@ bool UpdateDataCache(RtvDsvClearInfo<T> *dataCache,
} // anonymous namespace
Clear11::ShaderManager::ShaderManager()
- : mIl9(nullptr),
+ : mIl9(),
mVs9(g_VS_Clear_FL9, ArraySize(g_VS_Clear_FL9), "Clear11 VS FL9"),
mPsFloat9(g_PS_ClearFloat_FL9, ArraySize(g_PS_ClearFloat_FL9), "Clear11 PS FloatFL9"),
mVs(g_VS_Clear, ArraySize(g_VS_Clear), "Clear11 VS"),
@@ -94,74 +94,88 @@ Clear11::ShaderManager::ShaderManager()
Clear11::ShaderManager::~ShaderManager()
{
- mVs9.release();
- mPsFloat9.release();
- mVs.release();
- mPsFloat.release();
- mPsUInt.release();
- mPsSInt.release();
}
-void Clear11::ShaderManager::getShadersAndLayout(ID3D11Device *device,
- D3D_FEATURE_LEVEL featureLevel,
- const INT clearType,
- ID3D11InputLayout **il,
- ID3D11VertexShader **vs,
- ID3D11PixelShader **ps)
+gl::Error Clear11::ShaderManager::getShadersAndLayout(Renderer11 *renderer,
+ const INT clearType,
+ const d3d11::InputLayout **il,
+ const d3d11::VertexShader **vs,
+ const d3d11::PixelShader **ps)
{
- if (featureLevel <= D3D_FEATURE_LEVEL_9_3)
+ if (renderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
{
ASSERT(clearType == GL_FLOAT);
- *vs = mVs9.resolve(device);
+ ANGLE_TRY(mVs9.resolve(renderer));
+ ANGLE_TRY(mPsFloat9.resolve(renderer));
- if (mIl9.Get() == nullptr)
+ if (!mIl9.valid())
{
- const D3D11_INPUT_ELEMENT_DESC ilDesc = {
- "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0};
+ const D3D11_INPUT_ELEMENT_DESC ilDesc[] = {
+ {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}};
- device->CreateInputLayout(&ilDesc, 1, g_VS_Clear_FL9, ArraySize(g_PS_ClearFloat_FL9),
- mIl9.GetAddressOf());
+ InputElementArray ilDescArray(ilDesc);
+ ShaderData vertexShader(g_VS_Clear_FL9);
+
+ ANGLE_TRY(renderer->allocateResource(ilDescArray, &vertexShader, &mIl9));
}
- *il = mIl9.Get();
- *ps = mPsFloat9.resolve(device);
- return;
+ *vs = &mVs9.getObj();
+ *il = &mIl9;
+ *ps = &mPsFloat9.getObj();
+ return gl::NoError();
}
- *vs = mVs.resolve(device);
+ ANGLE_TRY(mVs.resolve(renderer));
+ *vs = &mVs.getObj();
*il = nullptr;
switch (clearType)
{
case GL_FLOAT:
- *ps = mPsFloat.resolve(device);
+ ANGLE_TRY(mPsFloat.resolve(renderer));
+ *ps = &mPsFloat.getObj();
break;
case GL_UNSIGNED_INT:
- *ps = mPsUInt.resolve(device);
+ ANGLE_TRY(mPsUInt.resolve(renderer));
+ *ps = &mPsUInt.getObj();
break;
case GL_INT:
- *ps = mPsSInt.resolve(device);
+ ANGLE_TRY(mPsSInt.resolve(renderer));
+ *ps = &mPsSInt.getObj();
break;
default:
UNREACHABLE();
break;
}
+
+ return gl::NoError();
}
Clear11::Clear11(Renderer11 *renderer)
: mRenderer(renderer),
- mScissorEnabledRasterizerState(nullptr),
- mScissorDisabledRasterizerState(nullptr),
+ mResourcesInitialized(false),
+ mScissorEnabledRasterizerState(),
+ mScissorDisabledRasterizerState(),
mShaderManager(),
- mConstantBuffer(nullptr),
- mVertexBuffer(nullptr),
+ mConstantBuffer(),
+ mVertexBuffer(),
mShaderData({})
{
- TRACE_EVENT0("gpu.angle", "Clear11::Clear11");
+}
- HRESULT result;
- ID3D11Device *device = renderer->getDevice();
+Clear11::~Clear11()
+{
+}
+
+gl::Error Clear11::ensureResourcesInitialized()
+{
+ if (mResourcesInitialized)
+ {
+ return gl::NoError();
+ }
+
+ TRACE_EVENT0("gpu.angle", "Clear11::ensureResourcesInitialized");
static_assert((sizeof(RtvDsvClearInfo<float>) == sizeof(RtvDsvClearInfo<int>)),
"Size of rx::RtvDsvClearInfo<float> is not equal to rx::RtvDsvClearInfo<int>");
@@ -173,55 +187,6 @@ Clear11::Clear11(Renderer11 *renderer)
static_assert((sizeof(RtvDsvClearInfo<float>) % 16 == 0),
"The size of RtvDsvClearInfo<float> should be a multiple of 16bytes.");
- // Create constant buffer for color & depth data
-
- D3D11_BUFFER_DESC bufferDesc;
- bufferDesc.ByteWidth = g_ConstantBufferSize;
- bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
- bufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
- bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- bufferDesc.MiscFlags = 0;
- bufferDesc.StructureByteStride = 0;
-
- D3D11_SUBRESOURCE_DATA initialData;
- initialData.pSysMem = &mShaderData;
- initialData.SysMemPitch = g_ConstantBufferSize;
- initialData.SysMemSlicePitch = g_ConstantBufferSize;
-
- result = device->CreateBuffer(&bufferDesc, &initialData, mConstantBuffer.GetAddressOf());
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mConstantBuffer, "Clear11 Constant Buffer");
-
- const D3D_FEATURE_LEVEL featureLevel = mRenderer->getRenderer11DeviceCaps().featureLevel;
-
- if (featureLevel <= D3D_FEATURE_LEVEL_9_3)
- {
- // Create vertex buffer with vertices for a quad covering the entire surface
-
- static_assert((sizeof(d3d11::PositionVertex) % 16) == 0,
- "d3d11::PositionVertex should be a multiple of 16 bytes");
- const d3d11::PositionVertex vbData[6] = {
- {-1.0f, 1.0f, 0.0f, 1.0f}, {1.0f, -1.0f, 0.0f, 1.0f}, {-1.0f, -1.0f, 0.0f, 1.0f},
- {-1.0f, 1.0f, 0.0f, 1.0f}, {1.0f, 1.0f, 0.0f, 1.0f}, {1.0f, -1.0f, 0.0f, 1.0f}};
-
- const UINT vbSize = sizeof(vbData);
-
- bufferDesc.ByteWidth = vbSize;
- bufferDesc.Usage = D3D11_USAGE_IMMUTABLE;
- bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
- bufferDesc.CPUAccessFlags = 0;
- bufferDesc.MiscFlags = 0;
- bufferDesc.StructureByteStride = 0;
-
- initialData.pSysMem = vbData;
- initialData.SysMemPitch = vbSize;
- initialData.SysMemSlicePitch = initialData.SysMemPitch;
-
- result = device->CreateBuffer(&bufferDesc, &initialData, mVertexBuffer.GetAddressOf());
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mVertexBuffer, "Clear11 Vertex Buffer");
- }
-
// Create Rasterizer States
D3D11_RASTERIZER_DESC rsDesc;
rsDesc.FillMode = D3D11_FILL_SOLID;
@@ -235,16 +200,12 @@ Clear11::Clear11(Renderer11 *renderer)
rsDesc.MultisampleEnable = FALSE;
rsDesc.AntialiasedLineEnable = FALSE;
- result = device->CreateRasterizerState(&rsDesc, mScissorDisabledRasterizerState.GetAddressOf());
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mScissorDisabledRasterizerState,
- "Clear11 Rasterizer State with scissor disabled");
+ ANGLE_TRY(mRenderer->allocateResource(rsDesc, &mScissorDisabledRasterizerState));
+ mScissorDisabledRasterizerState.setDebugName("Clear11 Rasterizer State with scissor disabled");
rsDesc.ScissorEnable = TRUE;
- result = device->CreateRasterizerState(&rsDesc, mScissorEnabledRasterizerState.GetAddressOf());
- ASSERT(SUCCEEDED(result));
- d3d11::SetDebugName(mScissorEnabledRasterizerState,
- "Clear11 Rasterizer State with scissor enabled");
+ ANGLE_TRY(mRenderer->allocateResource(rsDesc, &mScissorEnabledRasterizerState));
+ mScissorEnabledRasterizerState.setDebugName("Clear11 Rasterizer State with scissor enabled");
// Initialize Depthstencil state with defaults
mDepthStencilStateKey.depthTest = false;
@@ -276,15 +237,86 @@ Clear11::Clear11(Renderer11 *renderer)
mBlendStateKey.blendState.dither = true;
mBlendStateKey.mrt = false;
memset(mBlendStateKey.rtvMasks, 0, sizeof(mBlendStateKey.rtvMasks));
+
+ mResourcesInitialized = true;
+ return gl::NoError();
}
-Clear11::~Clear11()
+bool Clear11::useVertexBuffer() const
+{
+ return (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3);
+}
+
+gl::Error Clear11::ensureConstantBufferCreated()
+{
+ if (mConstantBuffer.valid())
+ {
+ return gl::NoError();
+ }
+
+ // Create constant buffer for color & depth data
+
+ D3D11_BUFFER_DESC bufferDesc;
+ bufferDesc.ByteWidth = g_ConstantBufferSize;
+ bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
+ bufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
+ bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ bufferDesc.MiscFlags = 0;
+ bufferDesc.StructureByteStride = 0;
+
+ D3D11_SUBRESOURCE_DATA initialData;
+ initialData.pSysMem = &mShaderData;
+ initialData.SysMemPitch = g_ConstantBufferSize;
+ initialData.SysMemSlicePitch = g_ConstantBufferSize;
+
+ ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &initialData, &mConstantBuffer));
+ mConstantBuffer.setDebugName("Clear11 Constant Buffer");
+ return gl::NoError();
+}
+
+gl::Error Clear11::ensureVertexBufferCreated()
{
+ ASSERT(useVertexBuffer());
+
+ if (mVertexBuffer.valid())
+ {
+ return gl::NoError();
+ }
+
+ // Create vertex buffer with vertices for a quad covering the entire surface
+
+ static_assert((sizeof(d3d11::PositionVertex) % 16) == 0,
+ "d3d11::PositionVertex should be a multiple of 16 bytes");
+ const d3d11::PositionVertex vbData[6] = {{-1.0f, 1.0f, 0.0f, 1.0f}, {1.0f, -1.0f, 0.0f, 1.0f},
+ {-1.0f, -1.0f, 0.0f, 1.0f}, {-1.0f, 1.0f, 0.0f, 1.0f},
+ {1.0f, 1.0f, 0.0f, 1.0f}, {1.0f, -1.0f, 0.0f, 1.0f}};
+
+ const UINT vbSize = sizeof(vbData);
+
+ D3D11_BUFFER_DESC bufferDesc;
+ bufferDesc.ByteWidth = vbSize;
+ bufferDesc.Usage = D3D11_USAGE_IMMUTABLE;
+ bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
+ bufferDesc.CPUAccessFlags = 0;
+ bufferDesc.MiscFlags = 0;
+ bufferDesc.StructureByteStride = 0;
+
+ D3D11_SUBRESOURCE_DATA initialData;
+ initialData.pSysMem = vbData;
+ initialData.SysMemPitch = vbSize;
+ initialData.SysMemSlicePitch = initialData.SysMemPitch;
+
+ ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &initialData, &mVertexBuffer));
+ mVertexBuffer.setDebugName("Clear11 Vertex Buffer");
+ return gl::NoError();
}
-gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
+gl::Error Clear11::clearFramebuffer(const gl::Context *context,
+ const ClearParameters &clearParams,
const gl::FramebufferState &fboData)
{
+ ANGLE_TRY(ensureResourcesInitialized());
+
// Iterate over the color buffers which require clearing and determine if they can be
// cleared with ID3D11DeviceContext::ClearRenderTargetView or ID3D11DeviceContext1::ClearView.
// This requires:
@@ -364,20 +396,17 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
clearParams.colorMaskBlue, clearParams.colorMaskAlpha);
const auto &colorAttachments = fboData.getColorAttachments();
- const auto &drawBufferStates = fboData.getDrawBufferStates();
- for (size_t colorAttachmentIndex = 0; colorAttachmentIndex < colorAttachments.size();
- colorAttachmentIndex++)
+ for (auto colorAttachmentIndex : fboData.getEnabledDrawBuffers())
{
const gl::FramebufferAttachment &attachment = colorAttachments[colorAttachmentIndex];
- if (!clearParams.clearColor[colorAttachmentIndex] || !attachment.isAttached() ||
- drawBufferStates[colorAttachmentIndex] == GL_NONE)
+ if (!clearParams.clearColor[colorAttachmentIndex])
{
continue;
}
RenderTarget11 *renderTarget = nullptr;
- ANGLE_TRY(attachment.getRenderTarget(&renderTarget));
+ ANGLE_TRY(attachment.getRenderTarget(context, &renderTarget));
const gl::InternalFormat &formatInfo = *attachment.getFormat().info;
@@ -487,7 +516,7 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
RenderTarget11 *depthStencilRenderTarget = nullptr;
ASSERT(depthStencilAttachment != nullptr);
- ANGLE_TRY(depthStencilAttachment->getRenderTarget(&depthStencilRenderTarget));
+ ANGLE_TRY(depthStencilAttachment->getRenderTarget(context, &depthStencilRenderTarget));
dsv = depthStencilRenderTarget->getDepthStencilView().get();
ASSERT(dsv != nullptr);
@@ -562,7 +591,7 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
// Get BlendState
ID3D11BlendState *blendState = nullptr;
- ANGLE_TRY(mRenderer->getStateCache().getBlendState(mBlendStateKey, &blendState));
+ ANGLE_TRY(mRenderer->getBlendState(mBlendStateKey, &blendState));
ID3D11DepthStencilState *dsState = nullptr;
const float *zValue = nullptr;
@@ -576,7 +605,7 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
mDepthStencilStateKey.stencilTest = clearParams.clearStencil;
// Get DepthStencilState
- ANGLE_TRY(mRenderer->getStateCache().getDepthStencilState(mDepthStencilStateKey, &dsState));
+ ANGLE_TRY(mRenderer->getDepthStencilState(mDepthStencilStateKey, &dsState));
zValue = clearParams.clearDepth ? &clearParams.depthValue : nullptr;
}
@@ -602,20 +631,22 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
break;
}
+ ANGLE_TRY(ensureConstantBufferCreated());
+
if (dirtyCb)
{
// Update the constant buffer with the updated cache contents
// TODO(Shahmeer): Consider using UpdateSubresource1 D3D11_COPY_DISCARD where possible.
D3D11_MAPPED_SUBRESOURCE mappedResource;
- HRESULT result = deviceContext->Map(mConstantBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0,
+ HRESULT result = deviceContext->Map(mConstantBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0,
&mappedResource);
if (FAILED(result))
{
- return gl::OutOfMemory() << "Clear11: Failed to map CB, " << result;
+ return gl::OutOfMemory() << "Clear11: Failed to map CB, " << gl::FmtHR(result);
}
memcpy(mappedResource.pData, &mShaderData, g_ConstantBufferSize);
- deviceContext->Unmap(mConstantBuffer.Get(), 0);
+ deviceContext->Unmap(mConstantBuffer.get(), 0);
}
// Set the viewport to be the same size as the framebuffer
@@ -639,54 +670,52 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
const D3D11_RECT scissorRect = {clearParams.scissor.x, clearParams.scissor.y,
clearParams.scissor.x1(), clearParams.scissor.y1()};
deviceContext->RSSetScissorRects(1, &scissorRect);
- deviceContext->RSSetState(mScissorEnabledRasterizerState.Get());
+ deviceContext->RSSetState(mScissorEnabledRasterizerState.get());
}
else
{
- deviceContext->RSSetState(mScissorDisabledRasterizerState.Get());
+ deviceContext->RSSetState(mScissorDisabledRasterizerState.get());
}
+ auto *stateManager = mRenderer->getStateManager();
+
// Get Shaders
- const D3D_FEATURE_LEVEL fl = mRenderer->getRenderer11DeviceCaps().featureLevel;
- ID3D11Device *device = mRenderer->getDevice();
- ID3D11VertexShader *vs;
- ID3D11InputLayout *il;
- ID3D11PixelShader *ps;
+ const d3d11::VertexShader *vs = nullptr;
+ const d3d11::InputLayout *il = nullptr;
+ const d3d11::PixelShader *ps = nullptr;
- mShaderManager.getShadersAndLayout(device, fl, clearParams.colorType, &il, &vs, &ps);
+ ANGLE_TRY(mShaderManager.getShadersAndLayout(mRenderer, clearParams.colorType, &il, &vs, &ps));
// Apply Shaders
- deviceContext->VSSetShader(vs, nullptr, 0);
- deviceContext->GSSetShader(nullptr, nullptr, 0);
- deviceContext->PSSetShader(ps, nullptr, 0);
- deviceContext->PSSetConstantBuffers(0, 1, mConstantBuffer.GetAddressOf());
+ stateManager->setDrawShaders(vs, nullptr, ps);
+ ID3D11Buffer *constantBuffer = mConstantBuffer.get();
+ deviceContext->PSSetConstantBuffers(0, 1, &constantBuffer);
// Bind IL & VB if needed
deviceContext->IASetIndexBuffer(nullptr, DXGI_FORMAT_UNKNOWN, 0);
- deviceContext->IASetInputLayout(il);
+ stateManager->setInputLayout(il);
- if (mVertexBuffer.Get())
+ if (useVertexBuffer())
{
- const UINT offset = 0;
- deviceContext->IASetVertexBuffers(0, 1, mVertexBuffer.GetAddressOf(), &g_VertexSize,
- &offset);
+ ANGLE_TRY(ensureVertexBufferCreated());
+ stateManager->setSingleVertexBuffer(&mVertexBuffer, g_VertexSize, 0);
}
else
{
- deviceContext->IASetVertexBuffers(0, 0, nullptr, nullptr, nullptr);
+ stateManager->setSingleVertexBuffer(nullptr, 0, 0);
}
- deviceContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+ stateManager->setPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
// Apply render targets
- mRenderer->getStateManager()->setOneTimeRenderTargets(&rtvs[0], numRtvs, dsv);
+ stateManager->setOneTimeRenderTargets(context, &rtvs[0], numRtvs, dsv);
// Draw the fullscreen quad
deviceContext->Draw(6, 0);
// Clean up
- mRenderer->markAllStateDirty();
+ mRenderer->markAllStateDirty(context);
return gl::NoError();
}
-}
+} // namespace rx