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