Adds RenderTarget11 type

TRAC #22134

Signed-off-by: Nicolas Capens
Signed-off-by: Daniel Koch

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1481 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/libGLESv2.vcxproj b/src/libGLESv2/libGLESv2.vcxproj
index 04dbedd..b394843 100644
--- a/src/libGLESv2/libGLESv2.vcxproj
+++ b/src/libGLESv2/libGLESv2.vcxproj
@@ -252,6 +252,7 @@
     <ClCompile Include="renderer\Renderer9.cpp" />

     <ClCompile Include="renderer\Image.cpp" />

     <ClCompile Include="renderer\renderer9_utils.cpp" />

+    <ClCompile Include="renderer\RenderTarget11.cpp" />

     <ClCompile Include="renderer\RenderTarget9.cpp" />

     <ClCompile Include="renderer\RenderStateCache.cpp" />

     <ClCompile Include="renderer\SwapChain11.cpp" />

@@ -293,6 +294,7 @@
     <ClInclude Include="renderer\Renderer9.h" />

     <ClInclude Include="renderer\renderer9_utils.h" />

     <ClInclude Include="renderer\RenderTarget.h" />

+    <ClInclude Include="renderer\RenderTarget11.h" />

     <ClInclude Include="renderer\RenderTarget9.h" />

     <ClInclude Include="renderer\RenderStateCache.h" />

     <ClInclude Include="renderer\ShaderCache.h" />

diff --git a/src/libGLESv2/libGLESv2.vcxproj.filters b/src/libGLESv2/libGLESv2.vcxproj.filters
index d04e14a..5b01d08 100644
--- a/src/libGLESv2/libGLESv2.vcxproj.filters
+++ b/src/libGLESv2/libGLESv2.vcxproj.filters
@@ -125,6 +125,9 @@
     <ClCompile Include="renderer\SwapChain11.cpp">

       <Filter>Renderer</Filter>

     </ClCompile>

+    <ClCompile Include="renderer\RenderTarget11.cpp">

+      <Filter>Renderer</Filter>

+    </ClCompile>

   </ItemGroup>

   <ItemGroup>

     <ClInclude Include="BinaryStream.h">

@@ -256,6 +259,9 @@
     <ClInclude Include="renderer\SwapChain11.h">

       <Filter>Renderer</Filter>

     </ClInclude>

+    <ClInclude Include="renderer\RenderTarget11.h">

+      <Filter>Renderer</Filter>

+    </ClInclude>

   </ItemGroup>

   <ItemGroup>

     <None Include="libGLESv2.def">

@@ -265,4 +271,4 @@
   <ItemGroup>

     <ResourceCompile Include="libGLESv2.rc" />

   </ItemGroup>

-</Project>
\ No newline at end of file
+</Project>
diff --git a/src/libGLESv2/renderer/RenderTarget11.cpp b/src/libGLESv2/renderer/RenderTarget11.cpp
new file mode 100644
index 0000000..737d030
--- /dev/null
+++ b/src/libGLESv2/renderer/RenderTarget11.cpp
@@ -0,0 +1,78 @@
+//
+// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// RenderTarget11.cpp: Implements a DX11-specific wrapper for ID3D11View pointers
+// retained by Renderbuffers.
+
+#include "libGLESv2/renderer/RenderTarget11.h"
+#include "libGLESv2/renderer/Renderer11.h"
+
+#include "libGLESv2/renderer/renderer11_utils.h"
+#include "libGLESv2/main.h"
+
+namespace rx
+{
+
+RenderTarget11::RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *view, GLsizei width, GLsizei height)
+{
+    mRenderer = Renderer11::makeRenderer11(renderer);
+    mRenderTarget = view;
+    mDepthStencil = NULL;
+
+    if (mRenderTarget)
+    {
+        D3D11_RENDER_TARGET_VIEW_DESC desc;
+        view->GetDesc(&desc);
+
+        mWidth = width;
+        mHeight = height;
+        
+        mInternalFormat = d3d11_gl::ConvertRenderbufferFormat(desc.Format);
+        mActualFormat = d3d11_gl::ConvertRenderbufferFormat(desc.Format);
+        mSamples = 1; // TEMP?
+    }
+}
+
+RenderTarget11::RenderTarget11(Renderer *renderer, ID3D11DepthStencilView *view, GLsizei width, GLsizei height)
+{
+    mRenderer = Renderer11::makeRenderer11(renderer);
+    mRenderTarget = NULL;
+    mDepthStencil = view;
+
+    if (mDepthStencil)
+    {
+        D3D11_DEPTH_STENCIL_VIEW_DESC desc;
+        view->GetDesc(&desc);
+
+        mWidth = width;
+        mHeight = height;
+        
+        mInternalFormat = d3d11_gl::ConvertRenderbufferFormat(desc.Format);
+        mActualFormat = d3d11_gl::ConvertRenderbufferFormat(desc.Format);
+        mSamples = 1; // TEMP?
+    }
+}
+
+RenderTarget11::~RenderTarget11()
+{
+    if (mRenderTarget)
+    {
+        mRenderTarget->Release();
+    }
+
+    if (mDepthStencil)
+    {
+        mDepthStencil->Release();
+    }
+}
+
+RenderTarget11 *RenderTarget11::makeRenderTarget11(RenderTarget *target)
+{
+    ASSERT(dynamic_cast<rx::RenderTarget11*>(target) != NULL);
+    return static_cast<rx::RenderTarget11*>(target);
+}
+
+}
\ No newline at end of file
diff --git a/src/libGLESv2/renderer/RenderTarget11.h b/src/libGLESv2/renderer/RenderTarget11.h
new file mode 100644
index 0000000..1980575
--- /dev/null
+++ b/src/libGLESv2/renderer/RenderTarget11.h
@@ -0,0 +1,42 @@
+//
+// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// RenderTarget11.h: Defines a DX11-specific wrapper for ID3D11View pointers
+// retained by Renderbuffers.
+
+#ifndef LIBGLESV2_RENDERER_RENDERTARGET11_H_
+#define LIBGLESV2_RENDERER_RENDERTARGET11_H_
+
+#include <d3d11.h>
+
+#include "libGLESv2/renderer/RenderTarget.h"
+
+namespace rx
+{
+class Renderer;
+class Renderer11;
+
+class RenderTarget11 : public RenderTarget
+{
+  public:
+    RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *view, GLsizei width, GLsizei height);
+    RenderTarget11(Renderer *renderer, ID3D11DepthStencilView *view, GLsizei width, GLsizei height);
+    virtual ~RenderTarget11();
+
+    static RenderTarget11 *makeRenderTarget11(RenderTarget *renderTarget);
+
+  private:
+    DISALLOW_COPY_AND_ASSIGN(RenderTarget11);
+
+    ID3D11RenderTargetView *mRenderTarget;
+    ID3D11DepthStencilView *mDepthStencil;
+
+    Renderer11 *mRenderer;
+};
+
+}
+
+#endif LIBGLESV2_RENDERER_RENDERTARGET11_H_
\ No newline at end of file
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index bdf7bc7..0bc1990 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -11,6 +11,7 @@
 #include "libGLESv2/utilities.h"
 #include "libGLESv2/mathutil.h"
 #include "libGLESv2/renderer/Renderer11.h"
+#include "libGLESv2/renderer/RenderTarget11.h"
 #include "libGLESv2/renderer/renderer11_utils.h"
 #include "libGLESv2/renderer/SwapChain11.h"
 
@@ -730,9 +731,17 @@
 
 RenderTarget *Renderer11::createRenderTarget(SwapChain *swapChain, bool depth)
 {
-    // TODO
-    UNIMPLEMENTED();
-    return NULL;
+    SwapChain11 *swapChain11 = SwapChain11::makeSwapChain11(swapChain); 
+    RenderTarget11 *renderTarget = NULL;
+    if (depth)
+    {
+        renderTarget = new RenderTarget11(this, swapChain11->getDepthStencil(), swapChain11->getWidth(), swapChain11->getHeight());
+    }
+    else
+    {
+        renderTarget = new RenderTarget11(this, swapChain11->getRenderTarget(), swapChain11->getWidth(), swapChain11->getHeight());
+    }
+    return renderTarget;
 }
 
 RenderTarget *Renderer11::createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth)
diff --git a/src/libGLESv2/renderer/SwapChain11.h b/src/libGLESv2/renderer/SwapChain11.h
index d912e80..9c74e2c 100644
--- a/src/libGLESv2/renderer/SwapChain11.h
+++ b/src/libGLESv2/renderer/SwapChain11.h
@@ -32,6 +32,9 @@
     virtual ID3D11DepthStencilView *getDepthStencil();
     virtual ID3D11Texture2D *getOffscreenTexture();
 
+    EGLint getWidth() const { return mWidth; }
+    EGLint getHeight() const { return mHeight; }
+
     static SwapChain11 *makeSwapChain11(SwapChain *swapChain);
 
   private: