diff options
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.cpp | 283 |
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 |