Enable multiple render targets in Renderer11::applyRenderTarget.

TRAC #22656 Signed-off-by: Nicolas Capens Signed-off-by: Shannon Woods Author: Jamie Madill git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@2015 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent e636d645
...@@ -814,29 +814,60 @@ bool Renderer11::applyPrimitiveType(GLenum mode, GLsizei count) ...@@ -814,29 +814,60 @@ bool Renderer11::applyPrimitiveType(GLenum mode, GLsizei count)
bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer) bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer)
{ {
// TODO: mrt support
// Get the color render buffer and serial // Get the color render buffer and serial
gl::Renderbuffer *colorbuffer = NULL; // Also extract the render target dimensions and view
unsigned int renderTargetSerial = 0; unsigned int renderTargetWidth = 0;
if (framebuffer->getColorbufferType(0) != GL_NONE) unsigned int renderTargetHeight = 0;
{ GLenum renderTargetFormat = 0;
colorbuffer = framebuffer->getColorbuffer(0); unsigned int renderTargetSerials[gl::IMPLEMENTATION_MAX_DRAW_BUFFERS] = {0};
ID3D11RenderTargetView* framebufferRTVs[gl::IMPLEMENTATION_MAX_DRAW_BUFFERS] = {NULL};
bool missingColorRenderTarget = true;
if (!colorbuffer) for (unsigned int colorAttachment = 0; colorAttachment < gl::IMPLEMENTATION_MAX_DRAW_BUFFERS; colorAttachment++)
{
if (framebuffer->getColorbufferType(colorAttachment) != GL_NONE)
{ {
ERR("render target pointer unexpectedly null."); gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer(colorAttachment);
return false;
}
// check for zero-sized default framebuffer, which is a special case. if (!colorbuffer)
// in this case we do not wish to modify any state and just silently return false. {
// this will not report any gl error but will cause the calling method to return. ERR("render target pointer unexpectedly null.");
if (colorbuffer->getWidth() == 0 || colorbuffer->getHeight() == 0) return false;
{ }
return false;
}
renderTargetSerial = colorbuffer->getSerial(); // check for zero-sized default framebuffer, which is a special case.
// in this case we do not wish to modify any state and just silently return false.
// this will not report any gl error but will cause the calling method to return.
if (colorbuffer->getWidth() == 0 || colorbuffer->getHeight() == 0)
{
return false;
}
renderTargetSerials[colorAttachment] = colorbuffer->getSerial();
// Extract the render target dimensions and view
RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(colorbuffer->getRenderTarget());
if (!renderTarget)
{
ERR("render target pointer unexpectedly null.");
return false;
}
framebufferRTVs[colorAttachment] = renderTarget->getRenderTargetView();
if (!framebufferRTVs[colorAttachment])
{
ERR("render target view pointer unexpectedly null.");
return false;
}
if (missingColorRenderTarget)
{
renderTargetWidth = colorbuffer->getWidth();
renderTargetHeight = colorbuffer->getHeight();
renderTargetFormat = colorbuffer->getActualFormat();
missingColorRenderTarget = false;
}
}
} }
// Get the depth stencil render buffer and serials // Get the depth stencil render buffer and serials
...@@ -849,6 +880,7 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer) ...@@ -849,6 +880,7 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer)
if (!depthStencil) if (!depthStencil)
{ {
ERR("Depth stencil pointer unexpectedly null."); ERR("Depth stencil pointer unexpectedly null.");
SafeRelease(framebufferRTVs);
return false; return false;
} }
...@@ -860,38 +892,13 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer) ...@@ -860,38 +892,13 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer)
if (!depthStencil) if (!depthStencil)
{ {
ERR("Depth stencil pointer unexpectedly null."); ERR("Depth stencil pointer unexpectedly null.");
SafeRelease(framebufferRTVs);
return false; return false;
} }
stencilbufferSerial = depthStencil->getSerial(); stencilbufferSerial = depthStencil->getSerial();
} }
// Extract the render target dimensions and view
unsigned int renderTargetWidth = 0;
unsigned int renderTargetHeight = 0;
GLenum renderTargetFormat = 0;
ID3D11RenderTargetView* framebufferRTV = NULL;
if (colorbuffer)
{
RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(colorbuffer->getRenderTarget());
if (!renderTarget)
{
ERR("render target pointer unexpectedly null.");
return false;
}
framebufferRTV = renderTarget->getRenderTargetView();
if (!framebufferRTV)
{
ERR("render target view pointer unexpectedly null.");
return false;
}
renderTargetWidth = colorbuffer->getWidth();
renderTargetHeight = colorbuffer->getHeight();
renderTargetFormat = colorbuffer->getActualFormat();
}
// Extract the depth stencil sizes and view // Extract the depth stencil sizes and view
unsigned int depthSize = 0; unsigned int depthSize = 0;
unsigned int stencilSize = 0; unsigned int stencilSize = 0;
...@@ -902,10 +909,7 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer) ...@@ -902,10 +909,7 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer)
if (!depthStencilRenderTarget) if (!depthStencilRenderTarget)
{ {
ERR("render target pointer unexpectedly null."); ERR("render target pointer unexpectedly null.");
if (framebufferRTV) SafeRelease(framebufferRTVs);
{
framebufferRTV->Release();
}
return false; return false;
} }
...@@ -913,16 +917,13 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer) ...@@ -913,16 +917,13 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer)
if (!framebufferDSV) if (!framebufferDSV)
{ {
ERR("depth stencil view pointer unexpectedly null."); ERR("depth stencil view pointer unexpectedly null.");
if (framebufferRTV) SafeRelease(framebufferRTVs);
{
framebufferRTV->Release();
}
return false; return false;
} }
// If there is no render buffer, the width, height and format values come from // If there is no render buffer, the width, height and format values come from
// the depth stencil // the depth stencil
if (!colorbuffer) if (missingColorRenderTarget)
{ {
renderTargetWidth = depthStencil->getWidth(); renderTargetWidth = depthStencil->getWidth();
renderTargetHeight = depthStencil->getHeight(); renderTargetHeight = depthStencil->getHeight();
...@@ -935,11 +936,11 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer) ...@@ -935,11 +936,11 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer)
// Apply the render target and depth stencil // Apply the render target and depth stencil
if (!mRenderTargetDescInitialized || !mDepthStencilInitialized || if (!mRenderTargetDescInitialized || !mDepthStencilInitialized ||
renderTargetSerial != mAppliedRenderTargetSerial || memcmp(renderTargetSerials, mAppliedRenderTargetSerials, sizeof(renderTargetSerials)) != 0 ||
depthbufferSerial != mAppliedDepthbufferSerial || depthbufferSerial != mAppliedDepthbufferSerial ||
stencilbufferSerial != mAppliedStencilbufferSerial) stencilbufferSerial != mAppliedStencilbufferSerial)
{ {
mDeviceContext->OMSetRenderTargets(1, &framebufferRTV, framebufferDSV); mDeviceContext->OMSetRenderTargets(getMaxRenderTargets(), framebufferRTVs, framebufferDSV);
mRenderTargetDesc.width = renderTargetWidth; mRenderTargetDesc.width = renderTargetWidth;
mRenderTargetDesc.height = renderTargetHeight; mRenderTargetDesc.height = renderTargetHeight;
...@@ -955,21 +956,18 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer) ...@@ -955,21 +956,18 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer)
mCurStencilSize = stencilSize; mCurStencilSize = stencilSize;
mAppliedRenderTargetSerial = renderTargetSerial; for (unsigned int rtIndex = 0; rtIndex < gl::IMPLEMENTATION_MAX_DRAW_BUFFERS; rtIndex++)
{
mAppliedRenderTargetSerials[rtIndex] = renderTargetSerials[rtIndex];
}
mAppliedDepthbufferSerial = depthbufferSerial; mAppliedDepthbufferSerial = depthbufferSerial;
mAppliedStencilbufferSerial = stencilbufferSerial; mAppliedStencilbufferSerial = stencilbufferSerial;
mRenderTargetDescInitialized = true; mRenderTargetDescInitialized = true;
mDepthStencilInitialized = true; mDepthStencilInitialized = true;
} }
if (framebufferRTV) SafeRelease(framebufferRTVs);
{ SafeRelease(framebufferDSV);
framebufferRTV->Release();
}
if (framebufferDSV)
{
framebufferDSV->Release();
}
return true; return true;
} }
...@@ -1695,7 +1693,10 @@ void Renderer11::maskedClear(const gl::ClearParameters &clearParams) ...@@ -1695,7 +1693,10 @@ void Renderer11::maskedClear(const gl::ClearParameters &clearParams)
void Renderer11::markAllStateDirty() void Renderer11::markAllStateDirty()
{ {
mAppliedRenderTargetSerial = 0; for (unsigned int rtIndex = 0; rtIndex < gl::IMPLEMENTATION_MAX_DRAW_BUFFERS; rtIndex++)
{
mAppliedRenderTargetSerials[rtIndex] = 0;
}
mAppliedDepthbufferSerial = 0; mAppliedDepthbufferSerial = 0;
mAppliedStencilbufferSerial = 0; mAppliedStencilbufferSerial = 0;
mDepthStencilInitialized = false; mDepthStencilInitialized = false;
......
...@@ -238,7 +238,7 @@ class Renderer11 : public Renderer ...@@ -238,7 +238,7 @@ class Renderer11 : public Renderer
unsigned int mMaxSupportedSamples; unsigned int mMaxSupportedSamples;
// current render target states // current render target states
unsigned int mAppliedRenderTargetSerial; unsigned int mAppliedRenderTargetSerials[gl::IMPLEMENTATION_MAX_DRAW_BUFFERS];
unsigned int mAppliedDepthbufferSerial; unsigned int mAppliedDepthbufferSerial;
unsigned int mAppliedStencilbufferSerial; unsigned int mAppliedStencilbufferSerial;
bool mDepthStencilInitialized; bool mDepthStencilInitialized;
......
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