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() ...@@ -30,7 +30,6 @@ Framebuffer::~Framebuffer()
mColorbufferPointer.set(NULL); mColorbufferPointer.set(NULL);
mDepthbufferPointer.set(NULL); mDepthbufferPointer.set(NULL);
mStencilbufferPointer.set(NULL); mStencilbufferPointer.set(NULL);
mNullColorbufferPointer.set(NULL);
} }
Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle) const Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle) const
...@@ -181,30 +180,6 @@ Renderbuffer *Framebuffer::getDepthOrStencilbuffer() ...@@ -181,30 +180,6 @@ Renderbuffer *Framebuffer::getDepthOrStencilbuffer()
return depthstencilbuffer; 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() GLenum Framebuffer::getColorbufferType()
{ {
return mColorbufferType; return mColorbufferType;
......
...@@ -51,7 +51,6 @@ class Framebuffer ...@@ -51,7 +51,6 @@ class Framebuffer
Renderbuffer *getDepthbuffer(); Renderbuffer *getDepthbuffer();
Renderbuffer *getStencilbuffer(); Renderbuffer *getStencilbuffer();
Renderbuffer *getDepthOrStencilbuffer(); Renderbuffer *getDepthOrStencilbuffer();
Renderbuffer *getNullColorbuffer();
GLenum getColorbufferType(); GLenum getColorbufferType();
GLenum getDepthbufferType(); GLenum getDepthbufferType();
...@@ -76,8 +75,6 @@ class Framebuffer ...@@ -76,8 +75,6 @@ class Framebuffer
GLenum mStencilbufferType; GLenum mStencilbufferType;
BindingPointer<Renderbuffer> mStencilbufferPointer; BindingPointer<Renderbuffer> mStencilbufferPointer;
BindingPointer<Renderbuffer> mNullColorbufferPointer;
rx::Renderer *mRenderer; rx::Renderer *mRenderer;
private: private:
......
...@@ -95,6 +95,15 @@ Renderer9::Renderer9(egl::Display *display, HDC hDc, bool softwareDevice) : Rend ...@@ -95,6 +95,15 @@ Renderer9::Renderer9(egl::Display *display, HDC hDc, bool softwareDevice) : Rend
mVertexDataManager = NULL; mVertexDataManager = NULL;
mIndexDataManager = NULL; mIndexDataManager = NULL;
mLineLoopIB = 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() Renderer9::~Renderer9()
...@@ -991,6 +1000,51 @@ bool Renderer9::applyPrimitiveType(GLenum mode, GLsizei count) ...@@ -991,6 +1000,51 @@ bool Renderer9::applyPrimitiveType(GLenum mode, GLsizei count)
return mPrimitiveCount > 0; 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) bool Renderer9::applyRenderTarget(gl::Framebuffer *framebuffer)
{ {
// if there is no color attachment we must synthesize a NULL colorattachment // if there is no color attachment we must synthesize a NULL colorattachment
...@@ -1002,7 +1056,7 @@ bool Renderer9::applyRenderTarget(gl::Framebuffer *framebuffer) ...@@ -1002,7 +1056,7 @@ bool Renderer9::applyRenderTarget(gl::Framebuffer *framebuffer)
} }
else else
{ {
renderbufferObject = framebuffer->getNullColorbuffer(); renderbufferObject = getNullColorbuffer(framebuffer->getDepthbuffer());
} }
if (!renderbufferObject) if (!renderbufferObject)
{ {
...@@ -1603,6 +1657,13 @@ void Renderer9::releaseDeviceResources() ...@@ -1603,6 +1657,13 @@ void Renderer9::releaseDeviceResources()
delete mLineLoopIB; delete mLineLoopIB;
mLineLoopIB = NULL; 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 ...@@ -178,6 +178,7 @@ class Renderer9 : public Renderer
void getMultiSampleSupport(D3DFORMAT format, bool *multiSampleArray); void getMultiSampleSupport(D3DFORMAT format, bool *multiSampleArray);
bool copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged); bool copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged);
gl::Renderbuffer *getNullColorbuffer(gl::Renderbuffer *depthbuffer);
D3DPOOL getBufferPool(DWORD usage) const; D3DPOOL getBufferPool(DWORD usage) const;
...@@ -267,6 +268,17 @@ class Renderer9 : public Renderer ...@@ -267,6 +268,17 @@ class Renderer9 : public Renderer
IndexDataManager *mIndexDataManager; IndexDataManager *mIndexDataManager;
StreamingIndexBuffer *mLineLoopIB; 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