Commit 0bf58eab by Corentin Wallez

Renderer11: expose a metric for the Buffer11 CPU copies size

This will allow us to measure the impact of subsequent optimizations on the memory consumption of Chrome. BUG=angleproject:916 Change-Id: Ib57fdfcc2950917eff33080bfb3db574595ecb6d Reviewed-on: https://chromium-review.googlesource.com/284637Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent 185fb403
...@@ -252,6 +252,8 @@ Buffer11::~Buffer11() ...@@ -252,6 +252,8 @@ Buffer11::~Buffer11()
{ {
SafeDelete(p.second.storage); SafeDelete(p.second.storage);
} }
mRenderer->onBufferDelete(this);
} }
gl::Error Buffer11::setData(const void *data, size_t size, GLenum usage) gl::Error Buffer11::setData(const void *data, size_t size, GLenum usage)
...@@ -627,6 +629,19 @@ gl::Error Buffer11::packPixels(ID3D11Texture2D *srcTexture, UINT srcSubresource, ...@@ -627,6 +629,19 @@ gl::Error Buffer11::packPixels(ID3D11Texture2D *srcTexture, UINT srcSubresource,
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
size_t Buffer11::getTotalCPUBufferMemoryBytes() const
{
size_t allocationSize = 0;
BufferStorage *staging = mBufferStorages[BUFFER_USAGE_STAGING];
allocationSize += staging ? staging->getSize() : 0;
BufferStorage *sysMem = mBufferStorages[BUFFER_USAGE_SYSTEM_MEMORY];
allocationSize += sysMem ? sysMem->getSize() : 0;
return allocationSize;
}
Buffer11::BufferStorage *Buffer11::getBufferStorage(BufferUsage usage) Buffer11::BufferStorage *Buffer11::getBufferStorage(BufferUsage usage)
{ {
ASSERT(0 <= usage && usage < BUFFER_USAGE_COUNT); ASSERT(0 <= usage && usage < BUFFER_USAGE_COUNT);
......
...@@ -63,6 +63,7 @@ class Buffer11 : public BufferD3D ...@@ -63,6 +63,7 @@ class Buffer11 : public BufferD3D
ID3D11ShaderResourceView *getSRV(DXGI_FORMAT srvFormat); ID3D11ShaderResourceView *getSRV(DXGI_FORMAT srvFormat);
bool isMapped() const { return mMappedStorage != NULL; } bool isMapped() const { return mMappedStorage != NULL; }
gl::Error packPixels(ID3D11Texture2D *srcTexure, UINT srcSubresource, const PackPixelsParams &params); gl::Error packPixels(ID3D11Texture2D *srcTexure, UINT srcSubresource, const PackPixelsParams &params);
size_t getTotalCPUBufferMemoryBytes() const;
// BufferD3D implementation // BufferD3D implementation
virtual size_t getSize() const { return mSize; } virtual size_t getSize() const { return mSize; }
......
...@@ -238,7 +238,8 @@ void Renderer11::SRVCache::clear() ...@@ -238,7 +238,8 @@ void Renderer11::SRVCache::clear()
Renderer11::Renderer11(egl::Display *display) Renderer11::Renderer11(egl::Display *display)
: RendererD3D(display), : RendererD3D(display),
mStateCache(this), mStateCache(this),
mDebug(nullptr) mDebug(nullptr),
mLastHistogramUpdateTime(ANGLEPlatformCurrent()->monotonicallyIncreasingTime())
{ {
mVertexDataManager = NULL; mVertexDataManager = NULL;
mIndexDataManager = NULL; mIndexDataManager = NULL;
...@@ -3162,7 +3163,9 @@ IndexBuffer *Renderer11::createIndexBuffer() ...@@ -3162,7 +3163,9 @@ IndexBuffer *Renderer11::createIndexBuffer()
BufferImpl *Renderer11::createBuffer() BufferImpl *Renderer11::createBuffer()
{ {
return new Buffer11(this); Buffer11 *buffer = new Buffer11(this);
mAliveBuffers.insert(buffer);
return buffer;
} }
VertexArrayImpl *Renderer11::createVertexArray(const gl::VertexArray::Data &data) VertexArrayImpl *Renderer11::createVertexArray(const gl::VertexArray::Data &data)
...@@ -3680,6 +3683,40 @@ bool Renderer11::isES3Capable() const ...@@ -3680,6 +3683,40 @@ bool Renderer11::isES3Capable() const
return (d3d11_gl::GetMaximumClientVersion(mRenderer11DeviceCaps.featureLevel) > 2); return (d3d11_gl::GetMaximumClientVersion(mRenderer11DeviceCaps.featureLevel) > 2);
}; };
void Renderer11::onSwap()
{
// Send histogram updates every half hour
const double kHistogramUpdateInterval = 30 * 60;
const double currentTime = ANGLEPlatformCurrent()->monotonicallyIncreasingTime();
const double timeSinceLastUpdate = currentTime - mLastHistogramUpdateTime;
if (timeSinceLastUpdate > kHistogramUpdateInterval)
{
updateHistograms();
mLastHistogramUpdateTime = currentTime;
}
}
void Renderer11::updateHistograms()
{
// Update the buffer CPU memory histogram
{
size_t sizeSum = 0;
for (auto &buffer : mAliveBuffers)
{
sizeSum += buffer->getTotalCPUBufferMemoryBytes();
}
const int kOneMegaByte = 1024 * 1024;
ANGLE_HISTOGRAM_MEMORY_MB("GPU.ANGLE.Buffer11CPUMemoryMB", sizeSum / kOneMegaByte);
}
}
void Renderer11::onBufferDelete(const Buffer11 *deleted)
{
mAliveBuffers.erase(deleted);
}
ID3D11Texture2D *Renderer11::resolveMultisampledTexture(ID3D11Texture2D *source, unsigned int subresource) ID3D11Texture2D *Renderer11::resolveMultisampledTexture(ID3D11Texture2D *source, unsigned int subresource)
{ {
D3D11_TEXTURE2D_DESC textureDesc; D3D11_TEXTURE2D_DESC textureDesc;
......
...@@ -33,6 +33,7 @@ class VertexDataManager; ...@@ -33,6 +33,7 @@ class VertexDataManager;
class IndexDataManager; class IndexDataManager;
class StreamingIndexBufferInterface; class StreamingIndexBufferInterface;
class Blit11; class Blit11;
class Buffer11;
class Clear11; class Clear11;
class PixelTransfer11; class PixelTransfer11;
class RenderTarget11; class RenderTarget11;
...@@ -268,6 +269,9 @@ class Renderer11 : public RendererD3D ...@@ -268,6 +269,9 @@ class Renderer11 : public RendererD3D
RendererClass getRendererClass() const override { return RENDERER_D3D11; } RendererClass getRendererClass() const override { return RENDERER_D3D11; }
InputLayoutCache *getInputLayoutCache() { return &mInputLayoutCache; } InputLayoutCache *getInputLayoutCache() { return &mInputLayoutCache; }
void onSwap();
void onBufferDelete(const Buffer11 *deleted);
protected: protected:
void createAnnotator() override; void createAnnotator() override;
gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd) override; gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd) override;
...@@ -287,6 +291,8 @@ class Renderer11 : public RendererD3D ...@@ -287,6 +291,8 @@ class Renderer11 : public RendererD3D
void populateRenderer11DeviceCaps(); void populateRenderer11DeviceCaps();
void updateHistograms();
HMODULE mD3d11Module; HMODULE mD3d11Module;
HMODULE mDxgiModule; HMODULE mDxgiModule;
std::vector<D3D_FEATURE_LEVEL> mAvailableFeatureLevels; std::vector<D3D_FEATURE_LEVEL> mAvailableFeatureLevels;
...@@ -455,6 +461,11 @@ class Renderer11 : public RendererD3D ...@@ -455,6 +461,11 @@ class Renderer11 : public RendererD3D
// Sync query // Sync query
ID3D11Query *mSyncQuery; ID3D11Query *mSyncQuery;
// Created objects state tracking
std::set<const Buffer11*> mAliveBuffers;
double mLastHistogramUpdateTime;
ID3D11Device *mDevice; ID3D11Device *mDevice;
Renderer11DeviceCaps mRenderer11DeviceCaps; Renderer11DeviceCaps mRenderer11DeviceCaps;
ID3D11DeviceContext *mDeviceContext; ID3D11DeviceContext *mDeviceContext;
......
...@@ -666,6 +666,8 @@ EGLint SwapChain11::swapRect(EGLint x, EGLint y, EGLint width, EGLint height) ...@@ -666,6 +666,8 @@ EGLint SwapChain11::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
ERR("Present failed with error code 0x%08X", result); ERR("Present failed with error code 0x%08X", result);
} }
mRenderer->onSwap();
return EGL_SUCCESS; return EGL_SUCCESS;
} }
......
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