shannon.woods@transgaming.com | bdf2d80 | 2013-02-28 23:16:20 +0000 | [diff] [blame] | 1 | #include "precompiled.h" |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 2 | // |
Nicolas Capens | 930f05e | 2013-06-18 15:31:58 -0400 | [diff] [blame] | 3 | // Copyright (c) 2012-2013 The ANGLE Project Authors. All rights reserved. |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 4 | // Use of this source code is governed by a BSD-style license that can be |
| 5 | // found in the LICENSE file. |
| 6 | // |
| 7 | |
| 8 | // TextureStorage9.cpp: Implements the abstract rx::TextureStorage9 class and its concrete derived |
daniel@transgaming.com | 87705f8 | 2012-12-20 21:10:45 +0000 | [diff] [blame] | 9 | // classes TextureStorage9_2D and TextureStorage9_Cube, which act as the interface to the |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 10 | // D3D9 texture. |
| 11 | |
| 12 | #include "libGLESv2/main.h" |
Geoff Lang | d47e0fc | 2013-08-29 11:40:43 -0400 | [diff] [blame] | 13 | #include "libGLESv2/renderer/d3d9/Renderer9.h" |
| 14 | #include "libGLESv2/renderer/d3d9/TextureStorage9.h" |
| 15 | #include "libGLESv2/renderer/d3d9/SwapChain9.h" |
| 16 | #include "libGLESv2/renderer/d3d9/RenderTarget9.h" |
| 17 | #include "libGLESv2/renderer/d3d9/renderer9_utils.h" |
| 18 | #include "libGLESv2/renderer/d3d9/formatutils9.h" |
shannon.woods@transgaming.com | d2811d6 | 2013-02-28 23:11:19 +0000 | [diff] [blame] | 19 | #include "libGLESv2/Texture.h" |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 20 | |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 21 | namespace rx |
| 22 | { |
Nicolas Capens | fa7b76d | 2014-03-31 14:51:45 -0400 | [diff] [blame] | 23 | TextureStorage9::TextureStorage9(Renderer *renderer, DWORD usage) |
Nicolas Capens | f61738a | 2014-03-31 14:50:18 -0400 | [diff] [blame] | 24 | : mTopLevel(0), |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 25 | mRenderer(Renderer9::makeRenderer9(renderer)), |
| 26 | mD3DUsage(usage), |
| 27 | mD3DPool(mRenderer->getTexturePool(usage)) |
| 28 | { |
| 29 | } |
| 30 | |
| 31 | TextureStorage9::~TextureStorage9() |
| 32 | { |
| 33 | } |
| 34 | |
daniel@transgaming.com | 87705f8 | 2012-12-20 21:10:45 +0000 | [diff] [blame] | 35 | TextureStorage9 *TextureStorage9::makeTextureStorage9(TextureStorage *storage) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 36 | { |
apatrick@chromium.org | 8b400b1 | 2013-01-30 21:53:40 +0000 | [diff] [blame] | 37 | ASSERT(HAS_DYNAMIC_TYPE(TextureStorage9*, storage)); |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 38 | return static_cast<TextureStorage9*>(storage); |
| 39 | } |
| 40 | |
Jamie Madill | d4589c9 | 2013-10-24 17:49:34 -0400 | [diff] [blame] | 41 | DWORD TextureStorage9::GetTextureUsage(GLenum internalformat, Renderer9 *renderer, bool renderTarget) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 42 | { |
shannonwoods@chromium.org | adc5635 | 2013-05-30 00:09:08 +0000 | [diff] [blame] | 43 | GLuint clientVersion = renderer->getCurrentClientVersion(); |
| 44 | |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 45 | DWORD d3dusage = 0; |
| 46 | |
shannonwoods@chromium.org | adc5635 | 2013-05-30 00:09:08 +0000 | [diff] [blame] | 47 | if (gl::GetDepthBits(internalformat, clientVersion) > 0 || |
| 48 | gl::GetStencilBits(internalformat, clientVersion) > 0) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 49 | { |
| 50 | d3dusage |= D3DUSAGE_DEPTHSTENCIL; |
| 51 | } |
Jamie Madill | d4589c9 | 2013-10-24 17:49:34 -0400 | [diff] [blame] | 52 | else if (renderTarget && (gl_d3d9::GetRenderFormat(internalformat, renderer) != D3DFMT_UNKNOWN)) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 53 | { |
| 54 | d3dusage |= D3DUSAGE_RENDERTARGET; |
| 55 | } |
shannonwoods@chromium.org | adc5635 | 2013-05-30 00:09:08 +0000 | [diff] [blame] | 56 | |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 57 | return d3dusage; |
| 58 | } |
| 59 | |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 60 | |
| 61 | bool TextureStorage9::isRenderTarget() const |
| 62 | { |
| 63 | return (mD3DUsage & (D3DUSAGE_RENDERTARGET | D3DUSAGE_DEPTHSTENCIL)) != 0; |
| 64 | } |
| 65 | |
| 66 | bool TextureStorage9::isManaged() const |
| 67 | { |
| 68 | return (mD3DPool == D3DPOOL_MANAGED); |
| 69 | } |
| 70 | |
| 71 | D3DPOOL TextureStorage9::getPool() const |
| 72 | { |
| 73 | return mD3DPool; |
| 74 | } |
| 75 | |
| 76 | DWORD TextureStorage9::getUsage() const |
| 77 | { |
| 78 | return mD3DUsage; |
| 79 | } |
| 80 | |
Nicolas Capens | f61738a | 2014-03-31 14:50:18 -0400 | [diff] [blame] | 81 | int TextureStorage9::getTopLevel() const |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 82 | { |
Nicolas Capens | f61738a | 2014-03-31 14:50:18 -0400 | [diff] [blame] | 83 | return mTopLevel; |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 84 | } |
| 85 | |
Nicolas Capens | bf712d0 | 2014-03-31 14:23:35 -0400 | [diff] [blame] | 86 | int TextureStorage9::getLevelCount() const |
Jamie Madill | 4cfff5f | 2013-10-24 17:49:46 -0400 | [diff] [blame] | 87 | { |
Nicolas Capens | fa7b76d | 2014-03-31 14:51:45 -0400 | [diff] [blame] | 88 | return getBaseTexture() ? (getBaseTexture()->GetLevelCount() - getTopLevel()) : 0; |
Jamie Madill | 4cfff5f | 2013-10-24 17:49:46 -0400 | [diff] [blame] | 89 | } |
| 90 | |
| 91 | TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, SwapChain9 *swapchain) |
Nicolas Capens | fa7b76d | 2014-03-31 14:51:45 -0400 | [diff] [blame] | 92 | : TextureStorage9(renderer, D3DUSAGE_RENDERTARGET) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 93 | { |
| 94 | IDirect3DTexture9 *surfaceTexture = swapchain->getOffscreenTexture(); |
| 95 | mTexture = surfaceTexture; |
daniel@transgaming.com | 5cdd058 | 2013-01-11 04:07:35 +0000 | [diff] [blame] | 96 | mRenderTarget = NULL; |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 97 | |
| 98 | initializeRenderTarget(); |
| 99 | } |
| 100 | |
Nicolas Capens | bf712d0 | 2014-03-31 14:23:35 -0400 | [diff] [blame] | 101 | TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels) |
Nicolas Capens | fa7b76d | 2014-03-31 14:51:45 -0400 | [diff] [blame] | 102 | : TextureStorage9(renderer, GetTextureUsage(internalformat, Renderer9::makeRenderer9(renderer), renderTarget)) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 103 | { |
| 104 | mTexture = NULL; |
daniel@transgaming.com | 5cdd058 | 2013-01-11 04:07:35 +0000 | [diff] [blame] | 105 | mRenderTarget = NULL; |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 106 | // if the width or height is not positive this should be treated as an incomplete texture |
| 107 | // we handle that here by skipping the d3d texture creation |
| 108 | if (width > 0 && height > 0) |
| 109 | { |
| 110 | IDirect3DDevice9 *device = mRenderer->getDevice(); |
Shannon Woods | ddb785c | 2013-07-08 10:32:13 -0400 | [diff] [blame] | 111 | D3DFORMAT format = gl_d3d9::GetTextureFormat(internalformat, mRenderer); |
Nicolas Capens | f61738a | 2014-03-31 14:50:18 -0400 | [diff] [blame] | 112 | d3d9::MakeValidSize(false, format, &width, &height, &mTopLevel); |
Nicolas Capens | bf712d0 | 2014-03-31 14:23:35 -0400 | [diff] [blame] | 113 | UINT creationLevels = (levels == 0) ? 0 : mTopLevel + levels; |
Jamie Madill | 4cfff5f | 2013-10-24 17:49:46 -0400 | [diff] [blame] | 114 | |
| 115 | HRESULT result = device->CreateTexture(width, height, creationLevels, getUsage(), format, getPool(), &mTexture, NULL); |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 116 | |
| 117 | if (FAILED(result)) |
| 118 | { |
| 119 | ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); |
shannon.woods@transgaming.com | 779aa26 | 2013-02-28 23:04:58 +0000 | [diff] [blame] | 120 | gl::error(GL_OUT_OF_MEMORY); |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 121 | } |
| 122 | } |
| 123 | |
| 124 | initializeRenderTarget(); |
| 125 | } |
| 126 | |
daniel@transgaming.com | 87705f8 | 2012-12-20 21:10:45 +0000 | [diff] [blame] | 127 | TextureStorage9_2D::~TextureStorage9_2D() |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 128 | { |
Geoff Lang | ea22863 | 2013-07-30 15:17:12 -0400 | [diff] [blame] | 129 | SafeRelease(mTexture); |
| 130 | SafeDelete(mRenderTarget); |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 131 | } |
| 132 | |
daniel@transgaming.com | 87705f8 | 2012-12-20 21:10:45 +0000 | [diff] [blame] | 133 | TextureStorage9_2D *TextureStorage9_2D::makeTextureStorage9_2D(TextureStorage *storage) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 134 | { |
apatrick@chromium.org | 8b400b1 | 2013-01-30 21:53:40 +0000 | [diff] [blame] | 135 | ASSERT(HAS_DYNAMIC_TYPE(TextureStorage9_2D*, storage)); |
daniel@transgaming.com | 87705f8 | 2012-12-20 21:10:45 +0000 | [diff] [blame] | 136 | return static_cast<TextureStorage9_2D*>(storage); |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 137 | } |
| 138 | |
| 139 | // Increments refcount on surface. |
| 140 | // caller must Release() the returned surface |
daniel@transgaming.com | 87705f8 | 2012-12-20 21:10:45 +0000 | [diff] [blame] | 141 | IDirect3DSurface9 *TextureStorage9_2D::getSurfaceLevel(int level, bool dirty) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 142 | { |
| 143 | IDirect3DSurface9 *surface = NULL; |
| 144 | |
| 145 | if (mTexture) |
| 146 | { |
Nicolas Capens | f61738a | 2014-03-31 14:50:18 -0400 | [diff] [blame] | 147 | HRESULT result = mTexture->GetSurfaceLevel(level + mTopLevel, &surface); |
Geoff Lang | 9cd1915 | 2014-05-28 15:54:34 -0400 | [diff] [blame] | 148 | UNUSED_ASSERTION_VARIABLE(result); |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 149 | ASSERT(SUCCEEDED(result)); |
| 150 | |
| 151 | // With managed textures the driver needs to be informed of updates to the lower mipmap levels |
Nicolas Capens | f61738a | 2014-03-31 14:50:18 -0400 | [diff] [blame] | 152 | if (level + mTopLevel != 0 && isManaged() && dirty) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 153 | { |
| 154 | mTexture->AddDirtyRect(NULL); |
| 155 | } |
| 156 | } |
| 157 | |
| 158 | return surface; |
| 159 | } |
| 160 | |
shannon.woods%transgaming.com@gtempaccount.com | 63b3b8f | 2013-04-13 03:43:26 +0000 | [diff] [blame] | 161 | RenderTarget *TextureStorage9_2D::getRenderTarget(int level) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 162 | { |
| 163 | return mRenderTarget; |
| 164 | } |
| 165 | |
daniel@transgaming.com | 87705f8 | 2012-12-20 21:10:45 +0000 | [diff] [blame] | 166 | void TextureStorage9_2D::generateMipmap(int level) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 167 | { |
| 168 | IDirect3DSurface9 *upper = getSurfaceLevel(level - 1, false); |
| 169 | IDirect3DSurface9 *lower = getSurfaceLevel(level, true); |
| 170 | |
| 171 | if (upper != NULL && lower != NULL) |
| 172 | { |
| 173 | mRenderer->boxFilter(upper, lower); |
| 174 | } |
| 175 | |
Geoff Lang | ea22863 | 2013-07-30 15:17:12 -0400 | [diff] [blame] | 176 | SafeRelease(upper); |
| 177 | SafeRelease(lower); |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 178 | } |
| 179 | |
daniel@transgaming.com | 87705f8 | 2012-12-20 21:10:45 +0000 | [diff] [blame] | 180 | IDirect3DBaseTexture9 *TextureStorage9_2D::getBaseTexture() const |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 181 | { |
| 182 | return mTexture; |
| 183 | } |
| 184 | |
daniel@transgaming.com | 87705f8 | 2012-12-20 21:10:45 +0000 | [diff] [blame] | 185 | void TextureStorage9_2D::initializeRenderTarget() |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 186 | { |
daniel@transgaming.com | 5cdd058 | 2013-01-11 04:07:35 +0000 | [diff] [blame] | 187 | ASSERT(mRenderTarget == NULL); |
| 188 | |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 189 | if (mTexture != NULL && isRenderTarget()) |
| 190 | { |
| 191 | IDirect3DSurface9 *surface = getSurfaceLevel(0, false); |
| 192 | |
| 193 | mRenderTarget = new RenderTarget9(mRenderer, surface); |
| 194 | } |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 195 | } |
| 196 | |
Nicolas Capens | bf712d0 | 2014-03-31 14:23:35 -0400 | [diff] [blame] | 197 | TextureStorage9_Cube::TextureStorage9_Cube(Renderer *renderer, GLenum internalformat, bool renderTarget, int size, int levels) |
Nicolas Capens | fa7b76d | 2014-03-31 14:51:45 -0400 | [diff] [blame] | 198 | : TextureStorage9(renderer, GetTextureUsage(internalformat, Renderer9::makeRenderer9(renderer), renderTarget)) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 199 | { |
| 200 | mTexture = NULL; |
daniel@transgaming.com | 5cdd058 | 2013-01-11 04:07:35 +0000 | [diff] [blame] | 201 | for (int i = 0; i < 6; ++i) |
| 202 | { |
| 203 | mRenderTarget[i] = NULL; |
| 204 | } |
| 205 | |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 206 | // if the size is not positive this should be treated as an incomplete texture |
| 207 | // we handle that here by skipping the d3d texture creation |
| 208 | if (size > 0) |
| 209 | { |
| 210 | IDirect3DDevice9 *device = mRenderer->getDevice(); |
| 211 | int height = size; |
Shannon Woods | ddb785c | 2013-07-08 10:32:13 -0400 | [diff] [blame] | 212 | D3DFORMAT format = gl_d3d9::GetTextureFormat(internalformat, mRenderer); |
Nicolas Capens | f61738a | 2014-03-31 14:50:18 -0400 | [diff] [blame] | 213 | d3d9::MakeValidSize(false, format, &size, &height, &mTopLevel); |
Nicolas Capens | bf712d0 | 2014-03-31 14:23:35 -0400 | [diff] [blame] | 214 | UINT creationLevels = (levels == 0) ? 0 : mTopLevel + levels; |
Jamie Madill | 4cfff5f | 2013-10-24 17:49:46 -0400 | [diff] [blame] | 215 | |
| 216 | HRESULT result = device->CreateCubeTexture(size, creationLevels, getUsage(), format, getPool(), &mTexture, NULL); |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 217 | |
| 218 | if (FAILED(result)) |
| 219 | { |
| 220 | ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); |
shannon.woods@transgaming.com | 779aa26 | 2013-02-28 23:04:58 +0000 | [diff] [blame] | 221 | gl::error(GL_OUT_OF_MEMORY); |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 222 | } |
| 223 | } |
| 224 | |
| 225 | initializeRenderTarget(); |
| 226 | } |
| 227 | |
daniel@transgaming.com | 87705f8 | 2012-12-20 21:10:45 +0000 | [diff] [blame] | 228 | TextureStorage9_Cube::~TextureStorage9_Cube() |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 229 | { |
Geoff Lang | ea22863 | 2013-07-30 15:17:12 -0400 | [diff] [blame] | 230 | SafeRelease(mTexture); |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 231 | |
| 232 | for (int i = 0; i < 6; ++i) |
| 233 | { |
Geoff Lang | ea22863 | 2013-07-30 15:17:12 -0400 | [diff] [blame] | 234 | SafeDelete(mRenderTarget[i]); |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 235 | } |
| 236 | } |
| 237 | |
daniel@transgaming.com | 87705f8 | 2012-12-20 21:10:45 +0000 | [diff] [blame] | 238 | TextureStorage9_Cube *TextureStorage9_Cube::makeTextureStorage9_Cube(TextureStorage *storage) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 239 | { |
apatrick@chromium.org | 8b400b1 | 2013-01-30 21:53:40 +0000 | [diff] [blame] | 240 | ASSERT(HAS_DYNAMIC_TYPE(TextureStorage9_Cube*, storage)); |
daniel@transgaming.com | 87705f8 | 2012-12-20 21:10:45 +0000 | [diff] [blame] | 241 | return static_cast<TextureStorage9_Cube*>(storage); |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 242 | } |
| 243 | |
| 244 | // Increments refcount on surface. |
| 245 | // caller must Release() the returned surface |
daniel@transgaming.com | 87705f8 | 2012-12-20 21:10:45 +0000 | [diff] [blame] | 246 | IDirect3DSurface9 *TextureStorage9_Cube::getCubeMapSurface(GLenum faceTarget, int level, bool dirty) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 247 | { |
| 248 | IDirect3DSurface9 *surface = NULL; |
| 249 | |
| 250 | if (mTexture) |
| 251 | { |
| 252 | D3DCUBEMAP_FACES face = gl_d3d9::ConvertCubeFace(faceTarget); |
Nicolas Capens | f61738a | 2014-03-31 14:50:18 -0400 | [diff] [blame] | 253 | HRESULT result = mTexture->GetCubeMapSurface(face, level + mTopLevel, &surface); |
Geoff Lang | 9cd1915 | 2014-05-28 15:54:34 -0400 | [diff] [blame] | 254 | UNUSED_ASSERTION_VARIABLE(result); |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 255 | ASSERT(SUCCEEDED(result)); |
| 256 | |
| 257 | // With managed textures the driver needs to be informed of updates to the lower mipmap levels |
| 258 | if (level != 0 && isManaged() && dirty) |
| 259 | { |
| 260 | mTexture->AddDirtyRect(face, NULL); |
| 261 | } |
| 262 | } |
| 263 | |
| 264 | return surface; |
| 265 | } |
| 266 | |
Nicolas Capens | 930f05e | 2013-06-18 15:31:58 -0400 | [diff] [blame] | 267 | RenderTarget *TextureStorage9_Cube::getRenderTargetFace(GLenum faceTarget, int level) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 268 | { |
Jamie Madill | 2db197c | 2013-10-24 17:49:35 -0400 | [diff] [blame] | 269 | return mRenderTarget[gl::TextureCubeMap::targetToIndex(faceTarget)]; |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 270 | } |
| 271 | |
Jamie Madill | 2db197c | 2013-10-24 17:49:35 -0400 | [diff] [blame] | 272 | void TextureStorage9_Cube::generateMipmap(int faceIndex, int level) |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 273 | { |
Jamie Madill | 2db197c | 2013-10-24 17:49:35 -0400 | [diff] [blame] | 274 | IDirect3DSurface9 *upper = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level - 1, false); |
| 275 | IDirect3DSurface9 *lower = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, level, true); |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 276 | |
| 277 | if (upper != NULL && lower != NULL) |
| 278 | { |
| 279 | mRenderer->boxFilter(upper, lower); |
| 280 | } |
| 281 | |
Geoff Lang | ea22863 | 2013-07-30 15:17:12 -0400 | [diff] [blame] | 282 | SafeRelease(upper); |
| 283 | SafeRelease(lower); |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 284 | } |
| 285 | |
daniel@transgaming.com | 87705f8 | 2012-12-20 21:10:45 +0000 | [diff] [blame] | 286 | IDirect3DBaseTexture9 *TextureStorage9_Cube::getBaseTexture() const |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 287 | { |
| 288 | return mTexture; |
| 289 | } |
| 290 | |
daniel@transgaming.com | 87705f8 | 2012-12-20 21:10:45 +0000 | [diff] [blame] | 291 | void TextureStorage9_Cube::initializeRenderTarget() |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 292 | { |
| 293 | if (mTexture != NULL && isRenderTarget()) |
| 294 | { |
| 295 | IDirect3DSurface9 *surface = NULL; |
| 296 | |
| 297 | for (int i = 0; i < 6; ++i) |
| 298 | { |
daniel@transgaming.com | 5cdd058 | 2013-01-11 04:07:35 +0000 | [diff] [blame] | 299 | ASSERT(mRenderTarget[i] == NULL); |
| 300 | |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 301 | surface = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, false); |
| 302 | |
| 303 | mRenderTarget[i] = new RenderTarget9(mRenderer, surface); |
| 304 | } |
| 305 | } |
daniel@transgaming.com | 34da397 | 2012-12-20 21:10:29 +0000 | [diff] [blame] | 306 | } |
| 307 | |
| 308 | } |