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