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()
{
SafeDelete(p.second.storage);
}
mRenderer->onBufferDelete(this);
}
gl::Error Buffer11::setData(const void *data, size_t size, GLenum usage)
......@@ -627,6 +629,19 @@ gl::Error Buffer11::packPixels(ID3D11Texture2D *srcTexture, UINT srcSubresource,
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)
{
ASSERT(0 <= usage && usage < BUFFER_USAGE_COUNT);
......
......@@ -63,6 +63,7 @@ class Buffer11 : public BufferD3D
ID3D11ShaderResourceView *getSRV(DXGI_FORMAT srvFormat);
bool isMapped() const { return mMappedStorage != NULL; }
gl::Error packPixels(ID3D11Texture2D *srcTexure, UINT srcSubresource, const PackPixelsParams &params);
size_t getTotalCPUBufferMemoryBytes() const;
// BufferD3D implementation
virtual size_t getSize() const { return mSize; }
......
......@@ -238,7 +238,8 @@ void Renderer11::SRVCache::clear()
Renderer11::Renderer11(egl::Display *display)
: RendererD3D(display),
mStateCache(this),
mDebug(nullptr)
mDebug(nullptr),
mLastHistogramUpdateTime(ANGLEPlatformCurrent()->monotonicallyIncreasingTime())
{
mVertexDataManager = NULL;
mIndexDataManager = NULL;
......@@ -3162,7 +3163,9 @@ IndexBuffer *Renderer11::createIndexBuffer()
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)
......@@ -3680,6 +3683,40 @@ bool Renderer11::isES3Capable() const
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)
{
D3D11_TEXTURE2D_DESC textureDesc;
......
......@@ -33,6 +33,7 @@ class VertexDataManager;
class IndexDataManager;
class StreamingIndexBufferInterface;
class Blit11;
class Buffer11;
class Clear11;
class PixelTransfer11;
class RenderTarget11;
......@@ -268,6 +269,9 @@ class Renderer11 : public RendererD3D
RendererClass getRendererClass() const override { return RENDERER_D3D11; }
InputLayoutCache *getInputLayoutCache() { return &mInputLayoutCache; }
void onSwap();
void onBufferDelete(const Buffer11 *deleted);
protected:
void createAnnotator() override;
gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd) override;
......@@ -287,6 +291,8 @@ class Renderer11 : public RendererD3D
void populateRenderer11DeviceCaps();
void updateHistograms();
HMODULE mD3d11Module;
HMODULE mDxgiModule;
std::vector<D3D_FEATURE_LEVEL> mAvailableFeatureLevels;
......@@ -455,6 +461,11 @@ class Renderer11 : public RendererD3D
// Sync query
ID3D11Query *mSyncQuery;
// Created objects state tracking
std::set<const Buffer11*> mAliveBuffers;
double mLastHistogramUpdateTime;
ID3D11Device *mDevice;
Renderer11DeviceCaps mRenderer11DeviceCaps;
ID3D11DeviceContext *mDeviceContext;
......
......@@ -666,6 +666,8 @@ EGLint SwapChain11::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
ERR("Present failed with error code 0x%08X", result);
}
mRenderer->onSwap();
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