gfx/angle/src/libGLESv2/renderer/RenderTarget9.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/gfx/angle/src/libGLESv2/renderer/RenderTarget9.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,113 @@
     1.4 +#include "precompiled.h"
     1.5 +//
     1.6 +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
     1.7 +// Use of this source code is governed by a BSD-style license that can be
     1.8 +// found in the LICENSE file.
     1.9 +//
    1.10 +
    1.11 +// RenderTarget9.cpp: Implements a D3D9-specific wrapper for IDirect3DSurface9
    1.12 +// pointers retained by renderbuffers.
    1.13 +
    1.14 +#include "libGLESv2/renderer/RenderTarget9.h"
    1.15 +#include "libGLESv2/renderer/Renderer9.h"
    1.16 +
    1.17 +#include "libGLESv2/renderer/renderer9_utils.h"
    1.18 +#include "libGLESv2/main.h"
    1.19 +
    1.20 +namespace rx
    1.21 +{
    1.22 +
    1.23 +RenderTarget9::RenderTarget9(Renderer *renderer, IDirect3DSurface9 *surface)
    1.24 +{
    1.25 +    mRenderer = Renderer9::makeRenderer9(renderer);
    1.26 +    mRenderTarget = surface;
    1.27 +
    1.28 +    if (mRenderTarget)
    1.29 +    {
    1.30 +        D3DSURFACE_DESC description;
    1.31 +        mRenderTarget->GetDesc(&description);
    1.32 +
    1.33 +        mWidth = description.Width;
    1.34 +        mHeight = description.Height;
    1.35 +        
    1.36 +        mInternalFormat = d3d9_gl::GetEquivalentFormat(description.Format);
    1.37 +        mActualFormat = d3d9_gl::GetEquivalentFormat(description.Format);
    1.38 +        mSamples = d3d9_gl::GetSamplesFromMultisampleType(description.MultiSampleType);
    1.39 +    }
    1.40 +}
    1.41 +
    1.42 +RenderTarget9::RenderTarget9(Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples)
    1.43 +{
    1.44 +    mRenderer = Renderer9::makeRenderer9(renderer);
    1.45 +    mRenderTarget = NULL;
    1.46 +
    1.47 +    D3DFORMAT requestedFormat = gl_d3d9::ConvertRenderbufferFormat(format);
    1.48 +    int supportedSamples = mRenderer->getNearestSupportedSamples(requestedFormat, samples);
    1.49 +
    1.50 +    if (supportedSamples == -1)
    1.51 +    {
    1.52 +        gl::error(GL_OUT_OF_MEMORY);
    1.53 +
    1.54 +        return;
    1.55 +    }
    1.56 +
    1.57 +    HRESULT result = D3DERR_INVALIDCALL;
    1.58 +    
    1.59 +    if (width > 0 && height > 0)
    1.60 +    {
    1.61 +        if (requestedFormat == D3DFMT_D24S8)
    1.62 +        {
    1.63 +            result = mRenderer->getDevice()->CreateDepthStencilSurface(width, height, requestedFormat,
    1.64 +                                                                       gl_d3d9::GetMultisampleTypeFromSamples(supportedSamples),
    1.65 +                                                                       0, FALSE, &mRenderTarget, NULL);
    1.66 +        }
    1.67 +        else
    1.68 +        {
    1.69 +            result = mRenderer->getDevice()->CreateRenderTarget(width, height, requestedFormat, 
    1.70 +                                                                gl_d3d9::GetMultisampleTypeFromSamples(supportedSamples),
    1.71 +                                                                0, FALSE, &mRenderTarget, NULL);
    1.72 +        }
    1.73 +
    1.74 +        if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
    1.75 +        {
    1.76 +            gl::error(GL_OUT_OF_MEMORY);
    1.77 +
    1.78 +            return;
    1.79 +        }
    1.80 +
    1.81 +        ASSERT(SUCCEEDED(result));
    1.82 +    }
    1.83 +
    1.84 +    mWidth = width;
    1.85 +    mHeight = height;
    1.86 +    mInternalFormat = format;
    1.87 +    mSamples = supportedSamples;
    1.88 +    mActualFormat = d3d9_gl::GetEquivalentFormat(requestedFormat);
    1.89 +}
    1.90 +
    1.91 +RenderTarget9::~RenderTarget9()
    1.92 +{
    1.93 +    if (mRenderTarget)
    1.94 +    {
    1.95 +        mRenderTarget->Release();
    1.96 +    }
    1.97 +}
    1.98 +
    1.99 +RenderTarget9 *RenderTarget9::makeRenderTarget9(RenderTarget *target)
   1.100 +{
   1.101 +    ASSERT(HAS_DYNAMIC_TYPE(rx::RenderTarget9*, target));
   1.102 +    return static_cast<rx::RenderTarget9*>(target);
   1.103 +}
   1.104 +
   1.105 +IDirect3DSurface9 *RenderTarget9::getSurface()
   1.106 +{
   1.107 +    // Caller is responsible for releasing the returned surface reference.
   1.108 +    if (mRenderTarget)
   1.109 +    {
   1.110 +        mRenderTarget->AddRef();
   1.111 +    }
   1.112 +
   1.113 +    return mRenderTarget;
   1.114 +}
   1.115 +
   1.116 +}
   1.117 \ No newline at end of file

mercurial