blob: cb4af367a2be9801cf45ab0339f675cc75d432af [file] [log] [blame]
Shannon Woodse2632d22014-10-17 13:08:51 -04001//
2// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// RenderbufferD3d.cpp: Implements the RenderbufferD3D class, a specialization of RenderbufferImpl
8
9
10#include "libGLESv2/renderer/d3d/RenderbufferD3D.h"
11
Jamie Madill93e13fb2014-11-06 15:27:25 -050012#include "libGLESv2/renderer/d3d/RendererD3D.h"
Shannon Woodse2632d22014-10-17 13:08:51 -040013#include "libGLESv2/renderer/RenderTarget.h"
14
15namespace rx
16{
Jamie Madill93e13fb2014-11-06 15:27:25 -050017RenderbufferD3D::RenderbufferD3D(RendererD3D *renderer) : mRenderer(renderer)
Shannon Woodse2632d22014-10-17 13:08:51 -040018{
19 mRenderTarget = NULL;
20}
21
22RenderbufferD3D::~RenderbufferD3D()
23{
24 SafeDelete(mRenderTarget);
25}
26
27RenderbufferD3D *RenderbufferD3D::makeRenderbufferD3D(RenderbufferImpl *renderbuffer)
28{
29 ASSERT(HAS_DYNAMIC_TYPE(RenderbufferD3D*, renderbuffer));
30 return static_cast<RenderbufferD3D*>(renderbuffer);
31}
32
Geoff Langbafefdf2014-10-10 14:26:35 -040033gl::Error RenderbufferD3D::setStorage(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples)
Shannon Woodse2632d22014-10-17 13:08:51 -040034{
35 // If the renderbuffer parameters are queried, the calling function
36 // will expect one of the valid renderbuffer formats for use in
37 // glRenderbufferStorage, but we should create depth and stencil buffers
38 // as DEPTH24_STENCIL8
39 GLenum creationFormat = internalformat;
40 if (internalformat == GL_DEPTH_COMPONENT16 || internalformat == GL_STENCIL_INDEX8)
41 {
42 creationFormat = GL_DEPTH24_STENCIL8_OES;
43 }
44
Geoff Langbafefdf2014-10-10 14:26:35 -040045 RenderTarget *newRT = NULL;
46 gl::Error error = mRenderer->createRenderTarget(width, height, creationFormat, samples, &newRT);
47 if (error.isError())
48 {
49 return error;
50 }
51
Shannon Woodse2632d22014-10-17 13:08:51 -040052 SafeDelete(mRenderTarget);
53 mRenderTarget = newRT;
Geoff Langbafefdf2014-10-10 14:26:35 -040054
55 return gl::Error(GL_NO_ERROR);
Shannon Woodse2632d22014-10-17 13:08:51 -040056}
57
Geoff Langbafefdf2014-10-10 14:26:35 -040058gl::Error RenderbufferD3D::setStorage(SwapChain *swapChain, bool depth)
Shannon Woodse2632d22014-10-17 13:08:51 -040059{
Geoff Langbafefdf2014-10-10 14:26:35 -040060 RenderTarget *newRT = NULL;
61 gl::Error error = mRenderer->createRenderTarget(swapChain, depth, &newRT);
62 if (error.isError())
63 {
64 return error;
65 }
66
Shannon Woodse2632d22014-10-17 13:08:51 -040067 SafeDelete(mRenderTarget);
68 mRenderTarget = newRT;
Geoff Langbafefdf2014-10-10 14:26:35 -040069
70 return gl::Error(GL_NO_ERROR);
Shannon Woodse2632d22014-10-17 13:08:51 -040071}
72
73GLsizei RenderbufferD3D::getWidth() const
74{
75 return (mRenderTarget ? mRenderTarget->getWidth() : 0);
76}
77
78GLsizei RenderbufferD3D::getHeight() const
79{
80 return (mRenderTarget ? mRenderTarget->getHeight() : 0);
81}
82
83GLenum RenderbufferD3D::getInternalFormat() const
84{
85 return (mRenderTarget ? mRenderTarget->getInternalFormat() : GL_RGBA4);
86}
87
88GLenum RenderbufferD3D::getActualFormat() const
89{
90 return (mRenderTarget ? mRenderTarget->getActualFormat() : GL_RGBA4);
91}
92
93GLsizei RenderbufferD3D::getSamples() const
94{
95 return (mRenderTarget ? mRenderTarget->getSamples() : 0);
96}
97
98RenderTarget *RenderbufferD3D::getRenderTarget()
99{
100 return mRenderTarget;
101}
102
103unsigned int RenderbufferD3D::getRenderTargetSerial() const
104{
105 return (mRenderTarget ? mRenderTarget->getSerial() : 0);
106}
107
108}