blob: 20ce293bf633c9a995cab8ad6efb0e62119b5083 [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;
Shahmeer Esmail5416f752017-03-09 22:02:43 -0800170 clearParams.stencilValue = values[1];
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
Geoff Langbce529e2014-12-01 12:48:41 -0500192GLenum FramebufferD3D::getImplementationColorReadFormat() const
193{
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 Madill8cf813c2015-05-04 12:55:18 -0400202 gl::Error error = readAttachment->getRenderTarget(&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
215GLenum FramebufferD3D::getImplementationColorReadType() const
216{
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 Madill8cf813c2015-05-04 12:55:18 -0400225 gl::Error error = readAttachment->getRenderTarget(&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,
Jamie Madill8415b5f2016-04-26 13:41:39 -0400239 const gl::Rectangle &area,
240 GLenum format,
241 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -0400242 void *pixels) const
Geoff Langbce529e2014-12-01 12:48:41 -0500243{
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700244 const gl::PixelPackState &packState = context->getGLState().getPackState();
Jamie Madill87de3622015-03-16 10:41:44 -0400245
Geoff Langca271392017-04-05 12:30:00 -0400246 const gl::InternalFormat &sizedFormatInfo = gl::GetInternalFormatInfo(format, type);
Corentin Wallez886de362016-09-27 10:49:35 -0400247
248 GLuint outputPitch = 0;
Jamie Madille2e406c2016-06-02 13:04:10 -0400249 ANGLE_TRY_RESULT(
250 sizedFormatInfo.computeRowPitch(type, area.width, packState.alignment, packState.rowLength),
251 outputPitch);
Olli Etuaho989cac32016-06-08 16:18:49 -0700252 GLuint outputSkipBytes = 0;
Corentin Wallez886de362016-09-27 10:49:35 -0400253 ANGLE_TRY_RESULT(sizedFormatInfo.computeSkipBytes(outputPitch, 0, packState, false),
Olli Etuaho989cac32016-06-08 16:18:49 -0700254 outputSkipBytes);
Geoff Langbce529e2014-12-01 12:48:41 -0500255
Minmin Gongadff67b2015-10-14 10:34:45 -0400256 return readPixelsImpl(area, format, type, outputPitch, packState,
257 reinterpret_cast<uint8_t *>(pixels) + outputSkipBytes);
Geoff Langbce529e2014-12-01 12:48:41 -0500258}
259
Jamie Madillc564c072017-06-01 12:45:42 -0400260gl::Error FramebufferD3D::blit(const gl::Context *context,
Jamie Madill8415b5f2016-04-26 13:41:39 -0400261 const gl::Rectangle &sourceArea,
262 const gl::Rectangle &destArea,
263 GLbitfield mask,
264 GLenum filter)
Geoff Lang54bd5a42014-12-01 12:51:04 -0500265{
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700266 const auto &glState = context->getGLState();
Jamie Madill8415b5f2016-04-26 13:41:39 -0400267 const gl::Framebuffer *sourceFramebuffer = glState.getReadFramebuffer();
He Yunchao6be602d2016-12-22 14:33:07 +0800268 const gl::Rectangle *scissor = glState.isScissorTestEnabled() ? &glState.getScissor() : nullptr;
269 ANGLE_TRY(blitImpl(sourceArea, destArea, scissor, (mask & GL_COLOR_BUFFER_BIT) != 0,
270 (mask & GL_DEPTH_BUFFER_BIT) != 0, (mask & GL_STENCIL_BUFFER_BIT) != 0,
271 filter, sourceFramebuffer));
Geoff Lang54bd5a42014-12-01 12:51:04 -0500272
He Yunchaoacd18982017-01-04 10:46:42 +0800273 return gl::NoError();
Geoff Lang54bd5a42014-12-01 12:51:04 -0500274}
275
Jamie Madillcc86d642015-11-24 13:00:07 -0500276bool FramebufferD3D::checkStatus() const
Geoff Lang748f74e2014-12-01 11:25:34 -0500277{
Geoff Langc2520562015-04-29 11:42:33 -0400278 // if we have both a depth and stencil buffer, they must refer to the same object
279 // since we only support packed_depth_stencil and not separate depth and stencil
Jamie Madill48ef11b2016-04-27 15:21:52 -0400280 if (mState.getDepthAttachment() != nullptr && mState.getStencilAttachment() != nullptr &&
281 mState.getDepthStencilAttachment() == nullptr)
Geoff Langc2520562015-04-29 11:42:33 -0400282 {
Jamie Madillcc86d642015-11-24 13:00:07 -0500283 return false;
Geoff Langc2520562015-04-29 11:42:33 -0400284 }
285
Geoff Langb21e20d2016-07-19 15:35:41 -0400286 // D3D11 does not allow for overlapping RenderTargetViews
287 if (!mState.colorAttachmentsAreUniqueImages())
Geoff Lang748f74e2014-12-01 11:25:34 -0500288 {
Geoff Langb21e20d2016-07-19 15:35:41 -0400289 return false;
Geoff Lang748f74e2014-12-01 11:25:34 -0500290 }
291
Jamie Madillcc86d642015-11-24 13:00:07 -0500292 // D3D requires all render targets to have the same dimensions.
Jamie Madill48ef11b2016-04-27 15:21:52 -0400293 if (!mState.attachmentsHaveSameDimensions())
Jamie Madillcc86d642015-11-24 13:00:07 -0500294 {
295 return false;
296 }
297
298 return true;
Geoff Lang748f74e2014-12-01 11:25:34 -0500299}
300
Jamie Madillc564c072017-06-01 12:45:42 -0400301void FramebufferD3D::syncState(const gl::Context *context,
Jamie Madilldd43e6c2017-03-24 14:18:49 -0400302 const gl::Framebuffer::DirtyBits &dirtyBits)
Jamie Madill7147f012015-03-05 15:41:40 -0500303{
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500304 bool invalidateColorAttachmentCache = false;
305
306 if (!mColorAttachmentsForRender.valid())
Jamie Madill85a18042015-03-05 15:41:41 -0500307 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500308 invalidateColorAttachmentCache = true;
309 }
310
Jamie Madill6de51852017-04-12 09:53:01 -0400311 for (auto dirtyBit : dirtyBits)
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500312 {
313 if ((dirtyBit >= gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0 &&
314 dirtyBit < gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_MAX) ||
315 dirtyBit == gl::Framebuffer::DIRTY_BIT_DRAW_BUFFERS)
316 {
317 invalidateColorAttachmentCache = true;
318 }
319 }
320
321 if (!invalidateColorAttachmentCache)
322 {
323 return;
Jamie Madill85a18042015-03-05 15:41:41 -0500324 }
325
Jamie Madill7147f012015-03-05 15:41:40 -0500326 // Does not actually free memory
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500327 gl::AttachmentList colorAttachmentsForRender;
Jamie Madill7147f012015-03-05 15:41:40 -0500328
Jamie Madill48ef11b2016-04-27 15:21:52 -0400329 const auto &colorAttachments = mState.getColorAttachments();
330 const auto &drawBufferStates = mState.getDrawBufferStates();
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500331 const auto &workarounds = mRenderer->getWorkarounds();
Jamie Madill2d06b732015-04-20 12:53:28 -0400332
Jamie Madillb6bda4a2015-04-20 12:53:26 -0400333 for (size_t attachmentIndex = 0; attachmentIndex < colorAttachments.size(); ++attachmentIndex)
Jamie Madill7147f012015-03-05 15:41:40 -0500334 {
Jamie Madill231c7f52017-04-26 13:45:37 -0400335 GLenum drawBufferState = drawBufferStates[attachmentIndex];
Jamie Madill2d06b732015-04-20 12:53:28 -0400336 const gl::FramebufferAttachment &colorAttachment = colorAttachments[attachmentIndex];
Jamie Madill7147f012015-03-05 15:41:40 -0500337
Jamie Madill2d06b732015-04-20 12:53:28 -0400338 if (colorAttachment.isAttached() && drawBufferState != GL_NONE)
Jamie Madill7147f012015-03-05 15:41:40 -0500339 {
Jamie Madill231c7f52017-04-26 13:45:37 -0400340 ASSERT(drawBufferState == GL_BACK ||
341 drawBufferState == (GL_COLOR_ATTACHMENT0_EXT + attachmentIndex));
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500342 colorAttachmentsForRender.push_back(&colorAttachment);
Jamie Madill7147f012015-03-05 15:41:40 -0500343 }
Jamie Madillb6bda4a2015-04-20 12:53:26 -0400344 else if (!workarounds.mrtPerfWorkaround)
345 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500346 colorAttachmentsForRender.push_back(nullptr);
Jamie Madillb6bda4a2015-04-20 12:53:26 -0400347 }
Jamie Madill7147f012015-03-05 15:41:40 -0500348 }
349
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500350 mColorAttachmentsForRender = std::move(colorAttachmentsForRender);
Jamie Madill7147f012015-03-05 15:41:40 -0500351}
352
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500353const gl::AttachmentList &FramebufferD3D::getColorAttachmentsForRender() const
354{
355 ASSERT(mColorAttachmentsForRender.valid());
356 return mColorAttachmentsForRender.value();
Geoff Lang6a1e6b92014-11-06 10:42:45 -0500357}
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500358
JiangYizhoubddc46b2016-12-09 09:50:51 +0800359gl::Error FramebufferD3D::getSamplePosition(size_t index, GLfloat *xy) const
360{
361 return gl::InternalError() << "getSamplePosition is unimplemented.";
362}
363
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500364} // namespace rx