blob: bca9f8f44425e71e18dd5d75db554f223703a302 [file] [log] [blame]
Geoff Langd08f3b32016-09-23 15:56:30 -04001//
2// Copyright 2016 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// FramebufferNULL.cpp:
7// Implements the class methods for FramebufferNULL.
8//
9
10#include "libANGLE/renderer/null/FramebufferNULL.h"
11
Corentin Wallezaf11b532017-08-30 15:51:36 -040012#include "libANGLE/Context.h"
Geoff Lang2291c932016-11-18 14:10:17 -050013#include "libANGLE/formatutils.h"
Corentin Wallezaf11b532017-08-30 15:51:36 -040014#include "libANGLE/renderer/null/BufferNULL.h"
Geoff Lang2291c932016-11-18 14:10:17 -050015
Geoff Langd08f3b32016-09-23 15:56:30 -040016#include "common/debug.h"
17
18namespace rx
19{
20
21FramebufferNULL::FramebufferNULL(const gl::FramebufferState &state) : FramebufferImpl(state)
22{
23}
24
25FramebufferNULL::~FramebufferNULL()
26{
27}
28
Jamie Madill4928b7c2017-06-20 12:57:39 -040029gl::Error FramebufferNULL::discard(const gl::Context *context,
30 size_t count,
31 const GLenum *attachments)
Geoff Langd08f3b32016-09-23 15:56:30 -040032{
Geoff Lang76cdbd52016-09-23 16:51:04 -040033 return gl::NoError();
Geoff Langd08f3b32016-09-23 15:56:30 -040034}
35
Jamie Madill4928b7c2017-06-20 12:57:39 -040036gl::Error FramebufferNULL::invalidate(const gl::Context *context,
37 size_t count,
38 const GLenum *attachments)
Geoff Langd08f3b32016-09-23 15:56:30 -040039{
Geoff Lang76cdbd52016-09-23 16:51:04 -040040 return gl::NoError();
Geoff Langd08f3b32016-09-23 15:56:30 -040041}
42
Jamie Madill4928b7c2017-06-20 12:57:39 -040043gl::Error FramebufferNULL::invalidateSub(const gl::Context *context,
44 size_t count,
Geoff Langd08f3b32016-09-23 15:56:30 -040045 const GLenum *attachments,
46 const gl::Rectangle &area)
47{
Geoff Lang76cdbd52016-09-23 16:51:04 -040048 return gl::NoError();
Geoff Langd08f3b32016-09-23 15:56:30 -040049}
50
Jamie Madillc564c072017-06-01 12:45:42 -040051gl::Error FramebufferNULL::clear(const gl::Context *context, GLbitfield mask)
Geoff Langd08f3b32016-09-23 15:56:30 -040052{
Geoff Lang76cdbd52016-09-23 16:51:04 -040053 return gl::NoError();
Geoff Langd08f3b32016-09-23 15:56:30 -040054}
55
Jamie Madillc564c072017-06-01 12:45:42 -040056gl::Error FramebufferNULL::clearBufferfv(const gl::Context *context,
Geoff Langd08f3b32016-09-23 15:56:30 -040057 GLenum buffer,
58 GLint drawbuffer,
59 const GLfloat *values)
60{
Geoff Lang76cdbd52016-09-23 16:51:04 -040061 return gl::NoError();
Geoff Langd08f3b32016-09-23 15:56:30 -040062}
63
Jamie Madillc564c072017-06-01 12:45:42 -040064gl::Error FramebufferNULL::clearBufferuiv(const gl::Context *context,
Geoff Langd08f3b32016-09-23 15:56:30 -040065 GLenum buffer,
66 GLint drawbuffer,
67 const GLuint *values)
68{
Geoff Lang76cdbd52016-09-23 16:51:04 -040069 return gl::NoError();
Geoff Langd08f3b32016-09-23 15:56:30 -040070}
71
Jamie Madillc564c072017-06-01 12:45:42 -040072gl::Error FramebufferNULL::clearBufferiv(const gl::Context *context,
Geoff Langd08f3b32016-09-23 15:56:30 -040073 GLenum buffer,
74 GLint drawbuffer,
75 const GLint *values)
76{
Geoff Lang76cdbd52016-09-23 16:51:04 -040077 return gl::NoError();
Geoff Langd08f3b32016-09-23 15:56:30 -040078}
79
Jamie Madillc564c072017-06-01 12:45:42 -040080gl::Error FramebufferNULL::clearBufferfi(const gl::Context *context,
Geoff Langd08f3b32016-09-23 15:56:30 -040081 GLenum buffer,
82 GLint drawbuffer,
83 GLfloat depth,
84 GLint stencil)
85{
Geoff Lang76cdbd52016-09-23 16:51:04 -040086 return gl::NoError();
Geoff Langd08f3b32016-09-23 15:56:30 -040087}
88
Jamie Madill4928b7c2017-06-20 12:57:39 -040089GLenum FramebufferNULL::getImplementationColorReadFormat(const gl::Context *context) const
Geoff Langd08f3b32016-09-23 15:56:30 -040090{
Geoff Lang2291c932016-11-18 14:10:17 -050091 const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment();
92 if (readAttachment == nullptr)
93 {
94 return GL_NONE;
95 }
96
97 const gl::Format &format = readAttachment->getFormat();
98 ASSERT(format.info != nullptr);
99 return format.info->getReadPixelsFormat();
Geoff Langd08f3b32016-09-23 15:56:30 -0400100}
101
Jamie Madill4928b7c2017-06-20 12:57:39 -0400102GLenum FramebufferNULL::getImplementationColorReadType(const gl::Context *context) const
Geoff Langd08f3b32016-09-23 15:56:30 -0400103{
Geoff Lang2291c932016-11-18 14:10:17 -0500104 const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment();
105 if (readAttachment == nullptr)
106 {
107 return GL_NONE;
108 }
109
110 const gl::Format &format = readAttachment->getFormat();
111 ASSERT(format.info != nullptr);
Geoff Langc71ea662017-09-26 17:06:02 -0400112 return format.info->getReadPixelsType(context->getClientVersion());
Geoff Langd08f3b32016-09-23 15:56:30 -0400113}
114
Jamie Madillc564c072017-06-01 12:45:42 -0400115gl::Error FramebufferNULL::readPixels(const gl::Context *context,
Corentin Wallezaf11b532017-08-30 15:51:36 -0400116 const gl::Rectangle &origArea,
Geoff Langd08f3b32016-09-23 15:56:30 -0400117 GLenum format,
118 GLenum type,
Jamie Madilld4826152017-09-21 11:18:59 -0400119 void *ptrOrOffset)
Geoff Langd08f3b32016-09-23 15:56:30 -0400120{
Corentin Wallezaf11b532017-08-30 15:51:36 -0400121 const gl::PixelPackState &packState = context->getGLState().getPackState();
Corentin Wallezcda6af12017-10-30 19:20:37 -0400122 gl::Buffer *packBuffer = context->getGLState().getTargetBuffer(GL_PIXEL_PACK_BUFFER);
Corentin Wallezaf11b532017-08-30 15:51:36 -0400123
124 // Get the pointer to write to from the argument or the pack buffer
125 GLubyte *pixels = nullptr;
Corentin Wallezcda6af12017-10-30 19:20:37 -0400126 if (packBuffer != nullptr)
Corentin Wallezaf11b532017-08-30 15:51:36 -0400127 {
Corentin Wallezcda6af12017-10-30 19:20:37 -0400128 BufferNULL *packBufferGL = GetImplAs<BufferNULL>(packBuffer);
129 pixels = reinterpret_cast<GLubyte *>(packBufferGL->getDataPtr());
Corentin Wallezaf11b532017-08-30 15:51:36 -0400130 pixels += reinterpret_cast<intptr_t>(ptrOrOffset);
131 }
132 else
133 {
134 pixels = reinterpret_cast<GLubyte *>(ptrOrOffset);
135 }
136
137 // Clip read area to framebuffer.
138 const gl::Extents fbSize = getState().getReadAttachment()->getSize();
139 const gl::Rectangle fbRect(0, 0, fbSize.width, fbSize.height);
140 gl::Rectangle area;
141 if (!ClipRectangle(origArea, fbRect, &area))
142 {
143 // nothing to read
144 return gl::NoError();
145 }
146
147 // Compute size of unclipped rows and initial skip
148 const gl::InternalFormat &glFormat = gl::GetInternalFormatInfo(format, type);
149
150 GLuint rowBytes = 0;
151 ANGLE_TRY_RESULT(
152 glFormat.computeRowPitch(type, origArea.width, packState.alignment, packState.rowLength),
153 rowBytes);
154
155 GLuint skipBytes = 0;
156 ANGLE_TRY_RESULT(glFormat.computeSkipBytes(rowBytes, 0, packState, false), skipBytes);
157 pixels += skipBytes;
158
159 // Skip OOB region up to first in bounds pixel
160 int leftClip = area.x - origArea.x;
161 int topClip = area.y - origArea.y;
162 pixels += leftClip * glFormat.pixelBytes + topClip * rowBytes;
163
164 // Write the in-bounds readpixels data with non-zero values
165 for (GLint y = area.y; y < area.y + area.height; ++y)
166 {
167 memset(pixels, 42, glFormat.pixelBytes * area.width);
168 pixels += rowBytes;
169 }
170
Geoff Lang76cdbd52016-09-23 16:51:04 -0400171 return gl::NoError();
Geoff Langd08f3b32016-09-23 15:56:30 -0400172}
173
Jamie Madillc564c072017-06-01 12:45:42 -0400174gl::Error FramebufferNULL::blit(const gl::Context *context,
Geoff Langd08f3b32016-09-23 15:56:30 -0400175 const gl::Rectangle &sourceArea,
176 const gl::Rectangle &destArea,
177 GLbitfield mask,
178 GLenum filter)
179{
Geoff Lang76cdbd52016-09-23 16:51:04 -0400180 return gl::NoError();
Geoff Langd08f3b32016-09-23 15:56:30 -0400181}
182
Kenneth Russellce8602a2017-10-03 18:23:08 -0700183bool FramebufferNULL::checkStatus(const gl::Context *context) const
Geoff Langd08f3b32016-09-23 15:56:30 -0400184{
Geoff Lang76cdbd52016-09-23 16:51:04 -0400185 return true;
Geoff Langd08f3b32016-09-23 15:56:30 -0400186}
187
Jamie Madillc564c072017-06-01 12:45:42 -0400188void FramebufferNULL::syncState(const gl::Context *context,
Jamie Madilldd43e6c2017-03-24 14:18:49 -0400189 const gl::Framebuffer::DirtyBits &dirtyBits)
Geoff Langd08f3b32016-09-23 15:56:30 -0400190{
Geoff Langd08f3b32016-09-23 15:56:30 -0400191}
192
JiangYizhoubddc46b2016-12-09 09:50:51 +0800193gl::Error FramebufferNULL::getSamplePosition(size_t index, GLfloat *xy) const
194{
195 return gl::NoError();
196}
197
Geoff Langd08f3b32016-09-23 15:56:30 -0400198} // namespace rx