Minimizes render target changes

TRAC #12154 This patch reduces calls to SetRenderTarget. Signed-off-by: Nicolas Capens Signed-off-by: Daniel Koch Author: Shannon Woods git-svn-id: https://angleproject.googlecode.com/svn/trunk@259 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 9c502882
...@@ -36,7 +36,10 @@ namespace gl ...@@ -36,7 +36,10 @@ namespace gl
Context::Context(const egl::Config *config) Context::Context(const egl::Config *config)
: mConfig(config) : mConfig(config)
{ {
mAppliedRenderTargetSerial = 0;
setClearColor(0.0f, 0.0f, 0.0f, 0.0f); setClearColor(0.0f, 0.0f, 0.0f, 0.0f);
mState.depthClearValue = 1.0f; mState.depthClearValue = 1.0f;
mState.stencilClearValue = 0; mState.stencilClearValue = 0;
...@@ -276,10 +279,14 @@ void Context::makeCurrent(egl::Display *display, egl::Surface *surface) ...@@ -276,10 +279,14 @@ void Context::makeCurrent(egl::Display *display, egl::Surface *surface)
mPsProfile = "ps_2_0"; mPsProfile = "ps_2_0";
mVsProfile = "vs_2_0"; mVsProfile = "vs_2_0";
} }
markAllStateDirty();
} }
// This function will set all of the state-related dirty flags, so that all state is set during next pre-draw.
void Context::markAllStateDirty() void Context::markAllStateDirty()
{ {
mAppliedRenderTargetSerial = 0;
mAppliedProgram = 0; mAppliedProgram = 0;
} }
...@@ -1482,6 +1489,7 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu ...@@ -1482,6 +1489,7 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu
bool Context::applyRenderTarget(bool ignoreViewport) bool Context::applyRenderTarget(bool ignoreViewport)
{ {
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
Framebuffer *framebufferObject = getFramebuffer(); Framebuffer *framebufferObject = getFramebuffer();
if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE) if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
...@@ -1494,7 +1502,13 @@ bool Context::applyRenderTarget(bool ignoreViewport) ...@@ -1494,7 +1502,13 @@ bool Context::applyRenderTarget(bool ignoreViewport)
IDirect3DSurface9 *renderTarget = framebufferObject->getRenderTarget(); IDirect3DSurface9 *renderTarget = framebufferObject->getRenderTarget();
IDirect3DSurface9 *depthStencil = framebufferObject->getDepthStencil(); IDirect3DSurface9 *depthStencil = framebufferObject->getDepthStencil();
device->SetRenderTarget(0, renderTarget); unsigned int renderTargetSerial = framebufferObject->getRenderTargetSerial();
if (renderTargetSerial != mAppliedRenderTargetSerial)
{
device->SetRenderTarget(0, renderTarget);
mAppliedRenderTargetSerial = renderTargetSerial;
}
device->SetDepthStencilSurface(depthStencil); device->SetDepthStencilSurface(depthStencil);
D3DVIEWPORT9 viewport; D3DVIEWPORT9 viewport;
......
...@@ -445,6 +445,7 @@ class Context ...@@ -445,6 +445,7 @@ class Context
bool mHasBeenCurrent; bool mHasBeenCurrent;
unsigned int mAppliedProgram; unsigned int mAppliedProgram;
unsigned int mAppliedRenderTargetSerial;
const char *mPsProfile; const char *mPsProfile;
const char *mVsProfile; const char *mVsProfile;
......
...@@ -92,6 +92,18 @@ void Framebuffer::detachRenderbuffer(GLuint renderbuffer) ...@@ -92,6 +92,18 @@ void Framebuffer::detachRenderbuffer(GLuint renderbuffer)
} }
} }
unsigned int Framebuffer::getRenderTargetSerial()
{
Renderbuffer *colorbuffer = getColorbuffer();
if (colorbuffer)
{
return colorbuffer->getSerial();
}
return 0;
}
IDirect3DSurface9 *Framebuffer::getRenderTarget() IDirect3DSurface9 *Framebuffer::getRenderTarget()
{ {
Renderbuffer *colorbuffer = getColorbuffer(); Renderbuffer *colorbuffer = getColorbuffer();
......
...@@ -39,6 +39,8 @@ class Framebuffer ...@@ -39,6 +39,8 @@ class Framebuffer
IDirect3DSurface9 *getRenderTarget(); IDirect3DSurface9 *getRenderTarget();
IDirect3DSurface9 *getDepthStencil(); IDirect3DSurface9 *getDepthStencil();
unsigned int getRenderTargetSerial();
Colorbuffer *getColorbuffer(); Colorbuffer *getColorbuffer();
Depthbuffer *getDepthbuffer(); Depthbuffer *getDepthbuffer();
Stencilbuffer *getStencilbuffer(); Stencilbuffer *getStencilbuffer();
......
...@@ -15,11 +15,14 @@ ...@@ -15,11 +15,14 @@
namespace gl namespace gl
{ {
unsigned int Renderbuffer::mCurrentSerial = 1;
Renderbuffer::Renderbuffer() Renderbuffer::Renderbuffer()
{ {
mWidth = 0; mWidth = 0;
mHeight = 0; mHeight = 0;
mFormat = GL_RGBA4; // default format, needs to be one of the expected renderbuffer formats mFormat = GL_RGBA4; // default format, needs to be one of the expected renderbuffer formats
mSerial = issueSerial();
} }
Renderbuffer::~Renderbuffer() Renderbuffer::~Renderbuffer()
...@@ -66,6 +69,16 @@ GLenum Renderbuffer::getFormat() ...@@ -66,6 +69,16 @@ GLenum Renderbuffer::getFormat()
return mFormat; return mFormat;
} }
unsigned int Renderbuffer::getSerial() const
{
return mSerial;
}
unsigned int Renderbuffer::issueSerial()
{
return mCurrentSerial++;
}
Colorbuffer::Colorbuffer(IDirect3DSurface9 *renderTarget) : mRenderTarget(renderTarget) Colorbuffer::Colorbuffer(IDirect3DSurface9 *renderTarget) : mRenderTarget(renderTarget)
{ {
if (renderTarget) if (renderTarget)
...@@ -78,6 +91,7 @@ Colorbuffer::Colorbuffer(IDirect3DSurface9 *renderTarget) : mRenderTarget(render ...@@ -78,6 +91,7 @@ Colorbuffer::Colorbuffer(IDirect3DSurface9 *renderTarget) : mRenderTarget(render
mWidth = description.Width; mWidth = description.Width;
mHeight = description.Height; mHeight = description.Height;
} }
} }
Colorbuffer::Colorbuffer(int width, int height, GLenum format) Colorbuffer::Colorbuffer(int width, int height, GLenum format)
......
...@@ -36,14 +36,20 @@ class Renderbuffer ...@@ -36,14 +36,20 @@ class Renderbuffer
int getWidth(); int getWidth();
int getHeight(); int getHeight();
GLenum getFormat(); GLenum getFormat();
unsigned int getSerial() const;
static unsigned int issueSerial();
protected: protected:
int mWidth; int mWidth;
int mHeight; int mHeight;
GLenum mFormat; GLenum mFormat;
unsigned int mSerial;
private: private:
DISALLOW_COPY_AND_ASSIGN(Renderbuffer); DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
static unsigned int mCurrentSerial;
}; };
class Colorbuffer : public Renderbuffer class Colorbuffer : public Renderbuffer
......
...@@ -69,7 +69,8 @@ class Texture ...@@ -69,7 +69,8 @@ class Texture
class TextureColorbufferProxy : public Colorbuffer class TextureColorbufferProxy : public Colorbuffer
{ {
public: public:
TextureColorbufferProxy(Texture *texture, GLenum target); // target is a 2D-like texture target (GL_TEXTURE_2D or one of the cube face targets) TextureColorbufferProxy(Texture *texture, GLenum target);
// target is a 2D-like texture target (GL_TEXTURE_2D or one of the cube face targets)
virtual IDirect3DSurface9 *getRenderTarget(); virtual IDirect3DSurface9 *getRenderTarget();
......
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