RenderTarget11.cpp (11829B)
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 // RenderTarget11.cpp: Implements a DX11-specific wrapper for ID3D11View pointers 8 // retained by Renderbuffers. 9 10 #include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h" 11 12 #include "libANGLE/Context.h" 13 #include "libANGLE/renderer/d3d/d3d11/Context11.h" 14 #include "libANGLE/renderer/d3d/d3d11/Renderer11.h" 15 #include "libANGLE/renderer/d3d/d3d11/SwapChain11.h" 16 #include "libANGLE/renderer/d3d/d3d11/formatutils11.h" 17 #include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" 18 #include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" 19 20 namespace rx 21 { 22 23 namespace 24 { 25 bool GetTextureProperties(ID3D11Resource *resource, unsigned int *mipLevels, unsigned int *samples) 26 { 27 ID3D11Texture1D *texture1D = d3d11::DynamicCastComObject<ID3D11Texture1D>(resource); 28 if (texture1D) 29 { 30 D3D11_TEXTURE1D_DESC texDesc; 31 texture1D->GetDesc(&texDesc); 32 SafeRelease(texture1D); 33 34 *mipLevels = texDesc.MipLevels; 35 *samples = 0; 36 37 return true; 38 } 39 40 ID3D11Texture2D *texture2D = d3d11::DynamicCastComObject<ID3D11Texture2D>(resource); 41 if (texture2D) 42 { 43 D3D11_TEXTURE2D_DESC texDesc; 44 texture2D->GetDesc(&texDesc); 45 SafeRelease(texture2D); 46 47 *mipLevels = texDesc.MipLevels; 48 *samples = texDesc.SampleDesc.Count > 1 ? texDesc.SampleDesc.Count : 0; 49 50 return true; 51 } 52 53 ID3D11Texture3D *texture3D = d3d11::DynamicCastComObject<ID3D11Texture3D>(resource); 54 if (texture3D) 55 { 56 D3D11_TEXTURE3D_DESC texDesc; 57 texture3D->GetDesc(&texDesc); 58 SafeRelease(texture3D); 59 60 *mipLevels = texDesc.MipLevels; 61 *samples = 0; 62 63 return true; 64 } 65 66 return false; 67 } 68 69 unsigned int GetRTVSubresourceIndex(ID3D11Resource *resource, ID3D11RenderTargetView *view) 70 { 71 D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; 72 view->GetDesc(&rtvDesc); 73 74 unsigned int mipSlice = 0; 75 unsigned int arraySlice = 0; 76 77 switch (rtvDesc.ViewDimension) 78 { 79 case D3D11_RTV_DIMENSION_TEXTURE1D: 80 mipSlice = rtvDesc.Texture1D.MipSlice; 81 arraySlice = 0; 82 break; 83 84 case D3D11_RTV_DIMENSION_TEXTURE1DARRAY: 85 mipSlice = rtvDesc.Texture1DArray.MipSlice; 86 arraySlice = rtvDesc.Texture1DArray.FirstArraySlice; 87 break; 88 89 case D3D11_RTV_DIMENSION_TEXTURE2D: 90 mipSlice = rtvDesc.Texture2D.MipSlice; 91 arraySlice = 0; 92 break; 93 94 case D3D11_RTV_DIMENSION_TEXTURE2DARRAY: 95 mipSlice = rtvDesc.Texture2DArray.MipSlice; 96 arraySlice = rtvDesc.Texture2DArray.FirstArraySlice; 97 break; 98 99 case D3D11_RTV_DIMENSION_TEXTURE2DMS: 100 mipSlice = 0; 101 arraySlice = 0; 102 break; 103 104 case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY: 105 mipSlice = 0; 106 arraySlice = rtvDesc.Texture2DMSArray.FirstArraySlice; 107 break; 108 109 case D3D11_RTV_DIMENSION_TEXTURE3D: 110 mipSlice = rtvDesc.Texture3D.MipSlice; 111 arraySlice = 0; 112 break; 113 114 case D3D11_RTV_DIMENSION_UNKNOWN: 115 case D3D11_RTV_DIMENSION_BUFFER: 116 UNIMPLEMENTED(); 117 break; 118 119 default: 120 UNREACHABLE(); 121 break; 122 } 123 124 unsigned int mipLevels, samples; 125 GetTextureProperties(resource, &mipLevels, &samples); 126 127 return D3D11CalcSubresource(mipSlice, arraySlice, mipLevels); 128 } 129 130 unsigned int GetDSVSubresourceIndex(ID3D11Resource *resource, ID3D11DepthStencilView *view) 131 { 132 D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; 133 view->GetDesc(&dsvDesc); 134 135 unsigned int mipSlice = 0; 136 unsigned int arraySlice = 0; 137 138 switch (dsvDesc.ViewDimension) 139 { 140 case D3D11_DSV_DIMENSION_TEXTURE1D: 141 mipSlice = dsvDesc.Texture1D.MipSlice; 142 arraySlice = 0; 143 break; 144 145 case D3D11_DSV_DIMENSION_TEXTURE1DARRAY: 146 mipSlice = dsvDesc.Texture1DArray.MipSlice; 147 arraySlice = dsvDesc.Texture1DArray.FirstArraySlice; 148 break; 149 150 case D3D11_DSV_DIMENSION_TEXTURE2D: 151 mipSlice = dsvDesc.Texture2D.MipSlice; 152 arraySlice = 0; 153 break; 154 155 case D3D11_DSV_DIMENSION_TEXTURE2DARRAY: 156 mipSlice = dsvDesc.Texture2DArray.MipSlice; 157 arraySlice = dsvDesc.Texture2DArray.FirstArraySlice; 158 break; 159 160 case D3D11_DSV_DIMENSION_TEXTURE2DMS: 161 mipSlice = 0; 162 arraySlice = 0; 163 break; 164 165 case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY: 166 mipSlice = 0; 167 arraySlice = dsvDesc.Texture2DMSArray.FirstArraySlice; 168 break; 169 170 case D3D11_DSV_DIMENSION_UNKNOWN: 171 UNIMPLEMENTED(); 172 break; 173 174 default: 175 UNREACHABLE(); 176 break; 177 } 178 179 unsigned int mipLevels, samples; 180 GetTextureProperties(resource, &mipLevels, &samples); 181 182 return D3D11CalcSubresource(mipSlice, arraySlice, mipLevels); 183 } 184 185 GLenum GetSurfaceRTFormat(bool depth, SwapChain11 *swapChain) 186 { 187 return (depth ? swapChain->getDepthBufferInternalFormat() 188 : swapChain->getRenderTargetInternalFormat()); 189 } 190 191 const d3d11::Format &GetSurfaceFormatSet(bool depth, SwapChain11 *swapChain, Renderer11 *renderer) 192 { 193 return d3d11::Format::Get(GetSurfaceRTFormat(depth, swapChain), 194 renderer->getRenderer11DeviceCaps()); 195 } 196 197 } // anonymous namespace 198 199 RenderTarget11::RenderTarget11(const d3d11::Format &formatSet) : mFormatSet(formatSet) {} 200 201 RenderTarget11::~RenderTarget11() {} 202 203 TextureRenderTarget11::TextureRenderTarget11(d3d11::RenderTargetView &&rtv, 204 const TextureHelper11 &resource, 205 const d3d11::SharedSRV &srv, 206 const d3d11::SharedSRV &blitSRV, 207 GLenum internalFormat, 208 const d3d11::Format &formatSet, 209 GLsizei width, 210 GLsizei height, 211 GLsizei depth, 212 GLsizei samples) 213 : RenderTarget11(formatSet), 214 mWidth(width), 215 mHeight(height), 216 mDepth(depth), 217 mInternalFormat(internalFormat), 218 mSamples(samples), 219 mSubresourceIndex(0), 220 mTexture(resource), 221 mRenderTarget(std::move(rtv)), 222 mDepthStencil(), 223 mShaderResource(srv.makeCopy()), 224 mBlitShaderResource(blitSRV.makeCopy()) 225 { 226 if (mRenderTarget.valid() && mTexture.valid()) 227 { 228 mSubresourceIndex = GetRTVSubresourceIndex(mTexture.get(), mRenderTarget.get()); 229 } 230 ASSERT(mFormatSet.formatID != angle::FormatID::NONE || mWidth == 0 || mHeight == 0); 231 } 232 233 TextureRenderTarget11::TextureRenderTarget11(d3d11::DepthStencilView &&dsv, 234 const TextureHelper11 &resource, 235 const d3d11::SharedSRV &srv, 236 GLenum internalFormat, 237 const d3d11::Format &formatSet, 238 GLsizei width, 239 GLsizei height, 240 GLsizei depth, 241 GLsizei samples) 242 : RenderTarget11(formatSet), 243 mWidth(width), 244 mHeight(height), 245 mDepth(depth), 246 mInternalFormat(internalFormat), 247 mSamples(samples), 248 mSubresourceIndex(0), 249 mTexture(resource), 250 mRenderTarget(), 251 mDepthStencil(std::move(dsv)), 252 mShaderResource(srv.makeCopy()), 253 mBlitShaderResource() 254 { 255 if (mDepthStencil.valid() && mTexture.valid()) 256 { 257 mSubresourceIndex = GetDSVSubresourceIndex(mTexture.get(), mDepthStencil.get()); 258 } 259 ASSERT(mFormatSet.formatID != angle::FormatID::NONE || mWidth == 0 || mHeight == 0); 260 } 261 262 TextureRenderTarget11::~TextureRenderTarget11() {} 263 264 const TextureHelper11 &TextureRenderTarget11::getTexture() const 265 { 266 return mTexture; 267 } 268 269 const d3d11::RenderTargetView &TextureRenderTarget11::getRenderTargetView() const 270 { 271 return mRenderTarget; 272 } 273 274 const d3d11::DepthStencilView &TextureRenderTarget11::getDepthStencilView() const 275 { 276 return mDepthStencil; 277 } 278 279 angle::Result TextureRenderTarget11::getShaderResourceView(const gl::Context *context, 280 const d3d11::SharedSRV **outSRV) 281 { 282 *outSRV = &mShaderResource; 283 return angle::Result::Continue; 284 } 285 286 angle::Result TextureRenderTarget11::getBlitShaderResourceView(const gl::Context *context, 287 const d3d11::SharedSRV **outSRV) 288 { 289 *outSRV = &mBlitShaderResource; 290 return angle::Result::Continue; 291 } 292 293 GLsizei TextureRenderTarget11::getWidth() const 294 { 295 return mWidth; 296 } 297 298 GLsizei TextureRenderTarget11::getHeight() const 299 { 300 return mHeight; 301 } 302 303 GLsizei TextureRenderTarget11::getDepth() const 304 { 305 return mDepth; 306 } 307 308 GLenum TextureRenderTarget11::getInternalFormat() const 309 { 310 return mInternalFormat; 311 } 312 313 GLsizei TextureRenderTarget11::getSamples() const 314 { 315 return mSamples; 316 } 317 318 unsigned int TextureRenderTarget11::getSubresourceIndex() const 319 { 320 return mSubresourceIndex; 321 } 322 323 SurfaceRenderTarget11::SurfaceRenderTarget11(SwapChain11 *swapChain, 324 Renderer11 *renderer, 325 bool depth) 326 : RenderTarget11(GetSurfaceFormatSet(depth, swapChain, renderer)), 327 mSwapChain(swapChain), 328 mDepth(depth) 329 { 330 ASSERT(mSwapChain); 331 } 332 333 SurfaceRenderTarget11::~SurfaceRenderTarget11() {} 334 335 GLsizei SurfaceRenderTarget11::getWidth() const 336 { 337 return mSwapChain->getWidth(); 338 } 339 340 GLsizei SurfaceRenderTarget11::getHeight() const 341 { 342 return mSwapChain->getHeight(); 343 } 344 345 GLsizei SurfaceRenderTarget11::getDepth() const 346 { 347 return 1; 348 } 349 350 GLenum SurfaceRenderTarget11::getInternalFormat() const 351 { 352 return GetSurfaceRTFormat(mDepth, mSwapChain); 353 } 354 355 GLsizei SurfaceRenderTarget11::getSamples() const 356 { 357 return mSwapChain->getSamples(); 358 } 359 360 const TextureHelper11 &SurfaceRenderTarget11::getTexture() const 361 { 362 return (mDepth ? mSwapChain->getDepthStencilTexture() : mSwapChain->getOffscreenTexture()); 363 } 364 365 const d3d11::RenderTargetView &SurfaceRenderTarget11::getRenderTargetView() const 366 { 367 ASSERT(!mDepth); 368 return mSwapChain->getRenderTarget(); 369 } 370 371 const d3d11::DepthStencilView &SurfaceRenderTarget11::getDepthStencilView() const 372 { 373 ASSERT(mDepth); 374 return mSwapChain->getDepthStencil(); 375 } 376 377 angle::Result SurfaceRenderTarget11::getShaderResourceView(const gl::Context *context, 378 const d3d11::SharedSRV **outSRV) 379 { 380 if (mDepth) 381 { 382 *outSRV = &mSwapChain->getDepthStencilShaderResource(); 383 } 384 else 385 { 386 ANGLE_TRY(mSwapChain->getRenderTargetShaderResource(GetImplAs<Context11>(context), outSRV)); 387 } 388 return angle::Result::Continue; 389 } 390 391 angle::Result SurfaceRenderTarget11::getBlitShaderResourceView(const gl::Context *context, 392 const d3d11::SharedSRV **outSRV) 393 { 394 // The SurfaceRenderTargetView format should always be such that the normal SRV works for blits. 395 return getShaderResourceView(context, outSRV); 396 } 397 398 unsigned int SurfaceRenderTarget11::getSubresourceIndex() const 399 { 400 return 0; 401 } 402 403 } // namespace rx