Added Renderer11 methods to set a one-time render target, and unapply render target state.

TRAC #22679

Signed-off-by: Geoff Lang
Signed-off-by: Shannon Woods
Author: Jamie Madill

git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2092 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index 6acac86..6cc5145 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -2687,8 +2687,8 @@
     static ID3D11ShaderResourceView *const nullSRV = NULL;
     mDeviceContext->PSSetShaderResources(0, 1, &nullSRV);
 
-    // Apply render targets
-    mDeviceContext->OMSetRenderTargets(1, &dest, NULL);
+    // Apply render target
+    setOneTimeRenderTarget(dest);
 
     // Set the viewport
     D3D11_VIEWPORT viewport;
@@ -2710,11 +2710,10 @@
     // Unbind textures and render targets and vertex buffer
     mDeviceContext->PSSetShaderResources(0, 1, &nullSRV);
 
-    static ID3D11RenderTargetView *const nullRTV = NULL;
-    mDeviceContext->OMSetRenderTargets(1, &nullRTV, NULL);
+    unapplyRenderTargets();
 
-    static UINT zero = 0;
-    static ID3D11Buffer *const nullBuffer = NULL;
+    UINT zero = 0;
+    ID3D11Buffer *const nullBuffer = NULL;
     mDeviceContext->IASetVertexBuffers(0, 1, &nullBuffer, &zero, &zero);
 
     markAllStateDirty();
@@ -2722,6 +2721,26 @@
     return true;
 }
 
+void Renderer11::unapplyRenderTargets()
+{
+    setOneTimeRenderTarget(NULL);
+}
+
+void Renderer11::setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView)
+{
+    ID3D11RenderTargetView *rtvArray[gl::IMPLEMENTATION_MAX_DRAW_BUFFERS] = {NULL};
+
+    rtvArray[0] = renderTargetView;
+
+    mDeviceContext->OMSetRenderTargets(getMaxRenderTargets(), rtvArray, NULL);
+
+    // Do not preserve the serial for this one-time-use render target
+    for (unsigned int rtIndex = 0; rtIndex < gl::IMPLEMENTATION_MAX_DRAW_BUFFERS; rtIndex++)
+    {
+        mAppliedRenderTargetSerials[rtIndex] = 0;
+    }
+}
+
 RenderTarget *Renderer11::createRenderTarget(SwapChain *swapChain, bool depth)
 {
     SwapChain11 *swapChain11 = SwapChain11::makeSwapChain11(swapChain);