blob: 80f64e1eaa3c27bd2a26574ec9a41b78422ea14d [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 Langc2e75af2015-01-05 14:26:24 -050012#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
Geoff Langb5d8f232014-12-04 15:43:01 -050013#include "libANGLE/renderer/d3d/RenderbufferD3D.h"
Geoff Langbce529e2014-12-01 12:48:41 -050014#include "libANGLE/formatutils.h"
Geoff Lang54bd5a42014-12-01 12:51:04 -050015#include "libANGLE/Framebuffer.h"
Geoff Langb5d8f232014-12-04 15:43:01 -050016#include "libANGLE/FramebufferAttachment.h"
Geoff Lang6a1e6b92014-11-06 10:42:45 -050017
18namespace rx
19{
20
Jamie Madillf75ab352015-03-16 10:46:52 -040021namespace
22{
23
24ClearParameters GetClearParameters(const gl::State &state, GLbitfield mask)
25{
26 ClearParameters clearParams;
27 memset(&clearParams, 0, sizeof(ClearParameters));
28
29 const auto &blendState = state.getBlendState();
30
31 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
32 {
33 clearParams.clearColor[i] = false;
34 }
35 clearParams.colorFClearValue = state.getColorClearValue();
36 clearParams.colorClearType = GL_FLOAT;
37 clearParams.colorMaskRed = blendState.colorMaskRed;
38 clearParams.colorMaskGreen = blendState.colorMaskGreen;
39 clearParams.colorMaskBlue = blendState.colorMaskBlue;
40 clearParams.colorMaskAlpha = blendState.colorMaskAlpha;
41 clearParams.clearDepth = false;
42 clearParams.depthClearValue = state.getDepthClearValue();
43 clearParams.clearStencil = false;
44 clearParams.stencilClearValue = state.getStencilClearValue();
45 clearParams.stencilWriteMask = state.getDepthStencilState().stencilWritemask;
46 clearParams.scissorEnabled = state.isScissorTestEnabled();
47 clearParams.scissor = state.getScissor();
48
49 const gl::Framebuffer *framebufferObject = state.getDrawFramebuffer();
50 if (mask & GL_COLOR_BUFFER_BIT)
51 {
52 if (framebufferObject->hasEnabledColorAttachment())
53 {
54 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
55 {
56 clearParams.clearColor[i] = true;
57 }
58 }
59 }
60
61 if (mask & GL_DEPTH_BUFFER_BIT)
62 {
63 if (state.getDepthStencilState().depthMask && framebufferObject->getDepthbuffer() != NULL)
64 {
65 clearParams.clearDepth = true;
66 }
67 }
68
69 if (mask & GL_STENCIL_BUFFER_BIT)
70 {
71 if (framebufferObject->getStencilbuffer() != NULL &&
72 framebufferObject->getStencilbuffer()->getStencilSize() > 0)
73 {
74 clearParams.clearStencil = true;
75 }
76 }
77
78 return clearParams;
79}
80
81}
82
Geoff Langc2e75af2015-01-05 14:26:24 -050083DefaultAttachmentD3D::DefaultAttachmentD3D(RenderTargetD3D *renderTarget)
Geoff Lang6a1e6b92014-11-06 10:42:45 -050084 : mRenderTarget(renderTarget)
85{
86 ASSERT(mRenderTarget);
87}
88
89DefaultAttachmentD3D::~DefaultAttachmentD3D()
90{
91 SafeDelete(mRenderTarget);
92}
93
94DefaultAttachmentD3D *DefaultAttachmentD3D::makeDefaultAttachmentD3D(DefaultAttachmentImpl* impl)
95{
96 ASSERT(HAS_DYNAMIC_TYPE(DefaultAttachmentD3D*, impl));
97 return static_cast<DefaultAttachmentD3D*>(impl);
98}
99
100GLsizei DefaultAttachmentD3D::getWidth() const
101{
102 return mRenderTarget->getWidth();
103}
104
105GLsizei DefaultAttachmentD3D::getHeight() const
106{
107 return mRenderTarget->getHeight();
108}
109
110GLenum DefaultAttachmentD3D::getInternalFormat() const
111{
112 return mRenderTarget->getInternalFormat();
113}
114
Geoff Lang6a1e6b92014-11-06 10:42:45 -0500115GLsizei DefaultAttachmentD3D::getSamples() const
116{
117 return mRenderTarget->getSamples();
118}
119
Geoff Langc2e75af2015-01-05 14:26:24 -0500120RenderTargetD3D *DefaultAttachmentD3D::getRenderTarget() const
Geoff Lang6a1e6b92014-11-06 10:42:45 -0500121{
122 return mRenderTarget;
123}
124
Jamie Madilld1405e52015-03-05 15:41:39 -0500125FramebufferD3D::FramebufferD3D(const gl::Framebuffer::Data &data, RendererD3D *renderer)
126 : FramebufferImpl(data),
127 mRenderer(renderer),
Jamie Madill85a18042015-03-05 15:41:41 -0500128 mColorAttachmentsForRender(mData.mColorAttachments.size(), nullptr),
129 mInvalidateColorAttachmentCache(true)
Geoff Langda88add2014-12-01 10:22:01 -0500130{
131 ASSERT(mRenderer != nullptr);
132}
133
134FramebufferD3D::~FramebufferD3D()
135{
136}
137
Jamie Madill7147f012015-03-05 15:41:40 -0500138void FramebufferD3D::setColorAttachment(size_t, const gl::FramebufferAttachment *)
Geoff Lang9dd95802014-12-01 11:12:59 -0500139{
Jamie Madill85a18042015-03-05 15:41:41 -0500140 mInvalidateColorAttachmentCache = true;
Geoff Lang9dd95802014-12-01 11:12:59 -0500141}
142
Jamie Madillf90353e2015-03-05 19:37:58 -0500143void FramebufferD3D::setDepthAttachment(const gl::FramebufferAttachment *)
Geoff Lang9dd95802014-12-01 11:12:59 -0500144{
145}
146
Jamie Madill7147f012015-03-05 15:41:40 -0500147void FramebufferD3D::setStencilAttachment(const gl::FramebufferAttachment *)
Geoff Lang9dd95802014-12-01 11:12:59 -0500148{
149}
150
Jamie Madill7147f012015-03-05 15:41:40 -0500151void FramebufferD3D::setDepthStencilAttachment(const gl::FramebufferAttachment *)
Geoff Lang9dd95802014-12-01 11:12:59 -0500152{
153}
154
Jamie Madill7147f012015-03-05 15:41:40 -0500155void FramebufferD3D::setDrawBuffers(size_t, const GLenum *)
Geoff Lang9dd95802014-12-01 11:12:59 -0500156{
Jamie Madill85a18042015-03-05 15:41:41 -0500157 mInvalidateColorAttachmentCache = true;
Geoff Lang9dd95802014-12-01 11:12:59 -0500158}
159
Jamie Madill7147f012015-03-05 15:41:40 -0500160void FramebufferD3D::setReadBuffer(GLenum)
Geoff Lang9dd95802014-12-01 11:12:59 -0500161{
162}
163
Geoff Lang1ea584c2015-03-26 21:08:33 +0000164gl::Error FramebufferD3D::invalidate(size_t, const GLenum *)
165{
166 // No-op in D3D
167 return gl::Error(GL_NO_ERROR);
168}
169
170gl::Error FramebufferD3D::invalidateSub(size_t, const GLenum *, const gl::Rectangle &)
171{
172 // No-op in D3D
173 return gl::Error(GL_NO_ERROR);
174}
175
Jamie Madilld1f5ef22015-04-01 14:17:06 -0400176gl::Error FramebufferD3D::clear(const gl::Data &data, GLbitfield mask)
Geoff Langb04dc822014-12-01 12:02:02 -0500177{
Jamie Madilld1f5ef22015-04-01 14:17:06 -0400178 const gl::State &state = *data.state;
Jamie Madillf75ab352015-03-16 10:46:52 -0400179 ClearParameters clearParams = GetClearParameters(state, mask);
Geoff Langb04dc822014-12-01 12:02:02 -0500180 return clear(state, clearParams);
181}
182
183gl::Error FramebufferD3D::clearBufferfv(const gl::State &state, GLenum buffer, GLint drawbuffer, const GLfloat *values)
184{
185 // glClearBufferfv can be called to clear the color buffer or depth buffer
Jamie Madillf75ab352015-03-16 10:46:52 -0400186 ClearParameters clearParams = GetClearParameters(state, 0);
Geoff Langb04dc822014-12-01 12:02:02 -0500187
188 if (buffer == GL_COLOR)
189 {
190 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
191 {
192 clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
193 }
194 clearParams.colorFClearValue = gl::ColorF(values[0], values[1], values[2], values[3]);
195 clearParams.colorClearType = GL_FLOAT;
196 }
197
198 if (buffer == GL_DEPTH)
199 {
200 clearParams.clearDepth = true;
201 clearParams.depthClearValue = values[0];
202 }
203
204 return clear(state, clearParams);
205}
206
207gl::Error FramebufferD3D::clearBufferuiv(const gl::State &state, GLenum buffer, GLint drawbuffer, const GLuint *values)
208{
209 // glClearBufferuiv can only be called to clear a color buffer
Jamie Madillf75ab352015-03-16 10:46:52 -0400210 ClearParameters clearParams = GetClearParameters(state, 0);
Geoff Langb04dc822014-12-01 12:02:02 -0500211 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
212 {
213 clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
214 }
215 clearParams.colorUIClearValue = gl::ColorUI(values[0], values[1], values[2], values[3]);
216 clearParams.colorClearType = GL_UNSIGNED_INT;
217
218 return clear(state, clearParams);
219}
220
221gl::Error FramebufferD3D::clearBufferiv(const gl::State &state, GLenum buffer, GLint drawbuffer, const GLint *values)
222{
223 // glClearBufferiv can be called to clear the color buffer or stencil buffer
Jamie Madillf75ab352015-03-16 10:46:52 -0400224 ClearParameters clearParams = GetClearParameters(state, 0);
Geoff Langb04dc822014-12-01 12:02:02 -0500225
226 if (buffer == GL_COLOR)
227 {
228 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
229 {
230 clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
231 }
232 clearParams.colorIClearValue = gl::ColorI(values[0], values[1], values[2], values[3]);
233 clearParams.colorClearType = GL_INT;
234 }
235
236 if (buffer == GL_STENCIL)
237 {
238 clearParams.clearStencil = true;
239 clearParams.stencilClearValue = values[1];
240 }
241
242 return clear(state, clearParams);
243}
244
245gl::Error FramebufferD3D::clearBufferfi(const gl::State &state, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
246{
247 // glClearBufferfi can only be called to clear a depth stencil buffer
Jamie Madillf75ab352015-03-16 10:46:52 -0400248 ClearParameters clearParams = GetClearParameters(state, 0);
Geoff Langb04dc822014-12-01 12:02:02 -0500249 clearParams.clearDepth = true;
250 clearParams.depthClearValue = depth;
251 clearParams.clearStencil = true;
252 clearParams.stencilClearValue = stencil;
253
254 return clear(state, clearParams);
255}
256
Geoff Langbce529e2014-12-01 12:48:41 -0500257GLenum FramebufferD3D::getImplementationColorReadFormat() const
258{
Jamie Madill7147f012015-03-05 15:41:40 -0500259 const gl::FramebufferAttachment *readAttachment = mData.getReadAttachment();
Geoff Langbce529e2014-12-01 12:48:41 -0500260
Jamie Madillb885e572015-02-03 16:16:04 -0500261 if (readAttachment == nullptr)
Geoff Langbce529e2014-12-01 12:48:41 -0500262 {
263 return GL_NONE;
264 }
265
Geoff Langc2e75af2015-01-05 14:26:24 -0500266 RenderTargetD3D *attachmentRenderTarget = NULL;
Jamie Madillb885e572015-02-03 16:16:04 -0500267 gl::Error error = GetAttachmentRenderTarget(readAttachment, &attachmentRenderTarget);
Geoff Langd8a22582014-12-17 15:28:23 -0500268 if (error.isError())
269 {
270 return GL_NONE;
271 }
Geoff Langbce529e2014-12-01 12:48:41 -0500272
Geoff Langd8a22582014-12-17 15:28:23 -0500273 GLenum implementationFormat = getRenderTargetImplementationFormat(attachmentRenderTarget);
274 const gl::InternalFormat &implementationFormatInfo = gl::GetInternalFormatInfo(implementationFormat);
275
276 return implementationFormatInfo.format;
Geoff Langbce529e2014-12-01 12:48:41 -0500277}
278
279GLenum FramebufferD3D::getImplementationColorReadType() const
280{
Jamie Madill7147f012015-03-05 15:41:40 -0500281 const gl::FramebufferAttachment *readAttachment = mData.getReadAttachment();
Geoff Langbce529e2014-12-01 12:48:41 -0500282
Jamie Madillb885e572015-02-03 16:16:04 -0500283 if (readAttachment == nullptr)
Geoff Langbce529e2014-12-01 12:48:41 -0500284 {
285 return GL_NONE;
286 }
287
Geoff Langc2e75af2015-01-05 14:26:24 -0500288 RenderTargetD3D *attachmentRenderTarget = NULL;
Jamie Madillb885e572015-02-03 16:16:04 -0500289 gl::Error error = GetAttachmentRenderTarget(readAttachment, &attachmentRenderTarget);
Geoff Langd8a22582014-12-17 15:28:23 -0500290 if (error.isError())
291 {
292 return GL_NONE;
293 }
Geoff Langbce529e2014-12-01 12:48:41 -0500294
Geoff Langd8a22582014-12-17 15:28:23 -0500295 GLenum implementationFormat = getRenderTargetImplementationFormat(attachmentRenderTarget);
296 const gl::InternalFormat &implementationFormatInfo = gl::GetInternalFormatInfo(implementationFormat);
297
298 return implementationFormatInfo.type;
Geoff Langbce529e2014-12-01 12:48:41 -0500299}
300
301gl::Error FramebufferD3D::readPixels(const gl::State &state, const gl::Rectangle &area, GLenum format, GLenum type, GLvoid *pixels) const
302{
Jamie Madill87de3622015-03-16 10:41:44 -0400303 const gl::PixelPackState &packState = state.getPackState();
304
305 if (packState.rowLength != 0 || packState.skipRows != 0 || packState.skipPixels != 0)
306 {
307 UNIMPLEMENTED();
308 return gl::Error(GL_INVALID_OPERATION, "invalid pixel store parameters in readPixels");
309 }
310
Geoff Langbce529e2014-12-01 12:48:41 -0500311 GLenum sizedInternalFormat = gl::GetSizedInternalFormat(format, type);
312 const gl::InternalFormat &sizedFormatInfo = gl::GetInternalFormatInfo(sizedInternalFormat);
Jamie Madill87de3622015-03-16 10:41:44 -0400313 GLuint outputPitch = sizedFormatInfo.computeRowPitch(type, area.width, packState.alignment, 0);
Geoff Langbce529e2014-12-01 12:48:41 -0500314
Jamie Madill87de3622015-03-16 10:41:44 -0400315 return readPixels(area, format, type, outputPitch, packState, reinterpret_cast<uint8_t*>(pixels));
Geoff Langbce529e2014-12-01 12:48:41 -0500316}
317
Geoff Lang54bd5a42014-12-01 12:51:04 -0500318gl::Error FramebufferD3D::blit(const gl::State &state, const gl::Rectangle &sourceArea, const gl::Rectangle &destArea,
319 GLbitfield mask, GLenum filter, const gl::Framebuffer *sourceFramebuffer)
320{
321 bool blitRenderTarget = false;
322 if ((mask & GL_COLOR_BUFFER_BIT) &&
323 sourceFramebuffer->getReadColorbuffer() != nullptr &&
Jamie Madill7147f012015-03-05 15:41:40 -0500324 mData.getFirstColorAttachment() != nullptr)
Geoff Lang54bd5a42014-12-01 12:51:04 -0500325 {
326 blitRenderTarget = true;
327 }
328
329 bool blitStencil = false;
330 if ((mask & GL_STENCIL_BUFFER_BIT) &&
331 sourceFramebuffer->getStencilbuffer() != nullptr &&
Jamie Madill7147f012015-03-05 15:41:40 -0500332 mData.mStencilAttachment != nullptr)
Geoff Lang54bd5a42014-12-01 12:51:04 -0500333 {
334 blitStencil = true;
335 }
336
337 bool blitDepth = false;
338 if ((mask & GL_DEPTH_BUFFER_BIT) &&
339 sourceFramebuffer->getDepthbuffer() != nullptr &&
Jamie Madill7147f012015-03-05 15:41:40 -0500340 mData.mDepthAttachment != nullptr)
Geoff Lang54bd5a42014-12-01 12:51:04 -0500341 {
342 blitDepth = true;
343 }
344
345 if (blitRenderTarget || blitDepth || blitStencil)
346 {
347 const gl::Rectangle *scissor = state.isScissorTestEnabled() ? &state.getScissor() : NULL;
348 gl::Error error = blit(sourceArea, destArea, scissor, blitRenderTarget, blitDepth, blitStencil,
349 filter, sourceFramebuffer);
350 if (error.isError())
351 {
352 return error;
353 }
354 }
355
356 return gl::Error(GL_NO_ERROR);
357}
358
Geoff Lang748f74e2014-12-01 11:25:34 -0500359GLenum FramebufferD3D::checkStatus() const
360{
361 // D3D11 does not allow for overlapping RenderTargetViews, so ensure uniqueness
Jamie Madill7147f012015-03-05 15:41:40 -0500362 for (size_t colorAttachment = 0; colorAttachment < mData.mColorAttachments.size(); colorAttachment++)
Geoff Lang748f74e2014-12-01 11:25:34 -0500363 {
Jamie Madill7147f012015-03-05 15:41:40 -0500364 const gl::FramebufferAttachment *attachment = mData.mColorAttachments[colorAttachment];
Geoff Lang748f74e2014-12-01 11:25:34 -0500365 if (attachment != nullptr)
366 {
367 for (size_t prevColorAttachment = 0; prevColorAttachment < colorAttachment; prevColorAttachment++)
368 {
Jamie Madill7147f012015-03-05 15:41:40 -0500369 const gl::FramebufferAttachment *prevAttachment = mData.mColorAttachments[prevColorAttachment];
Geoff Lang748f74e2014-12-01 11:25:34 -0500370 if (prevAttachment != nullptr &&
371 (attachment->id() == prevAttachment->id() &&
372 attachment->type() == prevAttachment->type()))
373 {
374 return GL_FRAMEBUFFER_UNSUPPORTED;
375 }
376 }
377 }
378 }
379
380 return GL_FRAMEBUFFER_COMPLETE;
381}
382
Jamie Madill7147f012015-03-05 15:41:40 -0500383const gl::AttachmentList &FramebufferD3D::getColorAttachmentsForRender(const Workarounds &workarounds) const
384{
Jamie Madill85a18042015-03-05 15:41:41 -0500385 if (!workarounds.mrtPerfWorkaround)
386 {
387 return mData.mColorAttachments;
388 }
389
390 if (!mInvalidateColorAttachmentCache)
391 {
392 return mColorAttachmentsForRender;
393 }
394
Jamie Madill7147f012015-03-05 15:41:40 -0500395 // Does not actually free memory
396 mColorAttachmentsForRender.clear();
397
398 for (size_t attachmentIndex = 0; attachmentIndex < mData.mColorAttachments.size(); ++attachmentIndex)
399 {
400 GLenum drawBufferState = mData.mDrawBufferStates[attachmentIndex];
401 gl::FramebufferAttachment *colorAttachment = mData.mColorAttachments[attachmentIndex];
402
403 if (colorAttachment != nullptr && drawBufferState != GL_NONE)
404 {
405 ASSERT(drawBufferState == GL_BACK || drawBufferState == (GL_COLOR_ATTACHMENT0_EXT + attachmentIndex));
406 mColorAttachmentsForRender.push_back(colorAttachment);
407 }
Jamie Madill7147f012015-03-05 15:41:40 -0500408 }
409
Jamie Madill85a18042015-03-05 15:41:41 -0500410 mInvalidateColorAttachmentCache = false;
Jamie Madill7147f012015-03-05 15:41:40 -0500411 return mColorAttachmentsForRender;
412}
413
Geoff Langc2e75af2015-01-05 14:26:24 -0500414gl::Error GetAttachmentRenderTarget(const gl::FramebufferAttachment *attachment, RenderTargetD3D **outRT)
Geoff Langb5d8f232014-12-04 15:43:01 -0500415{
416 if (attachment->type() == GL_TEXTURE)
417 {
418 gl::Texture *texture = attachment->getTexture();
419 ASSERT(texture);
Jamie Madill9236b412015-02-02 16:51:52 -0500420 TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture);
Geoff Langb5d8f232014-12-04 15:43:01 -0500421 const gl::ImageIndex *index = attachment->getTextureImageIndex();
422 ASSERT(index);
423 return textureD3D->getRenderTarget(*index, outRT);
424 }
425 else if (attachment->type() == GL_RENDERBUFFER)
426 {
427 gl::Renderbuffer *renderbuffer = attachment->getRenderbuffer();
428 ASSERT(renderbuffer);
429 RenderbufferD3D *renderbufferD3D = RenderbufferD3D::makeRenderbufferD3D(renderbuffer->getImplementation());
430 *outRT = renderbufferD3D->getRenderTarget();
431 return gl::Error(GL_NO_ERROR);
432 }
433 else if (attachment->type() == GL_FRAMEBUFFER_DEFAULT)
434 {
435 const gl::DefaultAttachment *defaultAttachment = static_cast<const gl::DefaultAttachment *>(attachment);
436 DefaultAttachmentD3D *defaultAttachmentD3D = DefaultAttachmentD3D::makeDefaultAttachmentD3D(defaultAttachment->getImplementation());
437 ASSERT(defaultAttachmentD3D);
438
439 *outRT = defaultAttachmentD3D->getRenderTarget();
440 return gl::Error(GL_NO_ERROR);
441 }
442 else
443 {
444 UNREACHABLE();
445 return gl::Error(GL_INVALID_OPERATION);
446 }
447}
448
449// Note: RenderTarget serials should ideally be in the RenderTargets themselves.
450unsigned int GetAttachmentSerial(const gl::FramebufferAttachment *attachment)
451{
452 if (attachment->type() == GL_TEXTURE)
453 {
454 gl::Texture *texture = attachment->getTexture();
455 ASSERT(texture);
Jamie Madill9236b412015-02-02 16:51:52 -0500456 TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture);
Geoff Langb5d8f232014-12-04 15:43:01 -0500457 const gl::ImageIndex *index = attachment->getTextureImageIndex();
458 ASSERT(index);
459 return textureD3D->getRenderTargetSerial(*index);
460 }
461 else if (attachment->type() == GL_RENDERBUFFER)
462 {
463 gl::Renderbuffer *renderbuffer = attachment->getRenderbuffer();
464 ASSERT(renderbuffer);
465 RenderbufferD3D *renderbufferD3D = RenderbufferD3D::makeRenderbufferD3D(renderbuffer->getImplementation());
466 return renderbufferD3D->getRenderTargetSerial();
467 }
468 else if (attachment->type() == GL_FRAMEBUFFER_DEFAULT)
469 {
470 const gl::DefaultAttachment *defaultAttachment = static_cast<const gl::DefaultAttachment *>(attachment);
471 DefaultAttachmentD3D *defaultAttachmentD3D = DefaultAttachmentD3D::makeDefaultAttachmentD3D(defaultAttachment->getImplementation());
472 ASSERT(defaultAttachmentD3D);
473 return defaultAttachmentD3D->getRenderTarget()->getSerial();
474 }
475 else
476 {
477 UNREACHABLE();
478 return 0;
479 }
480}
481
Geoff Lang6a1e6b92014-11-06 10:42:45 -0500482}