• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2012 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // RenderTarget9.cpp: Implements a D3D9-specific wrapper for IDirect3DSurface9
8 // pointers retained by renderbuffers.
9 
10 #include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h"
11 #include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
12 #include "libANGLE/renderer/d3d/d3d9/SwapChain9.h"
13 #include "libANGLE/renderer/d3d/d3d9/formatutils9.h"
14 #include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h"
15 
16 namespace rx
17 {
18 
19 // TODO: AddRef the incoming surface to take ownership instead of expecting that its ref is being
20 // given.
TextureRenderTarget9(IDirect3DBaseTexture9 * texture,size_t textureLevel,IDirect3DSurface9 * surface,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth,GLsizei samples)21 TextureRenderTarget9::TextureRenderTarget9(IDirect3DBaseTexture9 *texture,
22                                            size_t textureLevel,
23                                            IDirect3DSurface9 *surface,
24                                            GLenum internalFormat,
25                                            GLsizei width,
26                                            GLsizei height,
27                                            GLsizei depth,
28                                            GLsizei samples)
29     : mWidth(width),
30       mHeight(height),
31       mDepth(depth),
32       mInternalFormat(internalFormat),
33       mD3DFormat(D3DFMT_UNKNOWN),
34       mSamples(samples),
35       mTexture(texture),
36       mTextureLevel(textureLevel),
37       mRenderTarget(surface)
38 {
39     ASSERT(mDepth == 1);
40 
41     if (mRenderTarget)
42     {
43         D3DSURFACE_DESC description;
44         mRenderTarget->GetDesc(&description);
45         mD3DFormat = description.Format;
46     }
47 }
48 
~TextureRenderTarget9()49 TextureRenderTarget9::~TextureRenderTarget9()
50 {
51     SafeRelease(mTexture);
52     SafeRelease(mRenderTarget);
53 }
54 
getWidth() const55 GLsizei TextureRenderTarget9::getWidth() const
56 {
57     return mWidth;
58 }
59 
getHeight() const60 GLsizei TextureRenderTarget9::getHeight() const
61 {
62     return mHeight;
63 }
64 
getDepth() const65 GLsizei TextureRenderTarget9::getDepth() const
66 {
67     return mDepth;
68 }
69 
getInternalFormat() const70 GLenum TextureRenderTarget9::getInternalFormat() const
71 {
72     return mInternalFormat;
73 }
74 
getSamples() const75 GLsizei TextureRenderTarget9::getSamples() const
76 {
77     return mSamples;
78 }
79 
getTexture() const80 IDirect3DBaseTexture9 *TextureRenderTarget9::getTexture() const
81 {
82     return mTexture;
83 }
84 
getTextureLevel() const85 size_t TextureRenderTarget9::getTextureLevel() const
86 {
87     return mTextureLevel;
88 }
89 
getSurface() const90 IDirect3DSurface9 *TextureRenderTarget9::getSurface() const
91 {
92     // Caller is responsible for releasing the returned surface reference.
93     // TODO: remove the AddRef to match RenderTarget11
94     if (mRenderTarget)
95     {
96         mRenderTarget->AddRef();
97     }
98 
99     return mRenderTarget;
100 }
101 
getD3DFormat() const102 D3DFORMAT TextureRenderTarget9::getD3DFormat() const
103 {
104     return mD3DFormat;
105 }
106 
SurfaceRenderTarget9(SwapChain9 * swapChain,bool depth)107 SurfaceRenderTarget9::SurfaceRenderTarget9(SwapChain9 *swapChain, bool depth)
108     : mSwapChain(swapChain), mDepth(depth)
109 {}
110 
~SurfaceRenderTarget9()111 SurfaceRenderTarget9::~SurfaceRenderTarget9() {}
112 
getWidth() const113 GLsizei SurfaceRenderTarget9::getWidth() const
114 {
115     return mSwapChain->getWidth();
116 }
117 
getHeight() const118 GLsizei SurfaceRenderTarget9::getHeight() const
119 {
120     return mSwapChain->getHeight();
121 }
122 
getDepth() const123 GLsizei SurfaceRenderTarget9::getDepth() const
124 {
125     return 1;
126 }
127 
getInternalFormat() const128 GLenum SurfaceRenderTarget9::getInternalFormat() const
129 {
130     return (mDepth ? mSwapChain->getDepthBufferInternalFormat()
131                    : mSwapChain->getRenderTargetInternalFormat());
132 }
133 
getSamples() const134 GLsizei SurfaceRenderTarget9::getSamples() const
135 {
136     // Our EGL surfaces do not support multisampling.
137     return 0;
138 }
139 
getSurface() const140 IDirect3DSurface9 *SurfaceRenderTarget9::getSurface() const
141 {
142     return (mDepth ? mSwapChain->getDepthStencil() : mSwapChain->getRenderTarget());
143 }
144 
getTexture() const145 IDirect3DBaseTexture9 *SurfaceRenderTarget9::getTexture() const
146 {
147     return (mDepth ? nullptr : mSwapChain->getOffscreenTexture());
148 }
149 
getTextureLevel() const150 size_t SurfaceRenderTarget9::getTextureLevel() const
151 {
152     return 0;
153 }
154 
getD3DFormat() const155 D3DFORMAT SurfaceRenderTarget9::getD3DFormat() const
156 {
157     return d3d9::GetTextureFormatInfo(getInternalFormat()).texFormat;
158 }
159 
160 }  // namespace rx
161