#include "precompiled.h" // // Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // RenderTarget9.cpp: Implements a D3D9-specific wrapper for IDirect3DSurface9 // pointers retained by renderbuffers. #include "libGLESv2/renderer/RenderTarget9.h" #include "libGLESv2/renderer/Renderer9.h" #include "libGLESv2/renderer/renderer9_utils.h" #include "libGLESv2/main.h" namespace rx { RenderTarget9::RenderTarget9(Renderer *renderer, IDirect3DSurface9 *surface) { mRenderer = Renderer9::makeRenderer9(renderer); mRenderTarget = surface; if (mRenderTarget) { D3DSURFACE_DESC description; mRenderTarget->GetDesc(&description); mWidth = description.Width; mHeight = description.Height; mInternalFormat = d3d9_gl::GetEquivalentFormat(description.Format); mActualFormat = d3d9_gl::GetEquivalentFormat(description.Format); mSamples = d3d9_gl::GetSamplesFromMultisampleType(description.MultiSampleType); } } RenderTarget9::RenderTarget9(Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples) { mRenderer = Renderer9::makeRenderer9(renderer); mRenderTarget = NULL; D3DFORMAT requestedFormat = gl_d3d9::ConvertRenderbufferFormat(format); int supportedSamples = mRenderer->getNearestSupportedSamples(requestedFormat, samples); if (supportedSamples == -1) { gl::error(GL_OUT_OF_MEMORY); return; } HRESULT result = D3DERR_INVALIDCALL; if (width > 0 && height > 0) { if (requestedFormat == D3DFMT_D24S8) { result = mRenderer->getDevice()->CreateDepthStencilSurface(width, height, requestedFormat, gl_d3d9::GetMultisampleTypeFromSamples(supportedSamples), 0, FALSE, &mRenderTarget, NULL); } else { result = mRenderer->getDevice()->CreateRenderTarget(width, height, requestedFormat, gl_d3d9::GetMultisampleTypeFromSamples(supportedSamples), 0, FALSE, &mRenderTarget, NULL); } if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY) { gl::error(GL_OUT_OF_MEMORY); return; } ASSERT(SUCCEEDED(result)); } mWidth = width; mHeight = height; mInternalFormat = format; mSamples = supportedSamples; mActualFormat = d3d9_gl::GetEquivalentFormat(requestedFormat); } RenderTarget9::~RenderTarget9() { if (mRenderTarget) { mRenderTarget->Release(); } } RenderTarget9 *RenderTarget9::makeRenderTarget9(RenderTarget *target) { ASSERT(HAS_DYNAMIC_TYPE(rx::RenderTarget9*, target)); return static_cast(target); } IDirect3DSurface9 *RenderTarget9::getSurface() { // Caller is responsible for releasing the returned surface reference. if (mRenderTarget) { mRenderTarget->AddRef(); } return mRenderTarget; } }