blob: 26493e30207131f5e18e62869f13972e2ddf9a7f [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"
Jamie Madillc46f45d2015-03-31 13:20:55 -040010
Geoff Langbce529e2014-12-01 12:48:41 -050011#include "libANGLE/formatutils.h"
Geoff Lang54bd5a42014-12-01 12:51:04 -050012#include "libANGLE/Framebuffer.h"
Geoff Langb5d8f232014-12-04 15:43:01 -050013#include "libANGLE/FramebufferAttachment.h"
Jamie Madillc46f45d2015-03-31 13:20:55 -040014#include "libANGLE/Surface.h"
15#include "libANGLE/renderer/d3d/RendererD3D.h"
16#include "libANGLE/renderer/d3d/RenderbufferD3D.h"
17#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
18#include "libANGLE/renderer/d3d/SurfaceD3D.h"
19#include "libANGLE/renderer/d3d/SwapChainD3D.h"
20#include "libANGLE/renderer/d3d/TextureD3D.h"
Geoff Lang6a1e6b92014-11-06 10:42:45 -050021
22namespace rx
23{
24
Jamie Madillf75ab352015-03-16 10:46:52 -040025namespace
26{
27
28ClearParameters GetClearParameters(const gl::State &state, GLbitfield mask)
29{
30 ClearParameters clearParams;
31 memset(&clearParams, 0, sizeof(ClearParameters));
32
33 const auto &blendState = state.getBlendState();
34
35 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
36 {
37 clearParams.clearColor[i] = false;
38 }
39 clearParams.colorFClearValue = state.getColorClearValue();
40 clearParams.colorClearType = GL_FLOAT;
41 clearParams.colorMaskRed = blendState.colorMaskRed;
42 clearParams.colorMaskGreen = blendState.colorMaskGreen;
43 clearParams.colorMaskBlue = blendState.colorMaskBlue;
44 clearParams.colorMaskAlpha = blendState.colorMaskAlpha;
45 clearParams.clearDepth = false;
46 clearParams.depthClearValue = state.getDepthClearValue();
47 clearParams.clearStencil = false;
48 clearParams.stencilClearValue = state.getStencilClearValue();
49 clearParams.stencilWriteMask = state.getDepthStencilState().stencilWritemask;
50 clearParams.scissorEnabled = state.isScissorTestEnabled();
51 clearParams.scissor = state.getScissor();
52
53 const gl::Framebuffer *framebufferObject = state.getDrawFramebuffer();
54 if (mask & GL_COLOR_BUFFER_BIT)
55 {
56 if (framebufferObject->hasEnabledColorAttachment())
57 {
58 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
59 {
60 clearParams.clearColor[i] = true;
61 }
62 }
63 }
64
65 if (mask & GL_DEPTH_BUFFER_BIT)
66 {
67 if (state.getDepthStencilState().depthMask && framebufferObject->getDepthbuffer() != NULL)
68 {
69 clearParams.clearDepth = true;
70 }
71 }
72
73 if (mask & GL_STENCIL_BUFFER_BIT)
74 {
75 if (framebufferObject->getStencilbuffer() != NULL &&
76 framebufferObject->getStencilbuffer()->getStencilSize() > 0)
77 {
78 clearParams.clearStencil = true;
79 }
80 }
81
82 return clearParams;
83}
84
85}
86
Geoff Langc2e75af2015-01-05 14:26:24 -050087DefaultAttachmentD3D::DefaultAttachmentD3D(RenderTargetD3D *renderTarget)
Geoff Lang6a1e6b92014-11-06 10:42:45 -050088 : mRenderTarget(renderTarget)
89{
90 ASSERT(mRenderTarget);
91}
92
93DefaultAttachmentD3D::~DefaultAttachmentD3D()
94{
95 SafeDelete(mRenderTarget);
96}
97
98DefaultAttachmentD3D *DefaultAttachmentD3D::makeDefaultAttachmentD3D(DefaultAttachmentImpl* impl)
99{
100 ASSERT(HAS_DYNAMIC_TYPE(DefaultAttachmentD3D*, impl));
101 return static_cast<DefaultAttachmentD3D*>(impl);
102}
103
104GLsizei DefaultAttachmentD3D::getWidth() const
105{
106 return mRenderTarget->getWidth();
107}
108
109GLsizei DefaultAttachmentD3D::getHeight() const
110{
111 return mRenderTarget->getHeight();
112}
113
114GLenum DefaultAttachmentD3D::getInternalFormat() const
115{
116 return mRenderTarget->getInternalFormat();
117}
118
Geoff Lang6a1e6b92014-11-06 10:42:45 -0500119GLsizei DefaultAttachmentD3D::getSamples() const
120{
121 return mRenderTarget->getSamples();
122}
123
Geoff Langc2e75af2015-01-05 14:26:24 -0500124RenderTargetD3D *DefaultAttachmentD3D::getRenderTarget() const
Geoff Lang6a1e6b92014-11-06 10:42:45 -0500125{
126 return mRenderTarget;
127}
128
Jamie Madilld1405e52015-03-05 15:41:39 -0500129FramebufferD3D::FramebufferD3D(const gl::Framebuffer::Data &data, RendererD3D *renderer)
130 : FramebufferImpl(data),
131 mRenderer(renderer),
Jamie Madill85a18042015-03-05 15:41:41 -0500132 mColorAttachmentsForRender(mData.mColorAttachments.size(), nullptr),
133 mInvalidateColorAttachmentCache(true)
Geoff Langda88add2014-12-01 10:22:01 -0500134{
135 ASSERT(mRenderer != nullptr);
136}
137
138FramebufferD3D::~FramebufferD3D()
139{
140}
141
Jamie Madill7147f012015-03-05 15:41:40 -0500142void FramebufferD3D::setColorAttachment(size_t, const gl::FramebufferAttachment *)
Geoff Lang9dd95802014-12-01 11:12:59 -0500143{
Jamie Madill85a18042015-03-05 15:41:41 -0500144 mInvalidateColorAttachmentCache = true;
Geoff Lang9dd95802014-12-01 11:12:59 -0500145}
146
Jamie Madillf90353e2015-03-05 19:37:58 -0500147void FramebufferD3D::setDepthAttachment(const gl::FramebufferAttachment *)
Geoff Lang9dd95802014-12-01 11:12:59 -0500148{
149}
150
Jamie Madill7147f012015-03-05 15:41:40 -0500151void FramebufferD3D::setStencilAttachment(const gl::FramebufferAttachment *)
Geoff Lang9dd95802014-12-01 11:12:59 -0500152{
153}
154
Jamie Madill7147f012015-03-05 15:41:40 -0500155void FramebufferD3D::setDepthStencilAttachment(const gl::FramebufferAttachment *)
Geoff Lang9dd95802014-12-01 11:12:59 -0500156{
157}
158
Jamie Madill7147f012015-03-05 15:41:40 -0500159void FramebufferD3D::setDrawBuffers(size_t, const GLenum *)
Geoff Lang9dd95802014-12-01 11:12:59 -0500160{
Jamie Madill85a18042015-03-05 15:41:41 -0500161 mInvalidateColorAttachmentCache = true;
Geoff Lang9dd95802014-12-01 11:12:59 -0500162}
163
Jamie Madill7147f012015-03-05 15:41:40 -0500164void FramebufferD3D::setReadBuffer(GLenum)
Geoff Lang9dd95802014-12-01 11:12:59 -0500165{
166}
167
Geoff Lang1ea584c2015-03-26 21:08:33 +0000168gl::Error FramebufferD3D::invalidate(size_t, const GLenum *)
169{
170 // No-op in D3D
171 return gl::Error(GL_NO_ERROR);
172}
173
174gl::Error FramebufferD3D::invalidateSub(size_t, const GLenum *, const gl::Rectangle &)
175{
176 // No-op in D3D
177 return gl::Error(GL_NO_ERROR);
178}
179
Jamie Madilld1f5ef22015-04-01 14:17:06 -0400180gl::Error FramebufferD3D::clear(const gl::Data &data, GLbitfield mask)
Geoff Langb04dc822014-12-01 12:02:02 -0500181{
Jamie Madilld1f5ef22015-04-01 14:17:06 -0400182 const gl::State &state = *data.state;
Jamie Madillf75ab352015-03-16 10:46:52 -0400183 ClearParameters clearParams = GetClearParameters(state, mask);
Geoff Langb04dc822014-12-01 12:02:02 -0500184 return clear(state, clearParams);
185}
186
187gl::Error FramebufferD3D::clearBufferfv(const gl::State &state, GLenum buffer, GLint drawbuffer, const GLfloat *values)
188{
189 // glClearBufferfv can be called to clear the color buffer or depth buffer
Jamie Madillf75ab352015-03-16 10:46:52 -0400190 ClearParameters clearParams = GetClearParameters(state, 0);
Geoff Langb04dc822014-12-01 12:02:02 -0500191
192 if (buffer == GL_COLOR)
193 {
194 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
195 {
196 clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
197 }
198 clearParams.colorFClearValue = gl::ColorF(values[0], values[1], values[2], values[3]);
199 clearParams.colorClearType = GL_FLOAT;
200 }
201
202 if (buffer == GL_DEPTH)
203 {
204 clearParams.clearDepth = true;
205 clearParams.depthClearValue = values[0];
206 }
207
208 return clear(state, clearParams);
209}
210
211gl::Error FramebufferD3D::clearBufferuiv(const gl::State &state, GLenum buffer, GLint drawbuffer, const GLuint *values)
212{
213 // glClearBufferuiv can only be called to clear a color buffer
Jamie Madillf75ab352015-03-16 10:46:52 -0400214 ClearParameters clearParams = GetClearParameters(state, 0);
Geoff Langb04dc822014-12-01 12:02:02 -0500215 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
216 {
217 clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
218 }
219 clearParams.colorUIClearValue = gl::ColorUI(values[0], values[1], values[2], values[3]);
220 clearParams.colorClearType = GL_UNSIGNED_INT;
221
222 return clear(state, clearParams);
223}
224
225gl::Error FramebufferD3D::clearBufferiv(const gl::State &state, GLenum buffer, GLint drawbuffer, const GLint *values)
226{
227 // glClearBufferiv can be called to clear the color buffer or stencil buffer
Jamie Madillf75ab352015-03-16 10:46:52 -0400228 ClearParameters clearParams = GetClearParameters(state, 0);
Geoff Langb04dc822014-12-01 12:02:02 -0500229
230 if (buffer == GL_COLOR)
231 {
232 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
233 {
234 clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
235 }
236 clearParams.colorIClearValue = gl::ColorI(values[0], values[1], values[2], values[3]);
237 clearParams.colorClearType = GL_INT;
238 }
239
240 if (buffer == GL_STENCIL)
241 {
242 clearParams.clearStencil = true;
243 clearParams.stencilClearValue = values[1];
244 }
245
246 return clear(state, clearParams);
247}
248
249gl::Error FramebufferD3D::clearBufferfi(const gl::State &state, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
250{
251 // glClearBufferfi can only be called to clear a depth stencil buffer
Jamie Madillf75ab352015-03-16 10:46:52 -0400252 ClearParameters clearParams = GetClearParameters(state, 0);
Geoff Langb04dc822014-12-01 12:02:02 -0500253 clearParams.clearDepth = true;
254 clearParams.depthClearValue = depth;
255 clearParams.clearStencil = true;
256 clearParams.stencilClearValue = stencil;
257
258 return clear(state, clearParams);
259}
260
Geoff Langbce529e2014-12-01 12:48:41 -0500261GLenum FramebufferD3D::getImplementationColorReadFormat() const
262{
Jamie Madill7147f012015-03-05 15:41:40 -0500263 const gl::FramebufferAttachment *readAttachment = mData.getReadAttachment();
Geoff Langbce529e2014-12-01 12:48:41 -0500264
Jamie Madillb885e572015-02-03 16:16:04 -0500265 if (readAttachment == nullptr)
Geoff Langbce529e2014-12-01 12:48:41 -0500266 {
267 return GL_NONE;
268 }
269
Geoff Langc2e75af2015-01-05 14:26:24 -0500270 RenderTargetD3D *attachmentRenderTarget = NULL;
Jamie Madillb885e572015-02-03 16:16:04 -0500271 gl::Error error = GetAttachmentRenderTarget(readAttachment, &attachmentRenderTarget);
Geoff Langd8a22582014-12-17 15:28:23 -0500272 if (error.isError())
273 {
274 return GL_NONE;
275 }
Geoff Langbce529e2014-12-01 12:48:41 -0500276
Geoff Langd8a22582014-12-17 15:28:23 -0500277 GLenum implementationFormat = getRenderTargetImplementationFormat(attachmentRenderTarget);
278 const gl::InternalFormat &implementationFormatInfo = gl::GetInternalFormatInfo(implementationFormat);
279
280 return implementationFormatInfo.format;
Geoff Langbce529e2014-12-01 12:48:41 -0500281}
282
283GLenum FramebufferD3D::getImplementationColorReadType() const
284{
Jamie Madill7147f012015-03-05 15:41:40 -0500285 const gl::FramebufferAttachment *readAttachment = mData.getReadAttachment();
Geoff Langbce529e2014-12-01 12:48:41 -0500286
Jamie Madillb885e572015-02-03 16:16:04 -0500287 if (readAttachment == nullptr)
Geoff Langbce529e2014-12-01 12:48:41 -0500288 {
289 return GL_NONE;
290 }
291
Geoff Langc2e75af2015-01-05 14:26:24 -0500292 RenderTargetD3D *attachmentRenderTarget = NULL;
Jamie Madillb885e572015-02-03 16:16:04 -0500293 gl::Error error = GetAttachmentRenderTarget(readAttachment, &attachmentRenderTarget);
Geoff Langd8a22582014-12-17 15:28:23 -0500294 if (error.isError())
295 {
296 return GL_NONE;
297 }
Geoff Langbce529e2014-12-01 12:48:41 -0500298
Geoff Langd8a22582014-12-17 15:28:23 -0500299 GLenum implementationFormat = getRenderTargetImplementationFormat(attachmentRenderTarget);
300 const gl::InternalFormat &implementationFormatInfo = gl::GetInternalFormatInfo(implementationFormat);
301
302 return implementationFormatInfo.type;
Geoff Langbce529e2014-12-01 12:48:41 -0500303}
304
305gl::Error FramebufferD3D::readPixels(const gl::State &state, const gl::Rectangle &area, GLenum format, GLenum type, GLvoid *pixels) const
306{
Jamie Madill87de3622015-03-16 10:41:44 -0400307 const gl::PixelPackState &packState = state.getPackState();
308
309 if (packState.rowLength != 0 || packState.skipRows != 0 || packState.skipPixels != 0)
310 {
311 UNIMPLEMENTED();
312 return gl::Error(GL_INVALID_OPERATION, "invalid pixel store parameters in readPixels");
313 }
314
Geoff Langbce529e2014-12-01 12:48:41 -0500315 GLenum sizedInternalFormat = gl::GetSizedInternalFormat(format, type);
316 const gl::InternalFormat &sizedFormatInfo = gl::GetInternalFormatInfo(sizedInternalFormat);
Jamie Madill87de3622015-03-16 10:41:44 -0400317 GLuint outputPitch = sizedFormatInfo.computeRowPitch(type, area.width, packState.alignment, 0);
Geoff Langbce529e2014-12-01 12:48:41 -0500318
Jamie Madill87de3622015-03-16 10:41:44 -0400319 return readPixels(area, format, type, outputPitch, packState, reinterpret_cast<uint8_t*>(pixels));
Geoff Langbce529e2014-12-01 12:48:41 -0500320}
321
Geoff Lang54bd5a42014-12-01 12:51:04 -0500322gl::Error FramebufferD3D::blit(const gl::State &state, const gl::Rectangle &sourceArea, const gl::Rectangle &destArea,
323 GLbitfield mask, GLenum filter, const gl::Framebuffer *sourceFramebuffer)
324{
325 bool blitRenderTarget = false;
326 if ((mask & GL_COLOR_BUFFER_BIT) &&
327 sourceFramebuffer->getReadColorbuffer() != nullptr &&
Jamie Madill7147f012015-03-05 15:41:40 -0500328 mData.getFirstColorAttachment() != nullptr)
Geoff Lang54bd5a42014-12-01 12:51:04 -0500329 {
330 blitRenderTarget = true;
331 }
332
333 bool blitStencil = false;
334 if ((mask & GL_STENCIL_BUFFER_BIT) &&
335 sourceFramebuffer->getStencilbuffer() != nullptr &&
Jamie Madill7147f012015-03-05 15:41:40 -0500336 mData.mStencilAttachment != nullptr)
Geoff Lang54bd5a42014-12-01 12:51:04 -0500337 {
338 blitStencil = true;
339 }
340
341 bool blitDepth = false;
342 if ((mask & GL_DEPTH_BUFFER_BIT) &&
343 sourceFramebuffer->getDepthbuffer() != nullptr &&
Jamie Madill7147f012015-03-05 15:41:40 -0500344 mData.mDepthAttachment != nullptr)
Geoff Lang54bd5a42014-12-01 12:51:04 -0500345 {
346 blitDepth = true;
347 }
348
349 if (blitRenderTarget || blitDepth || blitStencil)
350 {
351 const gl::Rectangle *scissor = state.isScissorTestEnabled() ? &state.getScissor() : NULL;
352 gl::Error error = blit(sourceArea, destArea, scissor, blitRenderTarget, blitDepth, blitStencil,
353 filter, sourceFramebuffer);
354 if (error.isError())
355 {
356 return error;
357 }
358 }
359
360 return gl::Error(GL_NO_ERROR);
361}
362
Geoff Lang748f74e2014-12-01 11:25:34 -0500363GLenum FramebufferD3D::checkStatus() const
364{
365 // D3D11 does not allow for overlapping RenderTargetViews, so ensure uniqueness
Jamie Madill7147f012015-03-05 15:41:40 -0500366 for (size_t colorAttachment = 0; colorAttachment < mData.mColorAttachments.size(); colorAttachment++)
Geoff Lang748f74e2014-12-01 11:25:34 -0500367 {
Jamie Madill7147f012015-03-05 15:41:40 -0500368 const gl::FramebufferAttachment *attachment = mData.mColorAttachments[colorAttachment];
Geoff Lang748f74e2014-12-01 11:25:34 -0500369 if (attachment != nullptr)
370 {
371 for (size_t prevColorAttachment = 0; prevColorAttachment < colorAttachment; prevColorAttachment++)
372 {
Jamie Madill7147f012015-03-05 15:41:40 -0500373 const gl::FramebufferAttachment *prevAttachment = mData.mColorAttachments[prevColorAttachment];
Geoff Lang748f74e2014-12-01 11:25:34 -0500374 if (prevAttachment != nullptr &&
375 (attachment->id() == prevAttachment->id() &&
376 attachment->type() == prevAttachment->type()))
377 {
378 return GL_FRAMEBUFFER_UNSUPPORTED;
379 }
380 }
381 }
382 }
383
384 return GL_FRAMEBUFFER_COMPLETE;
385}
386
Jamie Madill7147f012015-03-05 15:41:40 -0500387const gl::AttachmentList &FramebufferD3D::getColorAttachmentsForRender(const Workarounds &workarounds) const
388{
Jamie Madill85a18042015-03-05 15:41:41 -0500389 if (!workarounds.mrtPerfWorkaround)
390 {
391 return mData.mColorAttachments;
392 }
393
394 if (!mInvalidateColorAttachmentCache)
395 {
396 return mColorAttachmentsForRender;
397 }
398
Jamie Madill7147f012015-03-05 15:41:40 -0500399 // Does not actually free memory
400 mColorAttachmentsForRender.clear();
401
402 for (size_t attachmentIndex = 0; attachmentIndex < mData.mColorAttachments.size(); ++attachmentIndex)
403 {
404 GLenum drawBufferState = mData.mDrawBufferStates[attachmentIndex];
405 gl::FramebufferAttachment *colorAttachment = mData.mColorAttachments[attachmentIndex];
406
407 if (colorAttachment != nullptr && drawBufferState != GL_NONE)
408 {
409 ASSERT(drawBufferState == GL_BACK || drawBufferState == (GL_COLOR_ATTACHMENT0_EXT + attachmentIndex));
410 mColorAttachmentsForRender.push_back(colorAttachment);
411 }
Jamie Madill7147f012015-03-05 15:41:40 -0500412 }
413
Jamie Madill85a18042015-03-05 15:41:41 -0500414 mInvalidateColorAttachmentCache = false;
Jamie Madill7147f012015-03-05 15:41:40 -0500415 return mColorAttachmentsForRender;
416}
417
Geoff Langc2e75af2015-01-05 14:26:24 -0500418gl::Error GetAttachmentRenderTarget(const gl::FramebufferAttachment *attachment, RenderTargetD3D **outRT)
Geoff Langb5d8f232014-12-04 15:43:01 -0500419{
420 if (attachment->type() == GL_TEXTURE)
421 {
422 gl::Texture *texture = attachment->getTexture();
423 ASSERT(texture);
Jamie Madill9236b412015-02-02 16:51:52 -0500424 TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture);
Geoff Langb5d8f232014-12-04 15:43:01 -0500425 const gl::ImageIndex *index = attachment->getTextureImageIndex();
426 ASSERT(index);
427 return textureD3D->getRenderTarget(*index, outRT);
428 }
429 else if (attachment->type() == GL_RENDERBUFFER)
430 {
431 gl::Renderbuffer *renderbuffer = attachment->getRenderbuffer();
432 ASSERT(renderbuffer);
433 RenderbufferD3D *renderbufferD3D = RenderbufferD3D::makeRenderbufferD3D(renderbuffer->getImplementation());
434 *outRT = renderbufferD3D->getRenderTarget();
435 return gl::Error(GL_NO_ERROR);
436 }
437 else if (attachment->type() == GL_FRAMEBUFFER_DEFAULT)
438 {
439 const gl::DefaultAttachment *defaultAttachment = static_cast<const gl::DefaultAttachment *>(attachment);
Jamie Madillc46f45d2015-03-31 13:20:55 -0400440 const egl::Surface *surface = defaultAttachment->getSurface();
441 ASSERT(surface);
442 const SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface);
443 ASSERT(surfaceD3D);
Geoff Langb5d8f232014-12-04 15:43:01 -0500444
Jamie Madillc46f45d2015-03-31 13:20:55 -0400445 if (defaultAttachment->getBinding() == GL_BACK)
446 {
447 *outRT = surfaceD3D->getSwapChain()->getColorRenderTarget();
448 }
449 else
450 {
451 *outRT = surfaceD3D->getSwapChain()->getDepthStencilRenderTarget();
452 }
Geoff Langb5d8f232014-12-04 15:43:01 -0500453 return gl::Error(GL_NO_ERROR);
454 }
455 else
456 {
457 UNREACHABLE();
458 return gl::Error(GL_INVALID_OPERATION);
459 }
460}
461
462// Note: RenderTarget serials should ideally be in the RenderTargets themselves.
463unsigned int GetAttachmentSerial(const gl::FramebufferAttachment *attachment)
464{
465 if (attachment->type() == GL_TEXTURE)
466 {
467 gl::Texture *texture = attachment->getTexture();
468 ASSERT(texture);
Jamie Madill9236b412015-02-02 16:51:52 -0500469 TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture);
Geoff Langb5d8f232014-12-04 15:43:01 -0500470 const gl::ImageIndex *index = attachment->getTextureImageIndex();
471 ASSERT(index);
472 return textureD3D->getRenderTargetSerial(*index);
473 }
474 else if (attachment->type() == GL_RENDERBUFFER)
475 {
476 gl::Renderbuffer *renderbuffer = attachment->getRenderbuffer();
477 ASSERT(renderbuffer);
478 RenderbufferD3D *renderbufferD3D = RenderbufferD3D::makeRenderbufferD3D(renderbuffer->getImplementation());
479 return renderbufferD3D->getRenderTargetSerial();
480 }
481 else if (attachment->type() == GL_FRAMEBUFFER_DEFAULT)
482 {
483 const gl::DefaultAttachment *defaultAttachment = static_cast<const gl::DefaultAttachment *>(attachment);
Jamie Madillc46f45d2015-03-31 13:20:55 -0400484 const egl::Surface *surface = defaultAttachment->getSurface();
485 ASSERT(surface);
486 const SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface);
487 ASSERT(surfaceD3D);
488
489 if (defaultAttachment->getBinding() == GL_BACK)
490 {
491 return surfaceD3D->getSwapChain()->getColorRenderTarget()->getSerial();
492 }
493 else
494 {
495 return surfaceD3D->getSwapChain()->getDepthStencilRenderTarget()->getSerial();
496 }
Geoff Langb5d8f232014-12-04 15:43:01 -0500497 }
498 else
499 {
500 UNREACHABLE();
501 return 0;
502 }
503}
504
Geoff Lang6a1e6b92014-11-06 10:42:45 -0500505}