xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/null/FramebufferNULL.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // FramebufferNULL.cpp:
7*8975f5c5SAndroid Build Coastguard Worker //    Implements the class methods for FramebufferNULL.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/null/FramebufferNULL.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/formatutils.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/null/BufferNULL.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/null/ContextNULL.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker namespace rx
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker 
FramebufferNULL(const gl::FramebufferState & state)21*8975f5c5SAndroid Build Coastguard Worker FramebufferNULL::FramebufferNULL(const gl::FramebufferState &state) : FramebufferImpl(state) {}
22*8975f5c5SAndroid Build Coastguard Worker 
~FramebufferNULL()23*8975f5c5SAndroid Build Coastguard Worker FramebufferNULL::~FramebufferNULL() {}
24*8975f5c5SAndroid Build Coastguard Worker 
discard(const gl::Context * context,size_t count,const GLenum * attachments)25*8975f5c5SAndroid Build Coastguard Worker angle::Result FramebufferNULL::discard(const gl::Context *context,
26*8975f5c5SAndroid Build Coastguard Worker                                        size_t count,
27*8975f5c5SAndroid Build Coastguard Worker                                        const GLenum *attachments)
28*8975f5c5SAndroid Build Coastguard Worker {
29*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
30*8975f5c5SAndroid Build Coastguard Worker }
31*8975f5c5SAndroid Build Coastguard Worker 
invalidate(const gl::Context * context,size_t count,const GLenum * attachments)32*8975f5c5SAndroid Build Coastguard Worker angle::Result FramebufferNULL::invalidate(const gl::Context *context,
33*8975f5c5SAndroid Build Coastguard Worker                                           size_t count,
34*8975f5c5SAndroid Build Coastguard Worker                                           const GLenum *attachments)
35*8975f5c5SAndroid Build Coastguard Worker {
36*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
37*8975f5c5SAndroid Build Coastguard Worker }
38*8975f5c5SAndroid Build Coastguard Worker 
invalidateSub(const gl::Context * context,size_t count,const GLenum * attachments,const gl::Rectangle & area)39*8975f5c5SAndroid Build Coastguard Worker angle::Result FramebufferNULL::invalidateSub(const gl::Context *context,
40*8975f5c5SAndroid Build Coastguard Worker                                              size_t count,
41*8975f5c5SAndroid Build Coastguard Worker                                              const GLenum *attachments,
42*8975f5c5SAndroid Build Coastguard Worker                                              const gl::Rectangle &area)
43*8975f5c5SAndroid Build Coastguard Worker {
44*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
45*8975f5c5SAndroid Build Coastguard Worker }
46*8975f5c5SAndroid Build Coastguard Worker 
clear(const gl::Context * context,GLbitfield mask)47*8975f5c5SAndroid Build Coastguard Worker angle::Result FramebufferNULL::clear(const gl::Context *context, GLbitfield mask)
48*8975f5c5SAndroid Build Coastguard Worker {
49*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
50*8975f5c5SAndroid Build Coastguard Worker }
51*8975f5c5SAndroid Build Coastguard Worker 
clearBufferfv(const gl::Context * context,GLenum buffer,GLint drawbuffer,const GLfloat * values)52*8975f5c5SAndroid Build Coastguard Worker angle::Result FramebufferNULL::clearBufferfv(const gl::Context *context,
53*8975f5c5SAndroid Build Coastguard Worker                                              GLenum buffer,
54*8975f5c5SAndroid Build Coastguard Worker                                              GLint drawbuffer,
55*8975f5c5SAndroid Build Coastguard Worker                                              const GLfloat *values)
56*8975f5c5SAndroid Build Coastguard Worker {
57*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
58*8975f5c5SAndroid Build Coastguard Worker }
59*8975f5c5SAndroid Build Coastguard Worker 
clearBufferuiv(const gl::Context * context,GLenum buffer,GLint drawbuffer,const GLuint * values)60*8975f5c5SAndroid Build Coastguard Worker angle::Result FramebufferNULL::clearBufferuiv(const gl::Context *context,
61*8975f5c5SAndroid Build Coastguard Worker                                               GLenum buffer,
62*8975f5c5SAndroid Build Coastguard Worker                                               GLint drawbuffer,
63*8975f5c5SAndroid Build Coastguard Worker                                               const GLuint *values)
64*8975f5c5SAndroid Build Coastguard Worker {
65*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
66*8975f5c5SAndroid Build Coastguard Worker }
67*8975f5c5SAndroid Build Coastguard Worker 
clearBufferiv(const gl::Context * context,GLenum buffer,GLint drawbuffer,const GLint * values)68*8975f5c5SAndroid Build Coastguard Worker angle::Result FramebufferNULL::clearBufferiv(const gl::Context *context,
69*8975f5c5SAndroid Build Coastguard Worker                                              GLenum buffer,
70*8975f5c5SAndroid Build Coastguard Worker                                              GLint drawbuffer,
71*8975f5c5SAndroid Build Coastguard Worker                                              const GLint *values)
72*8975f5c5SAndroid Build Coastguard Worker {
73*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
74*8975f5c5SAndroid Build Coastguard Worker }
75*8975f5c5SAndroid Build Coastguard Worker 
clearBufferfi(const gl::Context * context,GLenum buffer,GLint drawbuffer,GLfloat depth,GLint stencil)76*8975f5c5SAndroid Build Coastguard Worker angle::Result FramebufferNULL::clearBufferfi(const gl::Context *context,
77*8975f5c5SAndroid Build Coastguard Worker                                              GLenum buffer,
78*8975f5c5SAndroid Build Coastguard Worker                                              GLint drawbuffer,
79*8975f5c5SAndroid Build Coastguard Worker                                              GLfloat depth,
80*8975f5c5SAndroid Build Coastguard Worker                                              GLint stencil)
81*8975f5c5SAndroid Build Coastguard Worker {
82*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
83*8975f5c5SAndroid Build Coastguard Worker }
84*8975f5c5SAndroid Build Coastguard Worker 
readPixels(const gl::Context * context,const gl::Rectangle & origArea,GLenum format,GLenum type,const gl::PixelPackState & pack,gl::Buffer * packBuffer,void * ptrOrOffset)85*8975f5c5SAndroid Build Coastguard Worker angle::Result FramebufferNULL::readPixels(const gl::Context *context,
86*8975f5c5SAndroid Build Coastguard Worker                                           const gl::Rectangle &origArea,
87*8975f5c5SAndroid Build Coastguard Worker                                           GLenum format,
88*8975f5c5SAndroid Build Coastguard Worker                                           GLenum type,
89*8975f5c5SAndroid Build Coastguard Worker                                           const gl::PixelPackState &pack,
90*8975f5c5SAndroid Build Coastguard Worker                                           gl::Buffer *packBuffer,
91*8975f5c5SAndroid Build Coastguard Worker                                           void *ptrOrOffset)
92*8975f5c5SAndroid Build Coastguard Worker {
93*8975f5c5SAndroid Build Coastguard Worker     // Get the pointer to write to from the argument or the pack buffer
94*8975f5c5SAndroid Build Coastguard Worker     GLubyte *pixels = nullptr;
95*8975f5c5SAndroid Build Coastguard Worker     if (packBuffer != nullptr)
96*8975f5c5SAndroid Build Coastguard Worker     {
97*8975f5c5SAndroid Build Coastguard Worker         BufferNULL *packBufferGL = GetImplAs<BufferNULL>(packBuffer);
98*8975f5c5SAndroid Build Coastguard Worker         pixels                   = reinterpret_cast<GLubyte *>(packBufferGL->getDataPtr());
99*8975f5c5SAndroid Build Coastguard Worker         pixels += reinterpret_cast<intptr_t>(ptrOrOffset);
100*8975f5c5SAndroid Build Coastguard Worker     }
101*8975f5c5SAndroid Build Coastguard Worker     else
102*8975f5c5SAndroid Build Coastguard Worker     {
103*8975f5c5SAndroid Build Coastguard Worker         pixels = reinterpret_cast<GLubyte *>(ptrOrOffset);
104*8975f5c5SAndroid Build Coastguard Worker     }
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker     // Clip read area to framebuffer.
107*8975f5c5SAndroid Build Coastguard Worker     const gl::Extents fbSize = getState().getReadPixelsAttachment(format)->getSize();
108*8975f5c5SAndroid Build Coastguard Worker     const gl::Rectangle fbRect(0, 0, fbSize.width, fbSize.height);
109*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle area;
110*8975f5c5SAndroid Build Coastguard Worker     if (!ClipRectangle(origArea, fbRect, &area))
111*8975f5c5SAndroid Build Coastguard Worker     {
112*8975f5c5SAndroid Build Coastguard Worker         // nothing to read
113*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
114*8975f5c5SAndroid Build Coastguard Worker     }
115*8975f5c5SAndroid Build Coastguard Worker 
116*8975f5c5SAndroid Build Coastguard Worker     // Compute size of unclipped rows and initial skip
117*8975f5c5SAndroid Build Coastguard Worker     const gl::InternalFormat &glFormat = gl::GetInternalFormatInfo(format, type);
118*8975f5c5SAndroid Build Coastguard Worker 
119*8975f5c5SAndroid Build Coastguard Worker     ContextNULL *contextNull = GetImplAs<ContextNULL>(context);
120*8975f5c5SAndroid Build Coastguard Worker 
121*8975f5c5SAndroid Build Coastguard Worker     GLuint rowBytes = 0;
122*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CHECK_GL_MATH(contextNull, glFormat.computeRowPitch(type, origArea.width, pack.alignment,
123*8975f5c5SAndroid Build Coastguard Worker                                                               pack.rowLength, &rowBytes));
124*8975f5c5SAndroid Build Coastguard Worker 
125*8975f5c5SAndroid Build Coastguard Worker     GLuint skipBytes = 0;
126*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CHECK_GL_MATH(contextNull,
127*8975f5c5SAndroid Build Coastguard Worker                         glFormat.computeSkipBytes(type, rowBytes, 0, pack, false, &skipBytes));
128*8975f5c5SAndroid Build Coastguard Worker     pixels += skipBytes;
129*8975f5c5SAndroid Build Coastguard Worker 
130*8975f5c5SAndroid Build Coastguard Worker     // Skip OOB region up to first in bounds pixel
131*8975f5c5SAndroid Build Coastguard Worker     int leftClip = area.x - origArea.x;
132*8975f5c5SAndroid Build Coastguard Worker     int topClip  = area.y - origArea.y;
133*8975f5c5SAndroid Build Coastguard Worker     pixels += leftClip * glFormat.pixelBytes + topClip * rowBytes;
134*8975f5c5SAndroid Build Coastguard Worker 
135*8975f5c5SAndroid Build Coastguard Worker     // Write the in-bounds readpixels data with non-zero values
136*8975f5c5SAndroid Build Coastguard Worker     for (GLint y = area.y; y < area.y + area.height; ++y)
137*8975f5c5SAndroid Build Coastguard Worker     {
138*8975f5c5SAndroid Build Coastguard Worker         memset(pixels, 42, glFormat.pixelBytes * area.width);
139*8975f5c5SAndroid Build Coastguard Worker         pixels += rowBytes;
140*8975f5c5SAndroid Build Coastguard Worker     }
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
143*8975f5c5SAndroid Build Coastguard Worker }
144*8975f5c5SAndroid Build Coastguard Worker 
blit(const gl::Context * context,const gl::Rectangle & sourceArea,const gl::Rectangle & destArea,GLbitfield mask,GLenum filter)145*8975f5c5SAndroid Build Coastguard Worker angle::Result FramebufferNULL::blit(const gl::Context *context,
146*8975f5c5SAndroid Build Coastguard Worker                                     const gl::Rectangle &sourceArea,
147*8975f5c5SAndroid Build Coastguard Worker                                     const gl::Rectangle &destArea,
148*8975f5c5SAndroid Build Coastguard Worker                                     GLbitfield mask,
149*8975f5c5SAndroid Build Coastguard Worker                                     GLenum filter)
150*8975f5c5SAndroid Build Coastguard Worker {
151*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
152*8975f5c5SAndroid Build Coastguard Worker }
153*8975f5c5SAndroid Build Coastguard Worker 
checkStatus(const gl::Context * context) const154*8975f5c5SAndroid Build Coastguard Worker gl::FramebufferStatus FramebufferNULL::checkStatus(const gl::Context *context) const
155*8975f5c5SAndroid Build Coastguard Worker {
156*8975f5c5SAndroid Build Coastguard Worker     return gl::FramebufferStatus::Complete();
157*8975f5c5SAndroid Build Coastguard Worker }
158*8975f5c5SAndroid Build Coastguard Worker 
syncState(const gl::Context * context,GLenum binding,const gl::Framebuffer::DirtyBits & dirtyBits,gl::Command command)159*8975f5c5SAndroid Build Coastguard Worker angle::Result FramebufferNULL::syncState(const gl::Context *context,
160*8975f5c5SAndroid Build Coastguard Worker                                          GLenum binding,
161*8975f5c5SAndroid Build Coastguard Worker                                          const gl::Framebuffer::DirtyBits &dirtyBits,
162*8975f5c5SAndroid Build Coastguard Worker                                          gl::Command command)
163*8975f5c5SAndroid Build Coastguard Worker {
164*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
165*8975f5c5SAndroid Build Coastguard Worker }
166*8975f5c5SAndroid Build Coastguard Worker 
getSamplePosition(const gl::Context * context,size_t index,GLfloat * xy) const167*8975f5c5SAndroid Build Coastguard Worker angle::Result FramebufferNULL::getSamplePosition(const gl::Context *context,
168*8975f5c5SAndroid Build Coastguard Worker                                                  size_t index,
169*8975f5c5SAndroid Build Coastguard Worker                                                  GLfloat *xy) const
170*8975f5c5SAndroid Build Coastguard Worker {
171*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
172*8975f5c5SAndroid Build Coastguard Worker }
173*8975f5c5SAndroid Build Coastguard Worker 
174*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
175