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