blob: 78bb54d211c73c5ad530201748b81fd15d582ced [file] [log] [blame]
Geoff Lang6a1e6b92014-11-06 10:42:45 -05001//
2// Copyright 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
Geoff Langda88add2014-12-01 10:22:01 -05007// FramebufferD3D.cpp: Implements the DefaultAttachmentD3D and FramebufferD3D classes.
Geoff Lang6a1e6b92014-11-06 10:42:45 -05008
Geoff Lang2b5420c2014-11-19 14:20:15 -05009#include "libANGLE/renderer/d3d/FramebufferD3D.h"
Geoff Langb5d8f232014-12-04 15:43:01 -050010#include "libANGLE/renderer/d3d/TextureD3D.h"
Geoff Langda88add2014-12-01 10:22:01 -050011#include "libANGLE/renderer/d3d/RendererD3D.h"
Geoff Langb5d8f232014-12-04 15:43:01 -050012#include "libANGLE/renderer/d3d/RenderbufferD3D.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050013#include "libANGLE/renderer/RenderTarget.h"
Geoff Langb5d8f232014-12-04 15:43:01 -050014#include "libANGLE/FramebufferAttachment.h"
Geoff Lang6a1e6b92014-11-06 10:42:45 -050015
16namespace rx
17{
18
19DefaultAttachmentD3D::DefaultAttachmentD3D(RenderTarget *renderTarget)
20 : mRenderTarget(renderTarget)
21{
22 ASSERT(mRenderTarget);
23}
24
25DefaultAttachmentD3D::~DefaultAttachmentD3D()
26{
27 SafeDelete(mRenderTarget);
28}
29
30DefaultAttachmentD3D *DefaultAttachmentD3D::makeDefaultAttachmentD3D(DefaultAttachmentImpl* impl)
31{
32 ASSERT(HAS_DYNAMIC_TYPE(DefaultAttachmentD3D*, impl));
33 return static_cast<DefaultAttachmentD3D*>(impl);
34}
35
36GLsizei DefaultAttachmentD3D::getWidth() const
37{
38 return mRenderTarget->getWidth();
39}
40
41GLsizei DefaultAttachmentD3D::getHeight() const
42{
43 return mRenderTarget->getHeight();
44}
45
46GLenum DefaultAttachmentD3D::getInternalFormat() const
47{
48 return mRenderTarget->getInternalFormat();
49}
50
51GLenum DefaultAttachmentD3D::getActualFormat() const
52{
53 return mRenderTarget->getActualFormat();
54}
55
56GLsizei DefaultAttachmentD3D::getSamples() const
57{
58 return mRenderTarget->getSamples();
59}
60
61RenderTarget *DefaultAttachmentD3D::getRenderTarget() const
62{
63 return mRenderTarget;
64}
65
Geoff Langda88add2014-12-01 10:22:01 -050066
67FramebufferD3D::FramebufferD3D(RendererD3D *renderer)
68 : mRenderer(renderer)
69{
70 ASSERT(mRenderer != nullptr);
71}
72
73FramebufferD3D::~FramebufferD3D()
74{
75}
76
Geoff Lang9dd95802014-12-01 11:12:59 -050077void FramebufferD3D::setColorAttachment(size_t index, const gl::FramebufferAttachment *attachment)
78{
79}
80
81void FramebufferD3D::setDepthttachment(const gl::FramebufferAttachment *attachment)
82{
83}
84
85void FramebufferD3D::setStencilAttachment(const gl::FramebufferAttachment *attachment)
86{
87}
88
89void FramebufferD3D::setDepthStencilAttachment(const gl::FramebufferAttachment *attachment)
90{
91}
92
93void FramebufferD3D::setDrawBuffers(size_t count, const GLenum *buffers)
94{
95}
96
97void FramebufferD3D::setReadBuffer(GLenum buffer)
98{
99}
100
Geoff Lang9ad4bda2014-12-01 11:03:09 -0500101gl::Error FramebufferD3D::invalidate(size_t, const GLenum *)
102{
103 // No-op in D3D
104 return gl::Error(GL_NO_ERROR);
105}
106
107gl::Error FramebufferD3D::invalidateSub(size_t, const GLenum *, const gl::Rectangle &)
108{
109 // No-op in D3D
110 return gl::Error(GL_NO_ERROR);
111}
112
Geoff Langb5d8f232014-12-04 15:43:01 -0500113gl::Error GetAttachmentRenderTarget(const gl::FramebufferAttachment *attachment, RenderTarget **outRT)
114{
115 if (attachment->type() == GL_TEXTURE)
116 {
117 gl::Texture *texture = attachment->getTexture();
118 ASSERT(texture);
119 TextureD3D *textureD3D = TextureD3D::makeTextureD3D(texture->getImplementation());
120 const gl::ImageIndex *index = attachment->getTextureImageIndex();
121 ASSERT(index);
122 return textureD3D->getRenderTarget(*index, outRT);
123 }
124 else if (attachment->type() == GL_RENDERBUFFER)
125 {
126 gl::Renderbuffer *renderbuffer = attachment->getRenderbuffer();
127 ASSERT(renderbuffer);
128 RenderbufferD3D *renderbufferD3D = RenderbufferD3D::makeRenderbufferD3D(renderbuffer->getImplementation());
129 *outRT = renderbufferD3D->getRenderTarget();
130 return gl::Error(GL_NO_ERROR);
131 }
132 else if (attachment->type() == GL_FRAMEBUFFER_DEFAULT)
133 {
134 const gl::DefaultAttachment *defaultAttachment = static_cast<const gl::DefaultAttachment *>(attachment);
135 DefaultAttachmentD3D *defaultAttachmentD3D = DefaultAttachmentD3D::makeDefaultAttachmentD3D(defaultAttachment->getImplementation());
136 ASSERT(defaultAttachmentD3D);
137
138 *outRT = defaultAttachmentD3D->getRenderTarget();
139 return gl::Error(GL_NO_ERROR);
140 }
141 else
142 {
143 UNREACHABLE();
144 return gl::Error(GL_INVALID_OPERATION);
145 }
146}
147
148// Note: RenderTarget serials should ideally be in the RenderTargets themselves.
149unsigned int GetAttachmentSerial(const gl::FramebufferAttachment *attachment)
150{
151 if (attachment->type() == GL_TEXTURE)
152 {
153 gl::Texture *texture = attachment->getTexture();
154 ASSERT(texture);
155 TextureD3D *textureD3D = TextureD3D::makeTextureD3D(texture->getImplementation());
156 const gl::ImageIndex *index = attachment->getTextureImageIndex();
157 ASSERT(index);
158 return textureD3D->getRenderTargetSerial(*index);
159 }
160 else if (attachment->type() == GL_RENDERBUFFER)
161 {
162 gl::Renderbuffer *renderbuffer = attachment->getRenderbuffer();
163 ASSERT(renderbuffer);
164 RenderbufferD3D *renderbufferD3D = RenderbufferD3D::makeRenderbufferD3D(renderbuffer->getImplementation());
165 return renderbufferD3D->getRenderTargetSerial();
166 }
167 else if (attachment->type() == GL_FRAMEBUFFER_DEFAULT)
168 {
169 const gl::DefaultAttachment *defaultAttachment = static_cast<const gl::DefaultAttachment *>(attachment);
170 DefaultAttachmentD3D *defaultAttachmentD3D = DefaultAttachmentD3D::makeDefaultAttachmentD3D(defaultAttachment->getImplementation());
171 ASSERT(defaultAttachmentD3D);
172 return defaultAttachmentD3D->getRenderTarget()->getSerial();
173 }
174 else
175 {
176 UNREACHABLE();
177 return 0;
178 }
179}
180
Geoff Lang6a1e6b92014-11-06 10:42:45 -0500181}