sge::d3d9::surface::d3d_unique_ptr sge::d3d9::texturefuncs::get_cube_map_surface( IDirect3DCubeTexture9 &_texture, sge::renderer::texture::cube_side const _side, sge::renderer::texture::mipmap::level const _level ) { IDirect3DSurface9 *result; if( _texture.GetCubeMapSurface( sge::d3d9::convert::cube_side( _side ), _level.get(), &result ) != D3D_OK ) throw sge::renderer::exception( FCPPT_TEXT("GetCubeMapSurface failed!") ); return sge::d3d9::surface::d3d_unique_ptr( result ); }
// Increments refcount on surface. // caller must Release() the returned surface gl::Error TextureStorage9_Cube::getCubeMapSurface(GLenum faceTarget, int level, bool dirty, IDirect3DSurface9 **outSurface) { IDirect3DBaseTexture9 *baseTexture = NULL; gl::Error error = getBaseTexture(&baseTexture); if (error.isError()) { return error; } IDirect3DCubeTexture9 *texture = static_cast<IDirect3DCubeTexture9*>(baseTexture); D3DCUBEMAP_FACES face = gl_d3d9::ConvertCubeFace(faceTarget); HRESULT result = texture->GetCubeMapSurface(face, level + mTopLevel, outSurface); ASSERT(SUCCEEDED(result)); if (FAILED(result)) { return gl::Error(GL_OUT_OF_MEMORY, "Failed to get the surface from a texture, result: 0x%X.", result); } // With managed textures the driver needs to be informed of updates to the lower mipmap levels if (level != 0 && isManaged() && dirty) { texture->AddDirtyRect(face, NULL); } return gl::Error(GL_NO_ERROR); }