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/dx11proto@2025 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index 3e39fc3..a2e3895 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -2686,8 +2686,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;
@@ -2709,11 +2709,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();
@@ -2721,6 +2720,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);
diff --git a/src/libGLESv2/renderer/Renderer11.h b/src/libGLESv2/renderer/Renderer11.h
index 4065dac..51e7fa7 100644
--- a/src/libGLESv2/renderer/Renderer11.h
+++ b/src/libGLESv2/renderer/Renderer11.h
@@ -179,6 +179,8 @@
     IDXGIFactory *getDxgiFactory() { return mDxgiFactory; };
 
     bool getRenderTargetResource(gl::Renderbuffer *colorbuffer, unsigned int *subresourceIndex, ID3D11Texture2D **resource);
+    void unapplyRenderTargets();
+    void setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView);
 
   private:
     DISALLOW_COPY_AND_ASSIGN(Renderer11);
diff --git a/src/libGLESv2/renderer/SwapChain11.cpp b/src/libGLESv2/renderer/SwapChain11.cpp
index 846e53a..1bbfad5 100644
--- a/src/libGLESv2/renderer/SwapChain11.cpp
+++ b/src/libGLESv2/renderer/SwapChain11.cpp
@@ -649,7 +649,7 @@
     deviceContext->GSSetShader(NULL, NULL, 0);
 
     // Apply render targets
-    deviceContext->OMSetRenderTargets(1, &mBackBufferRTView, NULL);
+    mRenderer->setOneTimeRenderTarget(mBackBufferRTView);
 
     // Set the viewport
     D3D11_VIEWPORT viewport;
@@ -689,9 +689,7 @@
     static ID3D11ShaderResourceView *const nullSRV = NULL;
     deviceContext->PSSetShaderResources(0, 1, &nullSRV);
 
-    static ID3D11RenderTargetView *const nullRTV = NULL;
-    deviceContext->OMSetRenderTargets(1, &nullRTV, NULL);
-
+    mRenderer->unapplyRenderTargets();
     mRenderer->markAllStateDirty();
 
     return EGL_SUCCESS;