Move NullColorbuffer handling from Framebuffer to Renderer9

Trac #22229 Uses a 12-entry LRU cache to avoid recreating them unnecessarily. Signed-off-by: Nicolas Capens Signed-off-by: Shannon Woods git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1567 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent f5a2ae55
......@@ -30,7 +30,6 @@ Framebuffer::~Framebuffer()
mColorbufferPointer.set(NULL);
mDepthbufferPointer.set(NULL);
mStencilbufferPointer.set(NULL);
mNullColorbufferPointer.set(NULL);
}
Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle) const
......@@ -181,30 +180,6 @@ Renderbuffer *Framebuffer::getDepthOrStencilbuffer()
return depthstencilbuffer;
}
Renderbuffer *Framebuffer::getNullColorbuffer()
{
Renderbuffer *nullbuffer = mNullColorbufferPointer.get();
Renderbuffer *depthbuffer = getDepthbuffer();
if (!depthbuffer)
{
ERR("Unexpected null depthbuffer for depth-only FBO.");
return NULL;
}
GLsizei width = depthbuffer->getWidth();
GLsizei height = depthbuffer->getHeight();
if (!nullbuffer ||
width != nullbuffer->getWidth() || height != nullbuffer->getHeight())
{
nullbuffer = new Renderbuffer(mRenderer, 0, new Colorbuffer(mRenderer, width, height, GL_NONE, 0));
mNullColorbufferPointer.set(nullbuffer);
}
return nullbuffer;
}
GLenum Framebuffer::getColorbufferType()
{
return mColorbufferType;
......
......@@ -51,7 +51,6 @@ class Framebuffer
Renderbuffer *getDepthbuffer();
Renderbuffer *getStencilbuffer();
Renderbuffer *getDepthOrStencilbuffer();
Renderbuffer *getNullColorbuffer();
GLenum getColorbufferType();
GLenum getDepthbufferType();
......@@ -76,8 +75,6 @@ class Framebuffer
GLenum mStencilbufferType;
BindingPointer<Renderbuffer> mStencilbufferPointer;
BindingPointer<Renderbuffer> mNullColorbufferPointer;
rx::Renderer *mRenderer;
private:
......
......@@ -95,6 +95,15 @@ Renderer9::Renderer9(egl::Display *display, HDC hDc, bool softwareDevice) : Rend
mVertexDataManager = NULL;
mIndexDataManager = NULL;
mLineLoopIB = NULL;
mMaxNullColorbufferLRU = 0;
for (int i = 0; i < NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++)
{
mNullColorbufferCache[i].lruCount = 0;
mNullColorbufferCache[i].width = 0;
mNullColorbufferCache[i].height = 0;
mNullColorbufferCache[i].buffer = NULL;
}
}
Renderer9::~Renderer9()
......@@ -991,6 +1000,51 @@ bool Renderer9::applyPrimitiveType(GLenum mode, GLsizei count)
return mPrimitiveCount > 0;
}
gl::Renderbuffer *Renderer9::getNullColorbuffer(gl::Renderbuffer *depthbuffer)
{
if (!depthbuffer)
{
ERR("Unexpected null depthbuffer for depth-only FBO.");
return NULL;
}
GLsizei width = depthbuffer->getWidth();
GLsizei height = depthbuffer->getHeight();
// search cached nullcolorbuffers
for (int i = 0; i < NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++)
{
if (mNullColorbufferCache[i].buffer != NULL &&
mNullColorbufferCache[i].width == width &&
mNullColorbufferCache[i].height == height)
{
mNullColorbufferCache[i].lruCount = ++mMaxNullColorbufferLRU;
return mNullColorbufferCache[i].buffer;
}
}
gl::Renderbuffer *nullbuffer = new gl::Renderbuffer(this, 0, new gl::Colorbuffer(this, width, height, GL_NONE, 0));
// add nullbuffer to the cache
NullColorbufferCacheEntry *oldest = &mNullColorbufferCache[0];
for (int i = 1; i < NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++)
{
if (mNullColorbufferCache[i].lruCount < oldest->lruCount)
{
oldest = &mNullColorbufferCache[i];
}
}
delete oldest->buffer;
oldest->buffer = nullbuffer;
oldest->lruCount = ++mMaxNullColorbufferLRU;
oldest->width = width;
oldest->height = height;
return nullbuffer;
}
bool Renderer9::applyRenderTarget(gl::Framebuffer *framebuffer)
{
// if there is no color attachment we must synthesize a NULL colorattachment
......@@ -1002,7 +1056,7 @@ bool Renderer9::applyRenderTarget(gl::Framebuffer *framebuffer)
}
else
{
renderbufferObject = framebuffer->getNullColorbuffer();
renderbufferObject = getNullColorbuffer(framebuffer->getDepthbuffer());
}
if (!renderbufferObject)
{
......@@ -1603,6 +1657,13 @@ void Renderer9::releaseDeviceResources()
delete mLineLoopIB;
mLineLoopIB = NULL;
for (int i = 0; i < NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++)
{
delete mNullColorbufferCache[i].buffer;
mNullColorbufferCache[i].buffer = NULL;
}
}
......
......@@ -178,6 +178,7 @@ class Renderer9 : public Renderer
void getMultiSampleSupport(D3DFORMAT format, bool *multiSampleArray);
bool copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged);
gl::Renderbuffer *getNullColorbuffer(gl::Renderbuffer *depthbuffer);
D3DPOOL getBufferPool(DWORD usage) const;
......@@ -267,6 +268,17 @@ class Renderer9 : public Renderer
IndexDataManager *mIndexDataManager;
StreamingIndexBuffer *mLineLoopIB;
enum { NUM_NULL_COLORBUFFER_CACHE_ENTRIES = 12 };
struct NullColorbufferCacheEntry
{
UINT lruCount;
int width;
int height;
gl::Renderbuffer *buffer;
} mNullColorbufferCache[NUM_NULL_COLORBUFFER_CACHE_ENTRIES];
UINT mMaxNullColorbufferLRU;
};
}
......
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