blob: 0d1a38e0715706736204f0fb3a6f058f5be6472c [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
Jamie Madill20e005b2017-04-07 14:19:22 -040011#include "common/bitset_utils.h"
Jamie Madillc564c072017-06-01 12:45:42 -040012#include "libANGLE/Context.h"
Geoff Lang54bd5a42014-12-01 12:51:04 -050013#include "libANGLE/Framebuffer.h"
Geoff Langb5d8f232014-12-04 15:43:01 -050014#include "libANGLE/FramebufferAttachment.h"
Jamie Madillc46f45d2015-03-31 13:20:55 -040015#include "libANGLE/Surface.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040016#include "libANGLE/formatutils.h"
Jamie Madill8415b5f2016-04-26 13:41:39 -040017#include "libANGLE/renderer/ContextImpl.h"
Jamie Madillc46f45d2015-03-31 13:20:55 -040018#include "libANGLE/renderer/d3d/RenderTargetD3D.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040019#include "libANGLE/renderer/d3d/RenderbufferD3D.h"
20#include "libANGLE/renderer/d3d/RendererD3D.h"
Jamie Madillc46f45d2015-03-31 13:20:55 -040021#include "libANGLE/renderer/d3d/SurfaceD3D.h"
22#include "libANGLE/renderer/d3d/SwapChainD3D.h"
23#include "libANGLE/renderer/d3d/TextureD3D.h"
Geoff Lang6a1e6b92014-11-06 10:42:45 -050024
25namespace rx
26{
27
Jamie Madillf75ab352015-03-16 10:46:52 -040028namespace
29{
30
31ClearParameters GetClearParameters(const gl::State &state, GLbitfield mask)
32{
33 ClearParameters clearParams;
34 memset(&clearParams, 0, sizeof(ClearParameters));
35
36 const auto &blendState = state.getBlendState();
37
38 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
39 {
40 clearParams.clearColor[i] = false;
41 }
Shahmeer Esmail5416f752017-03-09 22:02:43 -080042 clearParams.colorF = state.getColorClearValue();
43 clearParams.colorType = GL_FLOAT;
44 clearParams.colorMaskRed = blendState.colorMaskRed;
45 clearParams.colorMaskGreen = blendState.colorMaskGreen;
46 clearParams.colorMaskBlue = blendState.colorMaskBlue;
47 clearParams.colorMaskAlpha = blendState.colorMaskAlpha;
48 clearParams.clearDepth = false;
49 clearParams.depthValue = state.getDepthClearValue();
50 clearParams.clearStencil = false;
51 clearParams.stencilValue = state.getStencilClearValue();
Jamie Madillf75ab352015-03-16 10:46:52 -040052 clearParams.stencilWriteMask = state.getDepthStencilState().stencilWritemask;
Shahmeer Esmail5416f752017-03-09 22:02:43 -080053 clearParams.scissorEnabled = state.isScissorTestEnabled();
54 clearParams.scissor = state.getScissor();
Jamie Madillf75ab352015-03-16 10:46:52 -040055
56 const gl::Framebuffer *framebufferObject = state.getDrawFramebuffer();
57 if (mask & GL_COLOR_BUFFER_BIT)
58 {
Geoff Langa15472a2015-08-11 11:48:03 -040059 if (framebufferObject->hasEnabledDrawBuffer())
Jamie Madillf75ab352015-03-16 10:46:52 -040060 {
61 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
62 {
63 clearParams.clearColor[i] = true;
64 }
65 }
66 }
67
68 if (mask & GL_DEPTH_BUFFER_BIT)
69 {
Yunchao He4f285442017-04-21 12:15:49 +080070 if (state.getDepthStencilState().depthMask &&
71 framebufferObject->getDepthbuffer() != nullptr)
Jamie Madillf75ab352015-03-16 10:46:52 -040072 {
73 clearParams.clearDepth = true;
74 }
75 }
76
77 if (mask & GL_STENCIL_BUFFER_BIT)
78 {
Yunchao He4f285442017-04-21 12:15:49 +080079 if (framebufferObject->getStencilbuffer() != nullptr &&
Jamie Madillf75ab352015-03-16 10:46:52 -040080 framebufferObject->getStencilbuffer()->getStencilSize() > 0)
81 {
82 clearParams.clearStencil = true;
83 }
84 }
85
86 return clearParams;
87}
Jamie Madillf75ab352015-03-16 10:46:52 -040088}
89
Jamie Madill48ef11b2016-04-27 15:21:52 -040090FramebufferD3D::FramebufferD3D(const gl::FramebufferState &data, RendererD3D *renderer)
Jamie Madill60ec6ea2016-01-22 15:27:19 -050091 : FramebufferImpl(data), mRenderer(renderer)
Geoff Langda88add2014-12-01 10:22:01 -050092{
Geoff Langda88add2014-12-01 10:22:01 -050093}
94
95FramebufferD3D::~FramebufferD3D()
96{
97}
98
Jamie Madillc564c072017-06-01 12:45:42 -040099gl::Error FramebufferD3D::clear(const gl::Context *context, GLbitfield mask)
Geoff Langb04dc822014-12-01 12:02:02 -0500100{
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700101 ClearParameters clearParams = GetClearParameters(context->getGLState(), mask);
Jamie Madill8415b5f2016-04-26 13:41:39 -0400102 return clearImpl(context, clearParams);
Geoff Langb04dc822014-12-01 12:02:02 -0500103}
104
Jamie Madillc564c072017-06-01 12:45:42 -0400105gl::Error FramebufferD3D::clearBufferfv(const gl::Context *context,
Dian Xiang40281592015-11-19 18:24:44 -0800106 GLenum buffer,
107 GLint drawbuffer,
108 const GLfloat *values)
Geoff Langb04dc822014-12-01 12:02:02 -0500109{
110 // glClearBufferfv can be called to clear the color buffer or depth buffer
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700111 ClearParameters clearParams = GetClearParameters(context->getGLState(), 0);
Geoff Langb04dc822014-12-01 12:02:02 -0500112
113 if (buffer == GL_COLOR)
114 {
115 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
116 {
117 clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
118 }
Shahmeer Esmail5416f752017-03-09 22:02:43 -0800119 clearParams.colorF = gl::ColorF(values[0], values[1], values[2], values[3]);
120 clearParams.colorType = GL_FLOAT;
Geoff Langb04dc822014-12-01 12:02:02 -0500121 }
122
123 if (buffer == GL_DEPTH)
124 {
125 clearParams.clearDepth = true;
Shahmeer Esmail5416f752017-03-09 22:02:43 -0800126 clearParams.depthValue = values[0];
Geoff Langb04dc822014-12-01 12:02:02 -0500127 }
128
Jamie Madill8415b5f2016-04-26 13:41:39 -0400129 return clearImpl(context, clearParams);
Geoff Langb04dc822014-12-01 12:02:02 -0500130}
131
Jamie Madillc564c072017-06-01 12:45:42 -0400132gl::Error FramebufferD3D::clearBufferuiv(const gl::Context *context,
Dian Xiang40281592015-11-19 18:24:44 -0800133 GLenum buffer,
134 GLint drawbuffer,
135 const GLuint *values)
Geoff Langb04dc822014-12-01 12:02:02 -0500136{
137 // glClearBufferuiv can only be called to clear a color buffer
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700138 ClearParameters clearParams = GetClearParameters(context->getGLState(), 0);
Geoff Langb04dc822014-12-01 12:02:02 -0500139 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
140 {
141 clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
142 }
Shahmeer Esmail5416f752017-03-09 22:02:43 -0800143 clearParams.colorUI = gl::ColorUI(values[0], values[1], values[2], values[3]);
144 clearParams.colorType = GL_UNSIGNED_INT;
Geoff Langb04dc822014-12-01 12:02:02 -0500145
Jamie Madill8415b5f2016-04-26 13:41:39 -0400146 return clearImpl(context, clearParams);
Geoff Langb04dc822014-12-01 12:02:02 -0500147}
148
Jamie Madillc564c072017-06-01 12:45:42 -0400149gl::Error FramebufferD3D::clearBufferiv(const gl::Context *context,
Dian Xiang40281592015-11-19 18:24:44 -0800150 GLenum buffer,
151 GLint drawbuffer,
152 const GLint *values)
Geoff Langb04dc822014-12-01 12:02:02 -0500153{
154 // glClearBufferiv can be called to clear the color buffer or stencil buffer
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700155 ClearParameters clearParams = GetClearParameters(context->getGLState(), 0);
Geoff Langb04dc822014-12-01 12:02:02 -0500156
157 if (buffer == GL_COLOR)
158 {
159 for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
160 {
161 clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
162 }
Shahmeer Esmail5416f752017-03-09 22:02:43 -0800163 clearParams.colorI = gl::ColorI(values[0], values[1], values[2], values[3]);
164 clearParams.colorType = GL_INT;
Geoff Langb04dc822014-12-01 12:02:02 -0500165 }
166
167 if (buffer == GL_STENCIL)
168 {
169 clearParams.clearStencil = true;
Jamie Madill805d2812017-09-20 13:21:42 -0400170 clearParams.stencilValue = values[0];
Geoff Langb04dc822014-12-01 12:02:02 -0500171 }
172
Jamie Madill8415b5f2016-04-26 13:41:39 -0400173 return clearImpl(context, clearParams);
Geoff Langb04dc822014-12-01 12:02:02 -0500174}
175
Jamie Madillc564c072017-06-01 12:45:42 -0400176gl::Error FramebufferD3D::clearBufferfi(const gl::Context *context,
Dian Xiang40281592015-11-19 18:24:44 -0800177 GLenum buffer,
178 GLint drawbuffer,
179 GLfloat depth,
180 GLint stencil)
Geoff Langb04dc822014-12-01 12:02:02 -0500181{
182 // glClearBufferfi can only be called to clear a depth stencil buffer
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700183 ClearParameters clearParams = GetClearParameters(context->getGLState(), 0);
Shahmeer Esmail5416f752017-03-09 22:02:43 -0800184 clearParams.clearDepth = true;
185 clearParams.depthValue = depth;
186 clearParams.clearStencil = true;
187 clearParams.stencilValue = stencil;
Geoff Langb04dc822014-12-01 12:02:02 -0500188
Jamie Madill8415b5f2016-04-26 13:41:39 -0400189 return clearImpl(context, clearParams);
Geoff Langb04dc822014-12-01 12:02:02 -0500190}
191
Jamie Madill4928b7c2017-06-20 12:57:39 -0400192GLenum FramebufferD3D::getImplementationColorReadFormat(const gl::Context *context) const
Geoff Langbce529e2014-12-01 12:48:41 -0500193{
Jamie Madill48ef11b2016-04-27 15:21:52 -0400194 const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment();
Geoff Langbce529e2014-12-01 12:48:41 -0500195
Jamie Madillb885e572015-02-03 16:16:04 -0500196 if (readAttachment == nullptr)
Geoff Langbce529e2014-12-01 12:48:41 -0500197 {
198 return GL_NONE;
199 }
200
Yunchao Hed7297bf2017-04-19 15:27:10 +0800201 RenderTargetD3D *attachmentRenderTarget = nullptr;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400202 gl::Error error = readAttachment->getRenderTarget(context, &attachmentRenderTarget);
Geoff Langd8a22582014-12-17 15:28:23 -0500203 if (error.isError())
204 {
205 return GL_NONE;
206 }
Geoff Langbce529e2014-12-01 12:48:41 -0500207
Geoff Langd8a22582014-12-17 15:28:23 -0500208 GLenum implementationFormat = getRenderTargetImplementationFormat(attachmentRenderTarget);
Geoff Langca271392017-04-05 12:30:00 -0400209 const gl::InternalFormat &implementationFormatInfo =
210 gl::GetSizedInternalFormatInfo(implementationFormat);
Geoff Langd8a22582014-12-17 15:28:23 -0500211
Geoff Langf607c602016-09-21 11:46:48 -0400212 return implementationFormatInfo.getReadPixelsFormat();
Geoff Langbce529e2014-12-01 12:48:41 -0500213}
214
Jamie Madill4928b7c2017-06-20 12:57:39 -0400215GLenum FramebufferD3D::getImplementationColorReadType(const gl::Context *context) const
Geoff Langbce529e2014-12-01 12:48:41 -0500216{
Jamie Madill48ef11b2016-04-27 15:21:52 -0400217 const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment();
Geoff Langbce529e2014-12-01 12:48:41 -0500218
Jamie Madillb885e572015-02-03 16:16:04 -0500219 if (readAttachment == nullptr)
Geoff Langbce529e2014-12-01 12:48:41 -0500220 {
221 return GL_NONE;
222 }
223
Yunchao Hed7297bf2017-04-19 15:27:10 +0800224 RenderTargetD3D *attachmentRenderTarget = nullptr;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400225 gl::Error error = readAttachment->getRenderTarget(context, &attachmentRenderTarget);
Geoff Langd8a22582014-12-17 15:28:23 -0500226 if (error.isError())
227 {
228 return GL_NONE;
229 }
Geoff Langbce529e2014-12-01 12:48:41 -0500230
Geoff Langd8a22582014-12-17 15:28:23 -0500231 GLenum implementationFormat = getRenderTargetImplementationFormat(attachmentRenderTarget);
Geoff Langca271392017-04-05 12:30:00 -0400232 const gl::InternalFormat &implementationFormatInfo =
233 gl::GetSizedInternalFormatInfo(implementationFormat);
Geoff Langd8a22582014-12-17 15:28:23 -0500234
Geoff Langf607c602016-09-21 11:46:48 -0400235 return implementationFormatInfo.getReadPixelsType();
Geoff Langbce529e2014-12-01 12:48:41 -0500236}
237
Jamie Madillc564c072017-06-01 12:45:42 -0400238gl::Error FramebufferD3D::readPixels(const gl::Context *context,
Frank Henigman739bd8b2017-06-19 21:02:27 -0400239 const gl::Rectangle &origArea,
Jamie Madill8415b5f2016-04-26 13:41:39 -0400240 GLenum format,
241 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -0400242 void *pixels) const
Geoff Langbce529e2014-12-01 12:48:41 -0500243{
Frank Henigman739bd8b2017-06-19 21:02:27 -0400244 // Clip read area to framebuffer.
245 const gl::Extents fbSize = getState().getReadAttachment()->getSize();
246 const gl::Rectangle fbRect(0, 0, fbSize.width, fbSize.height);
247 gl::Rectangle area;
248 if (!ClipRectangle(origArea, fbRect, &area))
249 {
250 // nothing to read
251 return gl::NoError();
252 }
253
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700254 const gl::PixelPackState &packState = context->getGLState().getPackState();
Jamie Madill87de3622015-03-16 10:41:44 -0400255
Geoff Langca271392017-04-05 12:30:00 -0400256 const gl::InternalFormat &sizedFormatInfo = gl::GetInternalFormatInfo(format, type);
Corentin Wallez886de362016-09-27 10:49:35 -0400257
258 GLuint outputPitch = 0;
Frank Henigman739bd8b2017-06-19 21:02:27 -0400259 ANGLE_TRY_RESULT(sizedFormatInfo.computeRowPitch(type, origArea.width, packState.alignment,
260 packState.rowLength),
261 outputPitch);
Olli Etuaho989cac32016-06-08 16:18:49 -0700262 GLuint outputSkipBytes = 0;
Corentin Wallez886de362016-09-27 10:49:35 -0400263 ANGLE_TRY_RESULT(sizedFormatInfo.computeSkipBytes(outputPitch, 0, packState, false),
Olli Etuaho989cac32016-06-08 16:18:49 -0700264 outputSkipBytes);
Frank Henigman739bd8b2017-06-19 21:02:27 -0400265 outputSkipBytes +=
266 (area.x - origArea.x) * sizedFormatInfo.pixelBytes + (area.y - origArea.y) * outputPitch;
Geoff Langbce529e2014-12-01 12:48:41 -0500267
Jamie Madill4928b7c2017-06-20 12:57:39 -0400268 return readPixelsImpl(context, area, format, type, outputPitch, packState,
Minmin Gongadff67b2015-10-14 10:34:45 -0400269 reinterpret_cast<uint8_t *>(pixels) + outputSkipBytes);
Geoff Langbce529e2014-12-01 12:48:41 -0500270}
271
Jamie Madillc564c072017-06-01 12:45:42 -0400272gl::Error FramebufferD3D::blit(const gl::Context *context,
Jamie Madill8415b5f2016-04-26 13:41:39 -0400273 const gl::Rectangle &sourceArea,
274 const gl::Rectangle &destArea,
275 GLbitfield mask,
276 GLenum filter)
Geoff Lang54bd5a42014-12-01 12:51:04 -0500277{
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700278 const auto &glState = context->getGLState();
Jamie Madill8415b5f2016-04-26 13:41:39 -0400279 const gl::Framebuffer *sourceFramebuffer = glState.getReadFramebuffer();
He Yunchao6be602d2016-12-22 14:33:07 +0800280 const gl::Rectangle *scissor = glState.isScissorTestEnabled() ? &glState.getScissor() : nullptr;
Jamie Madillfe548342017-06-19 11:13:24 -0400281 ANGLE_TRY(blitImpl(context, sourceArea, destArea, scissor, (mask & GL_COLOR_BUFFER_BIT) != 0,
He Yunchao6be602d2016-12-22 14:33:07 +0800282 (mask & GL_DEPTH_BUFFER_BIT) != 0, (mask & GL_STENCIL_BUFFER_BIT) != 0,
283 filter, sourceFramebuffer));
Geoff Lang54bd5a42014-12-01 12:51:04 -0500284
He Yunchaoacd18982017-01-04 10:46:42 +0800285 return gl::NoError();
Geoff Lang54bd5a42014-12-01 12:51:04 -0500286}
287
Jamie Madillcc86d642015-11-24 13:00:07 -0500288bool FramebufferD3D::checkStatus() const
Geoff Lang748f74e2014-12-01 11:25:34 -0500289{
Geoff Langc2520562015-04-29 11:42:33 -0400290 // if we have both a depth and stencil buffer, they must refer to the same object
291 // since we only support packed_depth_stencil and not separate depth and stencil
Jamie Madill48ef11b2016-04-27 15:21:52 -0400292 if (mState.getDepthAttachment() != nullptr && mState.getStencilAttachment() != nullptr &&
293 mState.getDepthStencilAttachment() == nullptr)
Geoff Langc2520562015-04-29 11:42:33 -0400294 {
Jamie Madillcc86d642015-11-24 13:00:07 -0500295 return false;
Geoff Langc2520562015-04-29 11:42:33 -0400296 }
297
Geoff Langb21e20d2016-07-19 15:35:41 -0400298 // D3D11 does not allow for overlapping RenderTargetViews
299 if (!mState.colorAttachmentsAreUniqueImages())
Geoff Lang748f74e2014-12-01 11:25:34 -0500300 {
Geoff Langb21e20d2016-07-19 15:35:41 -0400301 return false;
Geoff Lang748f74e2014-12-01 11:25:34 -0500302 }
303
Jamie Madillcc86d642015-11-24 13:00:07 -0500304 // D3D requires all render targets to have the same dimensions.
Jamie Madill48ef11b2016-04-27 15:21:52 -0400305 if (!mState.attachmentsHaveSameDimensions())
Jamie Madillcc86d642015-11-24 13:00:07 -0500306 {
307 return false;
308 }
309
310 return true;
Geoff Lang748f74e2014-12-01 11:25:34 -0500311}
312
Jamie Madillc564c072017-06-01 12:45:42 -0400313void FramebufferD3D::syncState(const gl::Context *context,
Jamie Madilldd43e6c2017-03-24 14:18:49 -0400314 const gl::Framebuffer::DirtyBits &dirtyBits)
Jamie Madill7147f012015-03-05 15:41:40 -0500315{
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500316 if (!mColorAttachmentsForRender.valid())
Jamie Madill85a18042015-03-05 15:41:41 -0500317 {
Corentin Wallezdb9e5d32017-06-12 12:05:45 -0700318 return;
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500319 }
320
Jamie Madill6de51852017-04-12 09:53:01 -0400321 for (auto dirtyBit : dirtyBits)
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500322 {
323 if ((dirtyBit >= gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0 &&
324 dirtyBit < gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_MAX) ||
325 dirtyBit == gl::Framebuffer::DIRTY_BIT_DRAW_BUFFERS)
326 {
Corentin Wallezdb9e5d32017-06-12 12:05:45 -0700327 mColorAttachmentsForRender.reset();
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500328 }
329 }
Corentin Wallezdb9e5d32017-06-12 12:05:45 -0700330}
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500331
Corentin Wallezdb9e5d32017-06-12 12:05:45 -0700332const gl::AttachmentList &FramebufferD3D::getColorAttachmentsForRender(const gl::Context *context)
333{
334 gl::DrawBufferMask activeProgramOutputs =
335 context->getContextState().getState().getProgram()->getActiveOutputVariables();
336
337 if (mColorAttachmentsForRender.valid() && mCurrentActiveProgramOutputs == activeProgramOutputs)
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500338 {
Corentin Wallezdb9e5d32017-06-12 12:05:45 -0700339 return mColorAttachmentsForRender.value();
Jamie Madill85a18042015-03-05 15:41:41 -0500340 }
341
Jamie Madill7147f012015-03-05 15:41:40 -0500342 // Does not actually free memory
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500343 gl::AttachmentList colorAttachmentsForRender;
Jamie Madill7147f012015-03-05 15:41:40 -0500344
Jamie Madill48ef11b2016-04-27 15:21:52 -0400345 const auto &colorAttachments = mState.getColorAttachments();
346 const auto &drawBufferStates = mState.getDrawBufferStates();
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500347 const auto &workarounds = mRenderer->getWorkarounds();
Jamie Madill2d06b732015-04-20 12:53:28 -0400348
Jamie Madillb6bda4a2015-04-20 12:53:26 -0400349 for (size_t attachmentIndex = 0; attachmentIndex < colorAttachments.size(); ++attachmentIndex)
Jamie Madill7147f012015-03-05 15:41:40 -0500350 {
Jamie Madill231c7f52017-04-26 13:45:37 -0400351 GLenum drawBufferState = drawBufferStates[attachmentIndex];
Jamie Madill2d06b732015-04-20 12:53:28 -0400352 const gl::FramebufferAttachment &colorAttachment = colorAttachments[attachmentIndex];
Jamie Madill7147f012015-03-05 15:41:40 -0500353
Corentin Wallezdb9e5d32017-06-12 12:05:45 -0700354 if (colorAttachment.isAttached() && drawBufferState != GL_NONE &&
355 activeProgramOutputs[attachmentIndex])
Jamie Madill7147f012015-03-05 15:41:40 -0500356 {
Jamie Madill231c7f52017-04-26 13:45:37 -0400357 ASSERT(drawBufferState == GL_BACK ||
358 drawBufferState == (GL_COLOR_ATTACHMENT0_EXT + attachmentIndex));
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500359 colorAttachmentsForRender.push_back(&colorAttachment);
Jamie Madill7147f012015-03-05 15:41:40 -0500360 }
Jamie Madillb6bda4a2015-04-20 12:53:26 -0400361 else if (!workarounds.mrtPerfWorkaround)
362 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500363 colorAttachmentsForRender.push_back(nullptr);
Jamie Madillb6bda4a2015-04-20 12:53:26 -0400364 }
Jamie Madill7147f012015-03-05 15:41:40 -0500365 }
366
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500367 mColorAttachmentsForRender = std::move(colorAttachmentsForRender);
Corentin Wallezdb9e5d32017-06-12 12:05:45 -0700368 mCurrentActiveProgramOutputs = activeProgramOutputs;
Jamie Madill7147f012015-03-05 15:41:40 -0500369
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500370 return mColorAttachmentsForRender.value();
Geoff Lang6a1e6b92014-11-06 10:42:45 -0500371}
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500372
373} // namespace rx