Commit bdc1e2a2 by Jamie Madill Committed by Commit Bot

D3D11: Consolidate Buffer allocation.

We now allocate and release all buffer resources from a single place, allowing us to allocate junk memory, clear on init, and track the currently allocated buffer memory. BUG=angleproject:2034 Change-Id: Id60b63a7f77bc369dfc494a7587ab06c8d34a8e2 Reviewed-on: https://chromium-review.googlesource.com/503253Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent a1b9d5a2
......@@ -248,18 +248,9 @@ class ProgramD3D : public ProgramImpl
void setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) override;
const UniformStorageD3D &getVertexUniformStorage() const
{
return *mVertexUniformStorage.get();
}
const UniformStorageD3D &getFragmentUniformStorage() const
{
return *mFragmentUniformStorage.get();
}
const UniformStorageD3D &getComputeUniformStorage() const
{
return *mComputeUniformStorage.get();
}
UniformStorageD3D &getVertexUniformStorage() const { return *mVertexUniformStorage.get(); }
UniformStorageD3D &getFragmentUniformStorage() const { return *mFragmentUniformStorage.get(); }
UniformStorageD3D &getComputeUniformStorage() const { return *mComputeUniformStorage.get(); }
unsigned int getSerial() const;
......
......@@ -556,7 +556,7 @@ DXGI_FORMAT GetStencilSRVFormat(const d3d11::Format &formatSet)
Blit11::Blit11(Renderer11 *renderer)
: mRenderer(renderer),
mResourcesInitialized(false),
mVertexBuffer(nullptr),
mVertexBuffer(),
mPointSampler(nullptr),
mLinearSampler(nullptr),
mScissorEnabledRasterizerState(nullptr),
......@@ -579,7 +579,7 @@ Blit11::Blit11(Renderer11 *renderer)
mQuad3DVS(g_VS_Passthrough3D, ArraySize(g_VS_Passthrough3D), "Blit11 3D vertex shader"),
mQuad3DGS(g_GS_Passthrough3D, ArraySize(g_GS_Passthrough3D), "Blit11 3D geometry shader"),
mAlphaMaskBlendState(GetAlphaMaskBlendStateDesc(), "Blit11 Alpha Mask Blend"),
mSwizzleCB(nullptr),
mSwizzleCB(),
mResolveDepthStencilVS(g_VS_ResolveDepthStencil,
ArraySize(g_VS_ResolveDepthStencil),
"Blit11::mResolveDepthStencilVS"),
......@@ -632,13 +632,8 @@ gl::Error Blit11::initResources()
vbDesc.MiscFlags = 0;
vbDesc.StructureByteStride = 0;
result = device->CreateBuffer(&vbDesc, nullptr, mVertexBuffer.GetAddressOf());
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
return gl::OutOfMemory() << "Failed to create blit vertex buffer, " << result;
}
d3d11::SetDebugName(mVertexBuffer, "Blit11 vertex buffer");
ANGLE_TRY(mRenderer->allocateResource(vbDesc, &mVertexBuffer));
mVertexBuffer.setDebugName("Blit11 vertex buffer");
D3D11_SAMPLER_DESC pointSamplerDesc;
pointSamplerDesc.Filter = D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR;
......@@ -751,13 +746,8 @@ gl::Error Blit11::initResources()
swizzleBufferDesc.MiscFlags = 0;
swizzleBufferDesc.StructureByteStride = 0;
result = device->CreateBuffer(&swizzleBufferDesc, nullptr, mSwizzleCB.GetAddressOf());
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
return gl::OutOfMemory() << "Failed to create blit swizzle buffer, " << result;
}
d3d11::SetDebugName(mSwizzleCB, "Blit11 swizzle constant buffer");
ANGLE_TRY(mRenderer->allocateResource(swizzleBufferDesc, &mSwizzleCB));
mSwizzleCB.setDebugName("Blit11 swizzle constant buffer");
mResourcesInitialized = true;
......@@ -1076,7 +1066,7 @@ gl::Error Blit11::swizzleTexture(const d3d11::SharedSRV &source,
// Set vertices
D3D11_MAPPED_SUBRESOURCE mappedResource;
result =
deviceContext->Map(mVertexBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
deviceContext->Map(mVertexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (FAILED(result))
{
return gl::OutOfMemory() << "Failed to map internal vertex buffer for swizzle, " << result;
......@@ -1093,10 +1083,10 @@ gl::Error Blit11::swizzleTexture(const d3d11::SharedSRV &source,
support.vertexWriteFunction(area, size, area, size, mappedResource.pData, &stride, &drawCount,
&topology);
deviceContext->Unmap(mVertexBuffer.Get(), 0);
deviceContext->Unmap(mVertexBuffer.get(), 0);
// Set constant buffer
result = deviceContext->Map(mSwizzleCB.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
result = deviceContext->Map(mSwizzleCB.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (FAILED(result))
{
return gl::OutOfMemory() << "Failed to map internal constant buffer for swizzle, "
......@@ -1109,13 +1099,15 @@ gl::Error Blit11::swizzleTexture(const d3d11::SharedSRV &source,
swizzleIndices[2] = GetSwizzleIndex(swizzleTarget.swizzleBlue);
swizzleIndices[3] = GetSwizzleIndex(swizzleTarget.swizzleAlpha);
deviceContext->Unmap(mSwizzleCB.Get(), 0);
deviceContext->Unmap(mSwizzleCB.get(), 0);
// Apply vertex buffer
deviceContext->IASetVertexBuffers(0, 1, mVertexBuffer.GetAddressOf(), &stride, &startIdx);
ID3D11Buffer *vertexBuffer = mVertexBuffer.get();
deviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &startIdx);
// Apply constant buffer
deviceContext->PSSetConstantBuffers(0, 1, mSwizzleCB.GetAddressOf());
ID3D11Buffer *constantBuffer = mSwizzleCB.get();
deviceContext->PSSetConstantBuffers(0, 1, &constantBuffer);
// Apply state
deviceContext->OMSetBlendState(nullptr, nullptr, 0xFFFFFFF);
......@@ -1210,7 +1202,7 @@ gl::Error Blit11::copyTexture(const d3d11::SharedSRV &source,
// Set vertices
D3D11_MAPPED_SUBRESOURCE mappedResource;
result =
deviceContext->Map(mVertexBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
deviceContext->Map(mVertexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (FAILED(result))
{
return gl::OutOfMemory() << "Failed to map internal vertex buffer for texture copy, "
......@@ -1225,10 +1217,11 @@ gl::Error Blit11::copyTexture(const d3d11::SharedSRV &source,
support.vertexWriteFunction(sourceArea, sourceSize, destArea, destSize, mappedResource.pData,
&stride, &drawCount, &topology);
deviceContext->Unmap(mVertexBuffer.Get(), 0);
deviceContext->Unmap(mVertexBuffer.get(), 0);
// Apply vertex buffer
deviceContext->IASetVertexBuffers(0, 1, mVertexBuffer.GetAddressOf(), &stride, &startIdx);
ID3D11Buffer *vertexBuffer = mVertexBuffer.get();
deviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &startIdx);
// Apply state
if (maskOffAlpha)
......@@ -1349,7 +1342,7 @@ gl::Error Blit11::copyDepth(const d3d11::SharedSRV &source,
// Set vertices
D3D11_MAPPED_SUBRESOURCE mappedResource;
result =
deviceContext->Map(mVertexBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
deviceContext->Map(mVertexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (FAILED(result))
{
return gl::OutOfMemory() << "Failed to map internal vertex buffer for texture copy, "
......@@ -1364,10 +1357,11 @@ gl::Error Blit11::copyDepth(const d3d11::SharedSRV &source,
Write2DVertices(sourceArea, sourceSize, destArea, destSize, mappedResource.pData, &stride,
&drawCount, &topology);
deviceContext->Unmap(mVertexBuffer.Get(), 0);
deviceContext->Unmap(mVertexBuffer.get(), 0);
// Apply vertex buffer
deviceContext->IASetVertexBuffers(0, 1, mVertexBuffer.GetAddressOf(), &stride, &startIdx);
ID3D11Buffer *vertexBuffer = mVertexBuffer.get();
deviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &startIdx);
// Apply state
deviceContext->OMSetBlendState(nullptr, nullptr, 0xFFFFFFF);
......
......@@ -277,7 +277,7 @@ class Blit11 : angle::NonCopyable
std::map<SwizzleShaderType, Shader> mSwizzleShaderMap;
bool mResourcesInitialized;
angle::ComPtr<ID3D11Buffer> mVertexBuffer;
d3d11::Buffer mVertexBuffer;
angle::ComPtr<ID3D11SamplerState> mPointSampler;
angle::ComPtr<ID3D11SamplerState> mLinearSampler;
angle::ComPtr<ID3D11RasterizerState> mScissorEnabledRasterizerState;
......@@ -294,7 +294,7 @@ class Blit11 : angle::NonCopyable
d3d11::LazyBlendState mAlphaMaskBlendState;
angle::ComPtr<ID3D11Buffer> mSwizzleCB;
d3d11::Buffer mSwizzleCB;
d3d11::LazyShader<ID3D11VertexShader> mResolveDepthStencilVS;
d3d11::LazyShader<ID3D11PixelShader> mResolveDepthPS;
......
......@@ -148,7 +148,7 @@ class Buffer11::NativeStorage : public Buffer11::BufferStorage
bool isMappable(GLbitfield access) const override;
ID3D11Buffer *getNativeStorage() const { return mNativeStorage; }
const d3d11::Buffer &getBuffer() const { return mBuffer; }
gl::ErrorOrResult<CopyResult> copyFromStorage(BufferStorage *source,
size_t sourceOffset,
size_t size,
......@@ -170,7 +170,7 @@ class Buffer11::NativeStorage : public Buffer11::BufferStorage
unsigned int bufferSize);
void clearSRVs();
ID3D11Buffer *mNativeStorage;
d3d11::Buffer mBuffer;
const OnBufferDataDirtyChannel *mOnStorageChanged;
std::map<DXGI_FORMAT, d3d11::ShaderResourceView> mBufferResourceViews;
};
......@@ -186,7 +186,7 @@ class Buffer11::EmulatedIndexedStorage : public Buffer11::BufferStorage
bool isMappable(GLbitfield access) const override { return true; }
gl::ErrorOrResult<ID3D11Buffer *> getNativeStorage(SourceIndexData *indexInfo,
gl::ErrorOrResult<const d3d11::Buffer *> getBuffer(SourceIndexData *indexInfo,
const TranslatedAttribute &attribute,
GLint startVertex);
......@@ -204,7 +204,7 @@ class Buffer11::EmulatedIndexedStorage : public Buffer11::BufferStorage
void unmap() override;
private:
ID3D11Buffer *mNativeStorage; // contains expanded data for use by D3D
d3d11::Buffer mBuffer; // contains expanded data for use by D3D
angle::MemoryBuffer mMemoryBuffer; // original data (not expanded)
angle::MemoryBuffer mIndicesMemoryBuffer; // indices data
};
......@@ -608,7 +608,7 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::getBuffer(BufferUsage usage)
{
BufferStorage *storage = nullptr;
ANGLE_TRY_RESULT(getBufferStorage(usage), storage);
return GetAs<NativeStorage>(storage)->getNativeStorage();
return GetAs<NativeStorage>(storage)->getBuffer().get();
}
gl::ErrorOrResult<ID3D11Buffer *> Buffer11::getEmulatedIndexedBuffer(
......@@ -623,11 +623,10 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::getEmulatedIndexedBuffer(
EmulatedIndexedStorage *emulatedStorage = GetAs<EmulatedIndexedStorage>(untypedStorage);
ID3D11Buffer *nativeStorage = nullptr;
ANGLE_TRY_RESULT(emulatedStorage->getNativeStorage(indexInfo, attribute, startVertex),
nativeStorage);
const d3d11::Buffer *nativeStorage = nullptr;
ANGLE_TRY_RESULT(emulatedStorage->getBuffer(indexInfo, attribute, startVertex), nativeStorage);
return nativeStorage;
return nativeStorage->get();
}
gl::Error Buffer11::getConstantBufferRange(GLintptr offset,
......@@ -650,7 +649,7 @@ gl::Error Buffer11::getConstantBufferRange(GLintptr offset,
*numConstantsOut = 0;
}
*bufferOut = GetAs<NativeStorage>(bufferStorage)->getNativeStorage();
*bufferOut = GetAs<NativeStorage>(bufferStorage)->getBuffer().get();
return gl::NoError();
}
......@@ -941,13 +940,12 @@ gl::Error Buffer11::BufferStorage::setData(const uint8_t *data, size_t offset, s
Buffer11::NativeStorage::NativeStorage(Renderer11 *renderer,
BufferUsage usage,
const OnBufferDataDirtyChannel *onStorageChanged)
: BufferStorage(renderer, usage), mNativeStorage(nullptr), mOnStorageChanged(onStorageChanged)
: BufferStorage(renderer, usage), mBuffer(), mOnStorageChanged(onStorageChanged)
{
}
Buffer11::NativeStorage::~NativeStorage()
{
SafeRelease(mNativeStorage);
clearSRVs();
}
......@@ -971,7 +969,7 @@ gl::ErrorOrResult<CopyResult> Buffer11::NativeStorage::copyFromStorage(BufferSto
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
size_t requiredSize = destOffset + size;
bool createBuffer = !mNativeStorage || mBufferSize < requiredSize;
bool createBuffer = !mBuffer.valid() || mBufferSize < requiredSize;
// (Re)initialize D3D buffer if needed
bool preserveData = (destOffset > 0);
......@@ -1011,10 +1009,10 @@ gl::ErrorOrResult<CopyResult> Buffer11::NativeStorage::copyFromStorage(BufferSto
srcBox.front = 0;
srcBox.back = 1;
ID3D11Buffer *sourceBuffer = GetAs<NativeStorage>(source)->getNativeStorage();
const d3d11::Buffer *sourceBuffer = &GetAs<NativeStorage>(source)->getBuffer();
context->CopySubresourceRegion(mNativeStorage, 0, static_cast<unsigned int>(destOffset), 0,
0, sourceBuffer, 0, &srcBox);
context->CopySubresourceRegion(mBuffer.get(), 0, static_cast<unsigned int>(destOffset), 0,
0, sourceBuffer->get(), 0, &srcBox);
}
return createBuffer ? CopyResult::RECREATED : CopyResult::NOT_RECREATED;
......@@ -1022,24 +1020,16 @@ gl::ErrorOrResult<CopyResult> Buffer11::NativeStorage::copyFromStorage(BufferSto
gl::Error Buffer11::NativeStorage::resize(size_t size, bool preserveData)
{
ID3D11Device *device = mRenderer->getDevice();
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
D3D11_BUFFER_DESC bufferDesc;
FillBufferDesc(&bufferDesc, mRenderer, mUsage, static_cast<unsigned int>(size));
ID3D11Buffer *newBuffer;
HRESULT result = device->CreateBuffer(&bufferDesc, nullptr, &newBuffer);
d3d11::Buffer newBuffer;
ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &newBuffer));
newBuffer.setDebugName("Buffer11::NativeStorage");
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal buffer, result: 0x%X.",
result);
}
d3d11::SetDebugName(newBuffer, "Buffer11::NativeStorage");
if (mNativeStorage && preserveData)
if (mBuffer.valid() && preserveData)
{
// We don't call resize if the buffer is big enough already.
ASSERT(mBufferSize <= size);
......@@ -1052,12 +1042,11 @@ gl::Error Buffer11::NativeStorage::resize(size_t size, bool preserveData)
srcBox.front = 0;
srcBox.back = 1;
context->CopySubresourceRegion(newBuffer, 0, 0, 0, 0, mNativeStorage, 0, &srcBox);
context->CopySubresourceRegion(newBuffer.get(), 0, 0, 0, 0, mBuffer.get(), 0, &srcBox);
}
// No longer need the old buffer
SafeRelease(mNativeStorage);
mNativeStorage = newBuffer;
mBuffer = std::move(newBuffer);
mBufferSize = bufferDesc.ByteWidth;
......@@ -1155,7 +1144,7 @@ gl::Error Buffer11::NativeStorage::map(size_t offset,
D3D11_MAP d3dMapType = gl_d3d11::GetD3DMapTypeFromBits(mUsage, access);
UINT d3dMapFlag = ((access & GL_MAP_UNSYNCHRONIZED_BIT) != 0 ? D3D11_MAP_FLAG_DO_NOT_WAIT : 0);
HRESULT result = context->Map(mNativeStorage, 0, d3dMapType, d3dMapFlag, &mappedResource);
HRESULT result = context->Map(mBuffer.get(), 0, d3dMapType, d3dMapFlag, &mappedResource);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
......@@ -1171,7 +1160,7 @@ void Buffer11::NativeStorage::unmap()
{
ASSERT(isMappable(GL_MAP_WRITE_BIT) || isMappable(GL_MAP_READ_BIT));
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
context->Unmap(mNativeStorage, 0);
context->Unmap(mBuffer.get(), 0);
}
gl::ErrorOrResult<ID3D11ShaderResourceView *> Buffer11::NativeStorage::getSRVForFormat(
......@@ -1192,7 +1181,7 @@ gl::ErrorOrResult<ID3D11ShaderResourceView *> Buffer11::NativeStorage::getSRVFor
bufferSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
bufferSRVDesc.Format = srvFormat;
ANGLE_TRY(mRenderer->allocateResource(bufferSRVDesc, mNativeStorage,
ANGLE_TRY(mRenderer->allocateResource(bufferSRVDesc, mBuffer.get(),
&mBufferResourceViews[srvFormat]));
return mBufferResourceViews[srvFormat].get();
......@@ -1206,16 +1195,15 @@ void Buffer11::NativeStorage::clearSRVs()
// Buffer11::EmulatedIndexStorage implementation
Buffer11::EmulatedIndexedStorage::EmulatedIndexedStorage(Renderer11 *renderer)
: BufferStorage(renderer, BUFFER_USAGE_EMULATED_INDEXED_VERTEX), mNativeStorage(nullptr)
: BufferStorage(renderer, BUFFER_USAGE_EMULATED_INDEXED_VERTEX), mBuffer()
{
}
Buffer11::EmulatedIndexedStorage::~EmulatedIndexedStorage()
{
SafeRelease(mNativeStorage);
}
gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeStorage(
gl::ErrorOrResult<const d3d11::Buffer *> Buffer11::EmulatedIndexedStorage::getBuffer(
SourceIndexData *indexInfo,
const TranslatedAttribute &attribute,
GLint startVertex)
......@@ -1223,9 +1211,9 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeSto
// If a change in the indices applied from the last draw call is detected, then the emulated
// indexed buffer needs to be invalidated. After invalidation, the change detected flag should
// be cleared to avoid unnecessary recreation of the buffer.
if (mNativeStorage == nullptr || indexInfo->srcIndicesChanged)
if (!mBuffer.valid() || indexInfo->srcIndicesChanged)
{
SafeRelease(mNativeStorage);
mBuffer.reset();
// Copy the source index data. This ensures that the lifetime of the indices pointer
// stays with this storage until the next time we invalidate.
......@@ -1250,7 +1238,7 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeSto
{
return gl::Error(GL_OUT_OF_MEMORY,
"Error resizing index memory buffer in "
"Buffer11::EmulatedIndexedStorage::getNativeStorage");
"Buffer11::EmulatedIndexedStorage::getBuffer");
}
memcpy(mIndicesMemoryBuffer.data(), indexInfo->srcIndices, indicesDataSize);
......@@ -1258,7 +1246,7 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeSto
indexInfo->srcIndicesChanged = false;
}
if (!mNativeStorage)
if (!mBuffer.valid())
{
unsigned int offset = 0;
ANGLE_TRY_RESULT(attribute.computeOffset(startVertex), offset);
......@@ -1271,7 +1259,7 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeSto
{
return gl::Error(
GL_OUT_OF_MEMORY,
"Error resizing buffer in Buffer11::EmulatedIndexedStorage::getNativeStorage");
"Error resizing buffer in Buffer11::EmulatedIndexedStorage::getBuffer");
}
// Clear the contents of the allocated buffer
......@@ -1309,8 +1297,6 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeSto
// Finally, initialize the emulated indexed native storage object with the newly copied data
// and free the temporary buffers used.
ID3D11Device *device = mRenderer->getDevice();
D3D11_BUFFER_DESC bufferDesc;
bufferDesc.ByteWidth = expandedDataSize;
bufferDesc.MiscFlags = 0;
......@@ -1321,16 +1307,11 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeSto
D3D11_SUBRESOURCE_DATA subResourceData = {expandedData.data(), 0, 0};
HRESULT result = device->CreateBuffer(&bufferDesc, &subResourceData, &mNativeStorage);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Could not create emulated index data buffer: %08lX",
result);
}
d3d11::SetDebugName(mNativeStorage, "Buffer11::EmulatedIndexedStorage");
ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &subResourceData, &mBuffer));
mBuffer.setDebugName("Buffer11::EmulatedIndexedStorage");
}
return mNativeStorage;
return &mBuffer;
}
gl::ErrorOrResult<CopyResult> Buffer11::EmulatedIndexedStorage::copyFromStorage(
......
......@@ -154,8 +154,8 @@ Clear11::Clear11(Renderer11 *renderer)
mScissorEnabledRasterizerState(nullptr),
mScissorDisabledRasterizerState(nullptr),
mShaderManager(),
mConstantBuffer(nullptr),
mVertexBuffer(nullptr),
mConstantBuffer(),
mVertexBuffer(),
mShaderData({})
{
TRACE_EVENT0("gpu.angle", "Clear11::Clear11");
......@@ -173,55 +173,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;
......@@ -282,6 +233,75 @@ 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,
const gl::FramebufferState &fboData)
{
......@@ -619,12 +639,14 @@ 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))
{
......@@ -632,7 +654,7 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
}
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
......@@ -674,17 +696,19 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
deviceContext->VSSetShader(vs, nullptr, 0);
deviceContext->GSSetShader(nullptr, nullptr, 0);
deviceContext->PSSetShader(ps, nullptr, 0);
deviceContext->PSSetConstantBuffers(0, 1, mConstantBuffer.GetAddressOf());
ID3D11Buffer *constantBuffer = mConstantBuffer.get();
deviceContext->PSSetConstantBuffers(0, 1, &constantBuffer);
// Bind IL & VB if needed
deviceContext->IASetIndexBuffer(nullptr, DXGI_FORMAT_UNKNOWN, 0);
deviceContext->IASetInputLayout(il);
if (mVertexBuffer.Get())
if (useVertexBuffer())
{
ANGLE_TRY(ensureVertexBufferCreated());
const UINT offset = 0;
deviceContext->IASetVertexBuffers(0, 1, mVertexBuffer.GetAddressOf(), &g_VertexSize,
&offset);
ID3D11Buffer *vertexBuffer = mVertexBuffer.get();
deviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &g_VertexSize, &offset);
}
else
{
......
......@@ -64,6 +64,10 @@ class Clear11 : angle::NonCopyable
d3d11::LazyShader<ID3D11PixelShader> mPsSInt;
};
bool useVertexBuffer() const;
gl::Error ensureConstantBufferCreated();
gl::Error ensureVertexBufferCreated();
Renderer11 *mRenderer;
// States
......@@ -74,13 +78,13 @@ class Clear11 : angle::NonCopyable
// Shaders and shader resources
ShaderManager mShaderManager;
angle::ComPtr<ID3D11Buffer> mConstantBuffer;
angle::ComPtr<ID3D11Buffer> mVertexBuffer;
d3d11::Buffer mConstantBuffer;
d3d11::Buffer mVertexBuffer;
// Buffer data and draw parameters
RtvDsvClearInfo<float> mShaderData;
};
}
} // namespace rx
#endif // LIBANGLE_RENDERER_D3D_D3D11_CLEAR11_H_
......@@ -14,28 +14,23 @@
namespace rx
{
IndexBuffer11::IndexBuffer11(Renderer11 *const renderer) : mRenderer(renderer)
IndexBuffer11::IndexBuffer11(Renderer11 *const renderer)
: mRenderer(renderer), mBuffer(), mBufferSize(0), mIndexType(GL_NONE), mDynamicUsage(false)
{
mBuffer = nullptr;
mBufferSize = 0;
mDynamicUsage = false;
}
IndexBuffer11::~IndexBuffer11()
{
SafeRelease(mBuffer);
}
gl::Error IndexBuffer11::initialize(unsigned int bufferSize, GLenum indexType, bool dynamic)
{
SafeRelease(mBuffer);
mBuffer.reset();
updateSerial();
if (bufferSize > 0)
{
ID3D11Device* dxDevice = mRenderer->getDevice();
D3D11_BUFFER_DESC bufferDesc;
bufferDesc.ByteWidth = bufferSize;
bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
......@@ -44,19 +39,15 @@ gl::Error IndexBuffer11::initialize(unsigned int bufferSize, GLenum indexType, b
bufferDesc.MiscFlags = 0;
bufferDesc.StructureByteStride = 0;
HRESULT result = dxDevice->CreateBuffer(&bufferDesc, nullptr, &mBuffer);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal index buffer of size, %lu.", bufferSize);
}
ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &mBuffer));
if (dynamic)
{
d3d11::SetDebugName(mBuffer, "IndexBuffer11 (dynamic)");
mBuffer.setDebugName("IndexBuffer11 (dynamic)");
}
else
{
d3d11::SetDebugName(mBuffer, "IndexBuffer11 (static)");
mBuffer.setDebugName("IndexBuffer11 (static)");
}
}
......@@ -69,7 +60,7 @@ gl::Error IndexBuffer11::initialize(unsigned int bufferSize, GLenum indexType, b
gl::Error IndexBuffer11::mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory)
{
if (!mBuffer)
if (!mBuffer.valid())
{
return gl::Error(GL_OUT_OF_MEMORY, "Internal index buffer is not initialized.");
}
......@@ -83,7 +74,8 @@ gl::Error IndexBuffer11::mapBuffer(unsigned int offset, unsigned int size, void*
ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
D3D11_MAPPED_SUBRESOURCE mappedResource;
HRESULT result = dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource);
HRESULT result =
dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to map internal index buffer, HRESULT: 0x%08x.", result);
......@@ -95,13 +87,13 @@ gl::Error IndexBuffer11::mapBuffer(unsigned int offset, unsigned int size, void*
gl::Error IndexBuffer11::unmapBuffer()
{
if (!mBuffer)
if (!mBuffer.valid())
{
return gl::Error(GL_OUT_OF_MEMORY, "Internal index buffer is not initialized.");
}
ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
dxContext->Unmap(mBuffer, 0);
dxContext->Unmap(mBuffer.get(), 0);
return gl::NoError();
}
......@@ -129,7 +121,7 @@ gl::Error IndexBuffer11::setSize(unsigned int bufferSize, GLenum indexType)
gl::Error IndexBuffer11::discard()
{
if (!mBuffer)
if (!mBuffer.valid())
{
return gl::Error(GL_OUT_OF_MEMORY, "Internal index buffer is not initialized.");
}
......@@ -137,13 +129,13 @@ gl::Error IndexBuffer11::discard()
ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
D3D11_MAPPED_SUBRESOURCE mappedResource;
HRESULT result = dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
HRESULT result = dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to map internal index buffer, HRESULT: 0x%08x.", result);
}
dxContext->Unmap(mBuffer, 0);
dxContext->Unmap(mBuffer.get(), 0);
return gl::NoError();
}
......@@ -159,9 +151,9 @@ DXGI_FORMAT IndexBuffer11::getIndexFormat() const
}
}
ID3D11Buffer *IndexBuffer11::getBuffer() const
const d3d11::Buffer &IndexBuffer11::getBuffer() const
{
return mBuffer;
}
}
} // namespace rx
......@@ -10,6 +10,7 @@
#define LIBANGLE_RENDERER_D3D_D3D11_INDEXBUFFER11_H_
#include "libANGLE/renderer/d3d/IndexBuffer.h"
#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
namespace rx
{
......@@ -33,17 +34,17 @@ class IndexBuffer11 : public IndexBuffer
virtual gl::Error discard();
DXGI_FORMAT getIndexFormat() const;
ID3D11Buffer *getBuffer() const;
const d3d11::Buffer &getBuffer() const;
private:
Renderer11 *const mRenderer;
ID3D11Buffer *mBuffer;
d3d11::Buffer mBuffer;
unsigned int mBufferSize;
GLenum mIndexType;
bool mDynamicUsage;
};
}
} // namespace rx
#endif // LIBANGLE_RENDERER_D3D_D3D11_INDEXBUFFER11_H_
......@@ -173,8 +173,8 @@ bool InputLayoutCache::PackedAttributeLayout::operator<(const PackedAttributeLay
InputLayoutCache::InputLayoutCache()
: mCurrentIL(angle::DirtyPointer),
mPointSpriteVertexBuffer(nullptr),
mPointSpriteIndexBuffer(nullptr),
mPointSpriteVertexBuffer(),
mPointSpriteIndexBuffer(),
mCacheSize(kDefaultCacheSize)
{
mCurrentBuffers.fill(nullptr);
......@@ -200,8 +200,8 @@ void InputLayoutCache::clear()
SafeRelease(layout.second);
}
mLayoutMap.clear();
SafeRelease(mPointSpriteVertexBuffer);
SafeRelease(mPointSpriteIndexBuffer);
mPointSpriteVertexBuffer.reset();
mPointSpriteIndexBuffer.reset();
markDirty();
}
......@@ -227,7 +227,6 @@ gl::Error InputLayoutCache::applyVertexBuffers(
GLsizei numIndicesPerInstance)
{
ID3D11DeviceContext *deviceContext = renderer->getDeviceContext();
ID3D11Device *device = renderer->getDevice();
gl::Program *program = state.getProgram();
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
......@@ -285,7 +284,7 @@ gl::Error InputLayoutCache::applyVertexBuffers(
if (bufferStorage == nullptr)
{
ASSERT(attrib.vertexBuffer.get());
buffer = GetAs<VertexBuffer11>(attrib.vertexBuffer.get())->getBuffer();
buffer = GetAs<VertexBuffer11>(attrib.vertexBuffer.get())->getBuffer().get();
}
else if (instancedPointSpritesActive && (indexInfo != nullptr))
{
......@@ -342,7 +341,7 @@ gl::Error InputLayoutCache::applyVertexBuffers(
{
const UINT pointSpriteVertexStride = sizeof(float) * 5;
if (!mPointSpriteVertexBuffer)
if (!mPointSpriteVertexBuffer.valid())
{
static const float pointSpriteVertices[] =
{
......@@ -364,15 +363,11 @@ gl::Error InputLayoutCache::applyVertexBuffers(
vertexBufferDesc.MiscFlags = 0;
vertexBufferDesc.StructureByteStride = 0;
HRESULT result = device->CreateBuffer(&vertexBufferDesc, &vertexBufferData,
&mPointSpriteVertexBuffer);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create instanced pointsprite emulation vertex buffer, HRESULT: 0x%08x", result);
}
ANGLE_TRY(renderer->allocateResource(vertexBufferDesc, &vertexBufferData,
&mPointSpriteVertexBuffer));
}
mCurrentBuffers[0] = mPointSpriteVertexBuffer;
mCurrentBuffers[0] = mPointSpriteVertexBuffer.get();
// Set the stride to 0 if GL_POINTS mode is not being used to instruct the driver to avoid
// indexing into the vertex buffer.
mCurrentVertexStrides[0] = instancedPointSpritesActive ? pointSpriteVertexStride : 0;
......@@ -383,7 +378,7 @@ gl::Error InputLayoutCache::applyVertexBuffers(
minDiff = 0;
maxDiff = std::max(maxDiff, static_cast<size_t>(0));
if (!mPointSpriteIndexBuffer)
if (!mPointSpriteIndexBuffer.valid())
{
// Create an index buffer and set it for pointsprite rendering
static const unsigned short pointSpriteIndices[] =
......@@ -400,13 +395,8 @@ gl::Error InputLayoutCache::applyVertexBuffers(
indexBufferDesc.MiscFlags = 0;
indexBufferDesc.StructureByteStride = 0;
HRESULT result =
device->CreateBuffer(&indexBufferDesc, &indexBufferData, &mPointSpriteIndexBuffer);
if (FAILED(result))
{
SafeRelease(mPointSpriteVertexBuffer);
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create instanced pointsprite emulation index buffer, HRESULT: 0x%08x", result);
}
ANGLE_TRY(renderer->allocateResource(indexBufferDesc, &indexBufferData,
&mPointSpriteIndexBuffer));
}
if (instancedPointSpritesActive)
......@@ -415,7 +405,7 @@ gl::Error InputLayoutCache::applyVertexBuffers(
// non-indexed rendering path in ANGLE (DrawArrays). This means that applyIndexBuffer()
// on the renderer will not be called and setting this buffer here ensures that the
// rendering path will contain the correct index buffers.
deviceContext->IASetIndexBuffer(mPointSpriteIndexBuffer, DXGI_FORMAT_R16_UINT, 0);
deviceContext->IASetIndexBuffer(mPointSpriteIndexBuffer.get(), DXGI_FORMAT_R16_UINT, 0);
}
}
......
......@@ -22,6 +22,7 @@
#include "libANGLE/Error.h"
#include "libANGLE/formatutils.h"
#include "libANGLE/renderer/d3d/RendererD3D.h"
#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
namespace gl
{
......@@ -110,8 +111,8 @@ class InputLayoutCache : angle::NonCopyable
std::array<UINT, gl::MAX_VERTEX_ATTRIBS> mCurrentVertexOffsets;
std::vector<const TranslatedAttribute *> mCurrentAttributes;
ID3D11Buffer *mPointSpriteVertexBuffer;
ID3D11Buffer *mPointSpriteIndexBuffer;
d3d11::Buffer mPointSpriteVertexBuffer;
d3d11::Buffer mPointSpriteIndexBuffer;
unsigned int mCacheSize;
};
......
......@@ -38,7 +38,7 @@ PixelTransfer11::PixelTransfer11(Renderer11 *renderer)
mResourcesLoaded(false),
mBufferToTextureVS(nullptr),
mBufferToTextureGS(nullptr),
mParamsConstantBuffer(nullptr),
mParamsConstantBuffer(),
mCopyRasterizerState(nullptr),
mCopyDepthStencilState(nullptr)
{
......@@ -55,7 +55,6 @@ PixelTransfer11::~PixelTransfer11()
SafeRelease(mBufferToTextureVS);
SafeRelease(mBufferToTextureGS);
SafeRelease(mParamsConstantBuffer);
SafeRelease(mCopyRasterizerState);
SafeRelease(mCopyDepthStencilState);
}
......@@ -120,13 +119,8 @@ gl::Error PixelTransfer11::loadResources()
constantBufferDesc.MiscFlags = 0;
constantBufferDesc.StructureByteStride = 0;
result = device->CreateBuffer(&constantBufferDesc, nullptr, &mParamsConstantBuffer);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal pixel transfer constant buffer, result: 0x%X.", result);
}
d3d11::SetDebugName(mParamsConstantBuffer, "PixelTransfer11 constant buffer");
ANGLE_TRY(mRenderer->allocateResource(constantBufferDesc, &mParamsConstantBuffer));
mParamsConstantBuffer.setDebugName("PixelTransfer11 constant buffer");
// init shaders
mBufferToTextureVS = d3d11::CompileVS(device, g_VS_BufferToTexture, "BufferToTexture VS");
......@@ -239,11 +233,12 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac
if (!StructEquals(mParamsData, shaderParams))
{
d3d11::SetBufferData(deviceContext, mParamsConstantBuffer, shaderParams);
d3d11::SetBufferData(deviceContext, mParamsConstantBuffer.get(), shaderParams);
mParamsData = shaderParams;
}
deviceContext->VSSetConstantBuffers(0, 1, &mParamsConstantBuffer);
ID3D11Buffer *paramsBuffer = mParamsConstantBuffer.get();
deviceContext->VSSetConstantBuffers(0, 1, &paramsBuffer);
// Set the viewport
D3D11_VIEWPORT viewport;
......
......@@ -11,14 +11,14 @@
#ifndef LIBANGLE_RENDERER_D3D_D3D11_PIXELTRANSFER11_H_
#define LIBANGLE_RENDERER_D3D_D3D11_PIXELTRANSFER11_H_
#include "libANGLE/Error.h"
#include "common/platform.h"
#include <GLES2/gl2.h>
#include <map>
#include "common/platform.h"
#include "libANGLE/Error.h"
#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
namespace gl
{
......@@ -76,7 +76,7 @@ class PixelTransfer11
std::map<GLenum, ID3D11PixelShader *> mBufferToTexturePSMap;
ID3D11VertexShader *mBufferToTextureVS;
ID3D11GeometryShader *mBufferToTextureGS;
ID3D11Buffer *mParamsConstantBuffer;
d3d11::Buffer mParamsConstantBuffer;
CopyShaderParams mParamsData;
ID3D11RasterizerState *mCopyRasterizerState;
......
......@@ -424,10 +424,6 @@ Renderer11::Renderer11(egl::Display *display)
mDxgiAdapter = nullptr;
mDxgiFactory = nullptr;
mDriverConstantBufferVS = nullptr;
mDriverConstantBufferPS = nullptr;
mDriverConstantBufferCS = nullptr;
mAppliedVertexShader = angle::DirtyPointer;
mAppliedGeometryShader = angle::DirtyPointer;
mAppliedPixelShader = angle::DirtyPointer;
......@@ -1852,7 +1848,7 @@ gl::Error Renderer11::applyIndexBuffer(const gl::ContextState &data,
else
{
IndexBuffer11 *indexBuffer = GetAs<IndexBuffer11>(indexInfo->indexBuffer);
buffer = indexBuffer->getBuffer();
buffer = indexBuffer->getBuffer().get();
}
mAppliedIBChanged = false;
......@@ -2302,14 +2298,14 @@ gl::Error Renderer11::drawLineLoop(const gl::ContextState &data,
ANGLE_TRY(mLineLoopIB->unmapBuffer());
IndexBuffer11 *indexBuffer = GetAs<IndexBuffer11>(mLineLoopIB->getIndexBuffer());
ID3D11Buffer *d3dIndexBuffer = indexBuffer->getBuffer();
const d3d11::Buffer &d3dIndexBuffer = indexBuffer->getBuffer();
DXGI_FORMAT indexFormat = indexBuffer->getIndexFormat();
if (mAppliedIB != d3dIndexBuffer || mAppliedIBFormat != indexFormat ||
if (mAppliedIB != d3dIndexBuffer.get() || mAppliedIBFormat != indexFormat ||
mAppliedIBOffset != offset)
{
mDeviceContext->IASetIndexBuffer(d3dIndexBuffer, indexFormat, offset);
mAppliedIB = d3dIndexBuffer;
mDeviceContext->IASetIndexBuffer(d3dIndexBuffer.get(), indexFormat, offset);
mAppliedIB = d3dIndexBuffer.get();
mAppliedIBFormat = indexFormat;
mAppliedIBOffset = offset;
}
......@@ -2392,14 +2388,14 @@ gl::Error Renderer11::drawTriangleFan(const gl::ContextState &data,
ANGLE_TRY(mTriangleFanIB->unmapBuffer());
IndexBuffer11 *indexBuffer = GetAs<IndexBuffer11>(mTriangleFanIB->getIndexBuffer());
ID3D11Buffer *d3dIndexBuffer = indexBuffer->getBuffer();
const d3d11::Buffer &d3dIndexBuffer = indexBuffer->getBuffer();
DXGI_FORMAT indexFormat = indexBuffer->getIndexFormat();
if (mAppliedIB != d3dIndexBuffer || mAppliedIBFormat != indexFormat ||
if (mAppliedIB != d3dIndexBuffer.get() || mAppliedIBFormat != indexFormat ||
mAppliedIBOffset != offset)
{
mDeviceContext->IASetIndexBuffer(d3dIndexBuffer, indexFormat, offset);
mAppliedIB = d3dIndexBuffer;
mDeviceContext->IASetIndexBuffer(d3dIndexBuffer.get(), indexFormat, offset);
mAppliedIB = d3dIndexBuffer.get();
mAppliedIBFormat = indexFormat;
mAppliedIBOffset = offset;
}
......@@ -2520,15 +2516,17 @@ gl::Error Renderer11::applyUniforms(const ProgramD3D &programD3D,
}
}
const UniformStorage11 *vertexUniformStorage =
UniformStorage11 *vertexUniformStorage =
GetAs<UniformStorage11>(&programD3D.getVertexUniformStorage());
const UniformStorage11 *fragmentUniformStorage =
UniformStorage11 *fragmentUniformStorage =
GetAs<UniformStorage11>(&programD3D.getFragmentUniformStorage());
ASSERT(vertexUniformStorage);
ASSERT(fragmentUniformStorage);
ID3D11Buffer *vertexConstantBuffer = vertexUniformStorage->getConstantBuffer();
ID3D11Buffer *pixelConstantBuffer = fragmentUniformStorage->getConstantBuffer();
const d3d11::Buffer *vertexConstantBuffer = nullptr;
ANGLE_TRY(vertexUniformStorage->getConstantBuffer(this, &vertexConstantBuffer));
const d3d11::Buffer *pixelConstantBuffer = nullptr;
ANGLE_TRY(fragmentUniformStorage->getConstantBuffer(this, &pixelConstantBuffer));
float(*mapVS)[4] = nullptr;
float(*mapPS)[4] = nullptr;
......@@ -2537,7 +2535,7 @@ gl::Error Renderer11::applyUniforms(const ProgramD3D &programD3D,
{
D3D11_MAPPED_SUBRESOURCE map = {0};
HRESULT result =
mDeviceContext->Map(vertexConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
mDeviceContext->Map(vertexConstantBuffer->get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
ASSERT(SUCCEEDED(result));
mapVS = (float(*)[4])map.pData;
}
......@@ -2546,7 +2544,7 @@ gl::Error Renderer11::applyUniforms(const ProgramD3D &programD3D,
{
D3D11_MAPPED_SUBRESOURCE map = {0};
HRESULT result =
mDeviceContext->Map(pixelConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
mDeviceContext->Map(pixelConstantBuffer->get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
ASSERT(SUCCEEDED(result));
mapPS = (float(*)[4])map.pData;
}
......@@ -2576,62 +2574,53 @@ gl::Error Renderer11::applyUniforms(const ProgramD3D &programD3D,
if (mapVS)
{
mDeviceContext->Unmap(vertexConstantBuffer, 0);
mDeviceContext->Unmap(vertexConstantBuffer->get(), 0);
}
if (mapPS)
{
mDeviceContext->Unmap(pixelConstantBuffer, 0);
mDeviceContext->Unmap(pixelConstantBuffer->get(), 0);
}
if (mCurrentVertexConstantBuffer != vertexConstantBuffer)
ID3D11Buffer *appliedVertexConstants = vertexConstantBuffer->get();
if (mCurrentVertexConstantBuffer != reinterpret_cast<uintptr_t>(appliedVertexConstants))
{
mDeviceContext->VSSetConstantBuffers(
d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK, 1, &vertexConstantBuffer);
mCurrentVertexConstantBuffer = vertexConstantBuffer;
d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK, 1, &appliedVertexConstants);
mCurrentVertexConstantBuffer = reinterpret_cast<uintptr_t>(appliedVertexConstants);
}
if (mCurrentPixelConstantBuffer != pixelConstantBuffer)
ID3D11Buffer *appliedPixelConstants = pixelConstantBuffer->get();
if (mCurrentPixelConstantBuffer != reinterpret_cast<uintptr_t>(appliedPixelConstants))
{
mDeviceContext->PSSetConstantBuffers(
d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK, 1, &pixelConstantBuffer);
mCurrentPixelConstantBuffer = pixelConstantBuffer;
d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK, 1, &appliedPixelConstants);
mCurrentPixelConstantBuffer = reinterpret_cast<uintptr_t>(appliedPixelConstants);
}
if (!mDriverConstantBufferVS)
if (!mDriverConstantBufferVS.valid())
{
D3D11_BUFFER_DESC constantBufferDescription = {0};
d3d11::InitConstantBufferDesc(
&constantBufferDescription,
sizeof(dx_VertexConstants11) + mSamplerMetadataVS.sizeBytes());
HRESULT result =
mDevice->CreateBuffer(&constantBufferDescription, nullptr, &mDriverConstantBufferVS);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY,
"Failed to create vertex shader constant buffer, result: 0x%X.",
result);
}
ANGLE_TRY(allocateResource(constantBufferDescription, &mDriverConstantBufferVS));
ID3D11Buffer *driverVSConstants = mDriverConstantBufferVS.get();
mDeviceContext->VSSetConstantBuffers(d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER, 1,
&mDriverConstantBufferVS);
&driverVSConstants);
}
if (!mDriverConstantBufferPS)
if (!mDriverConstantBufferPS.valid())
{
D3D11_BUFFER_DESC constantBufferDescription = {0};
d3d11::InitConstantBufferDesc(&constantBufferDescription,
sizeof(dx_PixelConstants11) + mSamplerMetadataPS.sizeBytes());
HRESULT result =
mDevice->CreateBuffer(&constantBufferDescription, nullptr, &mDriverConstantBufferPS);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY,
"Failed to create pixel shader constant buffer, result: 0x%X.",
result);
}
ANGLE_TRY(allocateResource(constantBufferDescription, &mDriverConstantBufferPS));
ID3D11Buffer *driverVSConstants = mDriverConstantBufferPS.get();
mDeviceContext->PSSetConstantBuffers(d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER, 1,
&mDriverConstantBufferPS);
&driverVSConstants);
}
// Sampler metadata and driver constants need to coexist in the same constant buffer to conserve
......@@ -2652,11 +2641,12 @@ gl::Error Renderer11::applyUniforms(const ProgramD3D &programD3D,
if (programD3D.usesGeometryShader(drawMode))
{
// needed for the point sprite geometry shader
if (mCurrentGeometryConstantBuffer != mDriverConstantBufferPS)
ID3D11Buffer *appliedGeometryConstants = mDriverConstantBufferPS.get();
if (mCurrentGeometryConstantBuffer != reinterpret_cast<uintptr_t>(appliedGeometryConstants))
{
ASSERT(mDriverConstantBufferPS != nullptr);
mDeviceContext->GSSetConstantBuffers(0, 1, &mDriverConstantBufferPS);
mCurrentGeometryConstantBuffer = mDriverConstantBufferPS;
ASSERT(mDriverConstantBufferPS.valid());
mDeviceContext->GSSetConstantBuffers(0, 1, &appliedGeometryConstants);
mCurrentGeometryConstantBuffer = reinterpret_cast<uintptr_t>(appliedGeometryConstants);
}
}
......@@ -2773,24 +2763,24 @@ void Renderer11::applyDriverConstantsIfNeeded(TShaderConstants *appliedConstants
const TShaderConstants &constants,
SamplerMetadataD3D11 *samplerMetadata,
size_t samplerMetadataReferencedBytes,
ID3D11Buffer *driverConstantBuffer)
const d3d11::Buffer &driverConstantBuffer)
{
ASSERT(driverConstantBuffer != nullptr);
ASSERT(driverConstantBuffer.valid());
if (memcmp(appliedConstants, &constants, sizeof(TShaderConstants)) != 0 ||
samplerMetadata->isDirty())
{
memcpy(appliedConstants, &constants, sizeof(TShaderConstants));
D3D11_MAPPED_SUBRESOURCE mapping = {0};
HRESULT result =
mDeviceContext->Map(driverConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapping);
HRESULT result = mDeviceContext->Map(driverConstantBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD,
0, &mapping);
ASSERT(SUCCEEDED(result));
memcpy(mapping.pData, appliedConstants, sizeof(TShaderConstants));
// Previous buffer contents were discarded, so we need to refresh also the area of the
// buffer that isn't used by this program.
memcpy(&reinterpret_cast<uint8_t *>(mapping.pData)[sizeof(TShaderConstants)],
samplerMetadata->getData(), samplerMetadata->sizeBytes());
mDeviceContext->Unmap(driverConstantBuffer, 0);
mDeviceContext->Unmap(driverConstantBuffer.get(), 0);
samplerMetadata->markClean();
}
......@@ -2801,19 +2791,19 @@ template void Renderer11::applyDriverConstantsIfNeeded<dx_VertexConstants11>(
const dx_VertexConstants11 &constants,
SamplerMetadataD3D11 *samplerMetadata,
size_t samplerMetadataReferencedBytes,
ID3D11Buffer *driverConstantBuffer);
const d3d11::Buffer &driverConstantBuffer);
template void Renderer11::applyDriverConstantsIfNeeded<dx_PixelConstants11>(
dx_PixelConstants11 *appliedConstants,
const dx_PixelConstants11 &constants,
SamplerMetadataD3D11 *samplerMetadata,
size_t samplerMetadataReferencedBytes,
ID3D11Buffer *driverConstantBuffer);
const d3d11::Buffer &driverConstantBuffer);
template void Renderer11::applyDriverConstantsIfNeeded<dx_ComputeConstants11>(
dx_ComputeConstants11 *appliedConstants,
const dx_ComputeConstants11 &constants,
SamplerMetadataD3D11 *samplerMetadata,
size_t samplerMetadataReferencedBytes,
ID3D11Buffer *driverConstantBuffer);
const d3d11::Buffer &driverConstantBuffer);
void Renderer11::markAllStateDirty()
{
......@@ -2862,10 +2852,10 @@ void Renderer11::markAllStateDirty()
mCurrentConstantBufferPSSize[i] = 0;
}
mCurrentVertexConstantBuffer = nullptr;
mCurrentPixelConstantBuffer = nullptr;
mCurrentGeometryConstantBuffer = nullptr;
mCurrentComputeConstantBuffer = nullptr;
mCurrentVertexConstantBuffer = angle::DirtyPointer;
mCurrentPixelConstantBuffer = angle::DirtyPointer;
mCurrentGeometryConstantBuffer = angle::DirtyPointer;
mCurrentComputeConstantBuffer = angle::DirtyPointer;
mCurrentPrimitiveTopology = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED;
}
......@@ -2885,9 +2875,9 @@ void Renderer11::releaseDeviceResources()
SafeDelete(mTrim);
SafeDelete(mPixelTransfer);
SafeRelease(mDriverConstantBufferVS);
SafeRelease(mDriverConstantBufferPS);
SafeRelease(mDriverConstantBufferCS);
mDriverConstantBufferVS.reset();
mDriverConstantBufferPS.reset();
mDriverConstantBufferCS.reset();
SafeRelease(mSyncQuery);
}
......@@ -3868,7 +3858,7 @@ gl::Error Renderer11::ensureHLSLCompilerInitialized()
UniformStorageD3D *Renderer11::createUniformStorage(size_t storageSize)
{
return new UniformStorage11(this, storageSize);
return new UniformStorage11(storageSize);
}
VertexBuffer *Renderer11::createVertexBuffer()
......@@ -4878,11 +4868,14 @@ gl::Error Renderer11::applyComputeUniforms(const ProgramD3D &programD3D,
}
}
const UniformStorage11 *computeUniformStorage =
UniformStorage11 *computeUniformStorage =
GetAs<UniformStorage11>(&programD3D.getComputeUniformStorage());
ASSERT(computeUniformStorage);
ID3D11Buffer *computeConstantBuffer = computeUniformStorage->getConstantBuffer();
const d3d11::Buffer *computeConstantBufferObj = nullptr;
ANGLE_TRY(computeUniformStorage->getConstantBuffer(this, &computeConstantBufferObj));
ID3D11Buffer *computeConstantBuffer = computeConstantBufferObj->get();
if (totalRegisterCountCS > 0 && computeUniformsDirty)
{
......@@ -4910,29 +4903,23 @@ gl::Error Renderer11::applyComputeUniforms(const ProgramD3D &programD3D,
mDeviceContext->Unmap(computeConstantBuffer, 0);
}
if (mCurrentComputeConstantBuffer != computeConstantBuffer)
if (mCurrentComputeConstantBuffer != reinterpret_cast<uintptr_t>(computeConstantBuffer))
{
mDeviceContext->CSSetConstantBuffers(
d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK, 1, &computeConstantBuffer);
mCurrentComputeConstantBuffer = computeConstantBuffer;
mCurrentComputeConstantBuffer = reinterpret_cast<uintptr_t>(computeConstantBuffer);
}
if (!mDriverConstantBufferCS)
if (!mDriverConstantBufferCS.valid())
{
D3D11_BUFFER_DESC constantBufferDescription = {0};
d3d11::InitConstantBufferDesc(
&constantBufferDescription,
sizeof(dx_ComputeConstants11) + mSamplerMetadataCS.sizeBytes());
HRESULT result =
mDevice->CreateBuffer(&constantBufferDescription, nullptr, &mDriverConstantBufferCS);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
return gl::OutOfMemory()
<< "Failed to create compute shader constant buffer, " << result;
}
ANGLE_TRY(allocateResource(constantBufferDescription, &mDriverConstantBufferCS));
ID3D11Buffer *buffer = mDriverConstantBufferCS.get();
mDeviceContext->CSSetConstantBuffers(d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER, 1,
&mDriverConstantBufferCS);
&buffer);
}
const dx_ComputeConstants11 &computeConstants = mStateManager.getComputeConstants();
......
......@@ -541,7 +541,7 @@ class Renderer11 : public RendererD3D
const TShaderConstants &constants,
SamplerMetadataD3D11 *samplerMetadata,
size_t samplerMetadataReferencedBytes,
ID3D11Buffer *driverConstantBuffer);
const d3d11::Buffer &driverConstantBuffer);
gl::Error copyImageInternal(const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
......@@ -603,27 +603,27 @@ class Renderer11 : public RendererD3D
uintptr_t mAppliedComputeShader;
dx_VertexConstants11 mAppliedVertexConstants;
ID3D11Buffer *mDriverConstantBufferVS;
d3d11::Buffer mDriverConstantBufferVS;
SamplerMetadataD3D11 mSamplerMetadataVS;
ID3D11Buffer *mCurrentVertexConstantBuffer;
uintptr_t mCurrentVertexConstantBuffer;
unsigned int mCurrentConstantBufferVS[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS];
GLintptr mCurrentConstantBufferVSOffset[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS];
GLsizeiptr mCurrentConstantBufferVSSize[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS];
dx_PixelConstants11 mAppliedPixelConstants;
ID3D11Buffer *mDriverConstantBufferPS;
d3d11::Buffer mDriverConstantBufferPS;
SamplerMetadataD3D11 mSamplerMetadataPS;
ID3D11Buffer *mCurrentPixelConstantBuffer;
uintptr_t mCurrentPixelConstantBuffer;
unsigned int mCurrentConstantBufferPS[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS];
GLintptr mCurrentConstantBufferPSOffset[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS];
GLsizeiptr mCurrentConstantBufferPSSize[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS];
dx_ComputeConstants11 mAppliedComputeConstants;
ID3D11Buffer *mDriverConstantBufferCS;
d3d11::Buffer mDriverConstantBufferCS;
SamplerMetadataD3D11 mSamplerMetadataCS;
ID3D11Buffer *mCurrentComputeConstantBuffer;
uintptr_t mCurrentComputeConstantBuffer;
ID3D11Buffer *mCurrentGeometryConstantBuffer;
uintptr_t mCurrentGeometryConstantBuffer;
// Vertex, index and input layouts
VertexDataManager *mVertexDataManager;
......
......@@ -51,6 +51,12 @@ size_t ComputeMemoryUsage(const D3D11_TEXTURE3D_DESC *desc)
desc->MipLevels);
}
size_t ComputeMemoryUsage(const D3D11_BUFFER_DESC *desc)
{
ASSERT(desc);
return static_cast<size_t>(desc->ByteWidth);
}
template <typename T>
size_t ComputeMemoryUsage(const T *desc)
{
......@@ -74,6 +80,8 @@ size_t ComputeGenericMemoryUsage(ResourceType resourceType, ID3D11DeviceChild *r
return ComputeGenericMemoryUsage<ResourceType::Texture2D>(resource);
case ResourceType::Texture3D:
return ComputeGenericMemoryUsage<ResourceType::Texture3D>(resource);
case ResourceType::Buffer:
return ComputeGenericMemoryUsage<ResourceType::Buffer>(resource);
default:
return 0;
......@@ -81,6 +89,14 @@ size_t ComputeGenericMemoryUsage(ResourceType resourceType, ID3D11DeviceChild *r
}
HRESULT CreateResource(ID3D11Device *device,
const D3D11_BUFFER_DESC *desc,
const D3D11_SUBRESOURCE_DATA *initData,
ID3D11Buffer **buffer)
{
return device->CreateBuffer(desc, initData, buffer);
}
HRESULT CreateResource(ID3D11Device *device,
const D3D11_DEPTH_STENCIL_VIEW_DESC *desc,
ID3D11Resource *resource,
ID3D11DepthStencilView **resourceOut)
......
......@@ -26,6 +26,7 @@ class TextureHelper11;
// Format: ResourceType, D3D11 type, DESC type, init data type.
#define ANGLE_RESOURCE_TYPE_OP(NAME, OP) \
OP(NAME, Buffer, ID3D11Buffer, D3D11_BUFFER_DESC, const D3D11_SUBRESOURCE_DATA) \
OP(NAME, DepthStencilView, ID3D11DepthStencilView, D3D11_DEPTH_STENCIL_VIEW_DESC, \
ID3D11Resource) \
OP(NAME, RenderTargetView, ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC, \
......
......@@ -89,30 +89,33 @@ ID3D11ComputeShader *ShaderExecutable11::getComputeShader() const
return mComputeExecutable;
}
UniformStorage11::UniformStorage11(Renderer11 *renderer, size_t initialSize)
: UniformStorageD3D(initialSize), mConstantBuffer(nullptr)
UniformStorage11::UniformStorage11(size_t initialSize)
: UniformStorageD3D(initialSize), mConstantBuffer()
{
ID3D11Device *d3d11Device = renderer->getDevice();
}
UniformStorage11::~UniformStorage11()
{
}
if (initialSize > 0)
gl::Error UniformStorage11::getConstantBuffer(Renderer11 *renderer, const d3d11::Buffer **bufferOut)
{
if (size() > 0 && !mConstantBuffer.valid())
{
D3D11_BUFFER_DESC constantBufferDescription = {0};
constantBufferDescription.ByteWidth = static_cast<unsigned int>(initialSize);
constantBufferDescription.ByteWidth = static_cast<unsigned int>(size());
constantBufferDescription.Usage = D3D11_USAGE_DYNAMIC;
constantBufferDescription.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
constantBufferDescription.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
constantBufferDescription.MiscFlags = 0;
constantBufferDescription.StructureByteStride = 0;
HRESULT result =
d3d11Device->CreateBuffer(&constantBufferDescription, nullptr, &mConstantBuffer);
ASSERT(SUCCEEDED(result));
ANGLE_TRY(renderer->allocateResource(constantBufferDescription, &mConstantBuffer));
}
}
UniformStorage11::~UniformStorage11()
{
SafeRelease(mConstantBuffer);
*bufferOut = &mConstantBuffer;
return gl::NoError();
}
}
} // namespace rx
......@@ -11,6 +11,7 @@
#define LIBANGLE_RENDERER_D3D_D3D11_SHADEREXECUTABLE11_H_
#include "libANGLE/renderer/d3d/ShaderExecutableD3D.h"
#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
namespace rx
{
......@@ -44,15 +45,15 @@ class ShaderExecutable11 : public ShaderExecutableD3D
class UniformStorage11 : public UniformStorageD3D
{
public:
UniformStorage11(Renderer11 *renderer, size_t initialSize);
UniformStorage11(size_t initialSize);
virtual ~UniformStorage11();
ID3D11Buffer *getConstantBuffer() const { return mConstantBuffer; }
gl::Error getConstantBuffer(Renderer11 *renderer, const d3d11::Buffer **bufferOut);
private:
ID3D11Buffer *mConstantBuffer;
d3d11::Buffer mConstantBuffer;
};
}
} // namespace rx
#endif // LIBANGLE_RENDERER_D3D_D3D11_SHADEREXECUTABLE11_H_
......@@ -80,7 +80,7 @@ SwapChain11::SwapChain11(Renderer11 *renderer,
mDepthStencilTexture(),
mDepthStencilDSView(),
mDepthStencilSRView(),
mQuadVB(nullptr),
mQuadVB(),
mPassThroughSampler(nullptr),
mPassThroughIL(nullptr),
mPassThroughVS(nullptr),
......@@ -120,7 +120,7 @@ void SwapChain11::release()
mDepthStencilTexture.reset();
mDepthStencilDSView.reset();
mDepthStencilSRView.reset();
SafeRelease(mQuadVB);
mQuadVB.reset();
SafeRelease(mPassThroughSampler);
SafeRelease(mPassThroughIL);
SafeRelease(mPassThroughVS);
......@@ -611,7 +611,7 @@ void SwapChain11::initPassThroughResources()
ASSERT(device != nullptr);
// Make sure our resources are all not allocated, when we create
ASSERT(mQuadVB == nullptr && mPassThroughSampler == nullptr);
ASSERT(!mQuadVB.valid() && mPassThroughSampler == nullptr);
ASSERT(mPassThroughIL == nullptr && mPassThroughVS == nullptr && mPassThroughPS == nullptr);
D3D11_BUFFER_DESC vbDesc;
......@@ -622,9 +622,9 @@ void SwapChain11::initPassThroughResources()
vbDesc.MiscFlags = 0;
vbDesc.StructureByteStride = 0;
HRESULT result = device->CreateBuffer(&vbDesc, nullptr, &mQuadVB);
ASSERT(SUCCEEDED(result));
d3d11::SetDebugName(mQuadVB, "Swap chain quad vertex buffer");
gl::Error err = mRenderer->allocateResource(vbDesc, &mQuadVB);
ASSERT(!err.isError());
mQuadVB.setDebugName("Swap chain quad vertex buffer");
D3D11_SAMPLER_DESC samplerDesc;
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
......@@ -641,7 +641,7 @@ void SwapChain11::initPassThroughResources()
samplerDesc.MinLOD = 0;
samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
result = device->CreateSamplerState(&samplerDesc, &mPassThroughSampler);
HRESULT result = device->CreateSamplerState(&samplerDesc, &mPassThroughSampler);
ASSERT(SUCCEEDED(result));
d3d11::SetDebugName(mPassThroughSampler, "Swap chain pass through sampler");
......@@ -729,7 +729,8 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width,
// Set vertices
D3D11_MAPPED_SUBRESOURCE mappedResource;
HRESULT result = deviceContext->Map(mQuadVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
HRESULT result =
deviceContext->Map(mQuadVB.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (FAILED(result))
{
return EGL_BAD_ACCESS;
......@@ -763,11 +764,12 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width,
d3d11::SetPositionTexCoordVertex(&vertices[2], x2, y1, u2, v1);
d3d11::SetPositionTexCoordVertex(&vertices[3], x2, y2, u2, v2);
deviceContext->Unmap(mQuadVB, 0);
deviceContext->Unmap(mQuadVB.get(), 0);
static UINT stride = sizeof(d3d11::PositionTexCoordVertex);
static UINT startIdx = 0;
deviceContext->IASetVertexBuffers(0, 1, &mQuadVB, &stride, &startIdx);
ID3D11Buffer *vertexBuffer = mQuadVB.get();
deviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &startIdx);
// Apply state
deviceContext->OMSetDepthStencilState(nullptr, 0xFFFFFFFF);
......
......@@ -98,7 +98,7 @@ class SwapChain11 final : public SwapChainD3D
d3d11::DepthStencilView mDepthStencilDSView;
d3d11::SharedSRV mDepthStencilSRView;
ID3D11Buffer *mQuadVB;
d3d11::Buffer mQuadVB;
ID3D11SamplerState *mPassThroughSampler;
ID3D11InputLayout *mPassThroughIL;
ID3D11VertexShader *mPassThroughVS;
......
......@@ -19,30 +19,27 @@
namespace rx
{
VertexBuffer11::VertexBuffer11(Renderer11 *const renderer) : mRenderer(renderer)
VertexBuffer11::VertexBuffer11(Renderer11 *const renderer)
: mRenderer(renderer),
mBuffer(),
mBufferSize(0),
mDynamicUsage(false),
mMappedResourceData(nullptr)
{
mBuffer = nullptr;
mBufferSize = 0;
mDynamicUsage = false;
mMappedResourceData = nullptr;
}
VertexBuffer11::~VertexBuffer11()
{
ASSERT(mMappedResourceData == nullptr);
SafeRelease(mBuffer);
}
gl::Error VertexBuffer11::initialize(unsigned int size, bool dynamicUsage)
{
SafeRelease(mBuffer);
mBuffer.reset();
updateSerial();
if (size > 0)
{
ID3D11Device *dxDevice = mRenderer->getDevice();
D3D11_BUFFER_DESC bufferDesc;
bufferDesc.ByteWidth = size;
bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
......@@ -51,20 +48,15 @@ gl::Error VertexBuffer11::initialize(unsigned int size, bool dynamicUsage)
bufferDesc.MiscFlags = 0;
bufferDesc.StructureByteStride = 0;
HRESULT result = dxDevice->CreateBuffer(&bufferDesc, nullptr, &mBuffer);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY,
"Failed to allocate internal vertex buffer of size, %lu.", size);
}
ANGLE_TRY(mRenderer->allocateResource(bufferDesc, &mBuffer));
if (dynamicUsage)
{
d3d11::SetDebugName(mBuffer, "VertexBuffer11 (dynamic)");
mBuffer.setDebugName("VertexBuffer11 (dynamic)");
}
else
{
d3d11::SetDebugName(mBuffer, "VertexBuffer11 (static)");
mBuffer.setDebugName("VertexBuffer11 (static)");
}
}
......@@ -83,7 +75,7 @@ gl::Error VertexBuffer11::mapResource()
D3D11_MAPPED_SUBRESOURCE mappedResource;
HRESULT result =
dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource);
dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY,
......@@ -101,7 +93,7 @@ void VertexBuffer11::hintUnmapResource()
if (mMappedResourceData != nullptr)
{
ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
dxContext->Unmap(mBuffer, 0);
dxContext->Unmap(mBuffer.get(), 0);
mMappedResourceData = nullptr;
}
......@@ -116,7 +108,7 @@ gl::Error VertexBuffer11::storeVertexAttributes(const gl::VertexAttribute &attri
unsigned int offset,
const uint8_t *sourceData)
{
if (!mBuffer)
if (!mBuffer.valid())
{
return gl::Error(GL_OUT_OF_MEMORY, "Internal vertex buffer is not initialized.");
}
......@@ -164,7 +156,7 @@ gl::Error VertexBuffer11::setBufferSize(unsigned int size)
gl::Error VertexBuffer11::discard()
{
if (!mBuffer)
if (!mBuffer.valid())
{
return gl::Error(GL_OUT_OF_MEMORY, "Internal vertex buffer is not initialized.");
}
......@@ -172,19 +164,19 @@ gl::Error VertexBuffer11::discard()
ID3D11DeviceContext *dxContext = mRenderer->getDeviceContext();
D3D11_MAPPED_SUBRESOURCE mappedResource;
HRESULT result = dxContext->Map(mBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
HRESULT result = dxContext->Map(mBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY,
"Failed to map internal buffer for discarding, HRESULT: 0x%08x", result);
}
dxContext->Unmap(mBuffer, 0);
dxContext->Unmap(mBuffer.get(), 0);
return gl::NoError();
}
ID3D11Buffer *VertexBuffer11::getBuffer() const
const d3d11::Buffer &VertexBuffer11::getBuffer() const
{
return mBuffer;
}
......
......@@ -12,6 +12,7 @@
#include <stdint.h>
#include "libANGLE/renderer/d3d/VertexBuffer.h"
#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
namespace rx
{
......@@ -41,7 +42,7 @@ class VertexBuffer11 : public VertexBuffer
void hintUnmapResource() override;
ID3D11Buffer *getBuffer() const;
const d3d11::Buffer &getBuffer() const;
private:
~VertexBuffer11() override;
......@@ -49,7 +50,7 @@ class VertexBuffer11 : public VertexBuffer
Renderer11 *const mRenderer;
ID3D11Buffer *mBuffer;
d3d11::Buffer mBuffer;
unsigned int mBufferSize;
bool mDynamicUsage;
......
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