Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: src/gpu/gl/GrGLCreateNullInterface.cpp

Issue 2085043002: Support GL_SAMPLES queries in null contexts (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: WAR cc_unittests Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | tools/gpu/gl/debug/DebugGLTestContext.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 8
9 #include "GrNonAtomicRef.h"
9 #include "gl/GrGLInterface.h" 10 #include "gl/GrGLInterface.h"
10 #include "GrGLTestInterface.h" 11 #include "GrGLTestInterface.h"
11 #include "SkMutex.h" 12 #include "SkMutex.h"
12 #include "SkTDArray.h" 13 #include "SkTDArray.h"
14 #include <type_traits>
13 15
14 // added to suppress 'no previous prototype' warning and because this code is du plicated in 16 // added to suppress 'no previous prototype' warning and because this code is du plicated in
15 // SkNullGLContext.cpp 17 // SkNullGLContext.cpp
16 namespace { 18 namespace {
17 19
18 class BufferObj { 20 class GLObject : public GrNonAtomicRef<GLObject> {
19 public: 21 public:
20 BufferObj(GrGLuint id) : fID(id), fDataPtr(nullptr), fSize(0), fMapped(false ) {} 22 GLObject(GrGLuint id) : fID(id) {}
21 ~BufferObj() { delete[] fDataPtr; } 23 GrGLuint id() const { return fID; }
24
25 private:
26 GrGLuint fID;
27 };
28
29 // This class maintains a sparsely populated array of object pointers.
30 template<typename T> class TGLObjectManager {
31 static_assert(std::is_convertible<T*, GLObject*>::value, "T must be a subclas s of GLObject");
32
33 public:
34 TGLObjectManager() : fFreeListHead(kFreeListEnd) {
35 *fGLObjects.append() = nullptr; // 0 is not a valid GL object id.
36 }
37
38 ~TGLObjectManager() {
39 // nullptr out the entries that are really free list links rather than p trs before deleting.
40 intptr_t curr = fFreeListHead;
41 while (kFreeListEnd != curr) {
42 intptr_t next = reinterpret_cast<intptr_t>(fGLObjects[SkToS32(curr)] );
43 fGLObjects[SkToS32(curr)] = nullptr;
44 curr = next;
45 }
46
47 fGLObjects.safeUnrefAll();
48 }
49
50 T* lookUp(GrGLuint id) {
51 T* object = fGLObjects[id];
52 SkASSERT(object && object->id() == id);
53 return object;
54 }
55
56 T* create() {
57 GrGLuint id;
58 T* object;
59
60 if (kFreeListEnd == fFreeListHead) {
61 // no free slots - create a new one
62 id = fGLObjects.count();
63 object = new T(id);
64 *fGLObjects.append() = object;
65 } else {
66 // grab the head of the free list and advance the head to the next f ree slot.
67 id = static_cast<GrGLuint>(fFreeListHead);
68 fFreeListHead = reinterpret_cast<intptr_t>(fGLObjects[id]);
69
70 object = new T(id);
71 fGLObjects[id] = object;
72 }
73
74 return object;
75 }
76
77 void free(T* object) {
78 SkASSERT(object);
79 SkASSERT(fGLObjects.count() > 0);
80
81 GrGLuint id = object->id();
82 object->unref();
83
84 fGLObjects[id] = reinterpret_cast<T*>(fFreeListHead);
85 fFreeListHead = id;
86 }
87
88 private:
89 static const intptr_t kFreeListEnd = -1;
90 // Index of the first entry of fGLObjects in the free list. Free slots in fG LObjects are indices
91 // to the next free slot. The last free slot has a value of kFreeListEnd.
92 intptr_t fFreeListHead;
93 SkTDArray<T*> fGLObjects;
94 };
95
96 class Buffer : public GLObject {
97 public:
98 Buffer(GrGLuint id) : INHERITED(id), fDataPtr(nullptr), fSize(0), fMapped(fa lse) {}
99 ~Buffer() { delete[] fDataPtr; }
22 100
23 void allocate(GrGLsizeiptr size, const GrGLchar* dataPtr) { 101 void allocate(GrGLsizeiptr size, const GrGLchar* dataPtr) {
24 if (fDataPtr) { 102 if (fDataPtr) {
25 SkASSERT(0 != fSize); 103 SkASSERT(0 != fSize);
26 delete[] fDataPtr; 104 delete[] fDataPtr;
27 } 105 }
28 106
29 fSize = size; 107 fSize = size;
30 fDataPtr = new char[size]; 108 fDataPtr = new char[size];
31 } 109 }
32 110
33 GrGLuint id() const { return fID; }
34 GrGLchar* dataPtr() { return fDataPtr; } 111 GrGLchar* dataPtr() { return fDataPtr; }
35 GrGLsizeiptr size() const { return fSize; } 112 GrGLsizeiptr size() const { return fSize; }
36 113
37 void setMapped(bool mapped) { fMapped = mapped; } 114 void setMapped(bool mapped) { fMapped = mapped; }
38 bool mapped() const { return fMapped; } 115 bool mapped() const { return fMapped; }
39 116
40 private: 117 private:
41 GrGLuint fID;
42 GrGLchar* fDataPtr; 118 GrGLchar* fDataPtr;
43 GrGLsizeiptr fSize; // size in bytes 119 GrGLsizeiptr fSize; // size in bytes
44 bool fMapped; 120 bool fMapped;
121
122 typedef GLObject INHERITED;
45 }; 123 };
46 124
47 // This class maintains a sparsely populated array of buffer pointers. 125 class FramebufferAttachment : public GLObject {
48 class BufferManager {
49 public: 126 public:
50 BufferManager() : fFreeListHead(kFreeListEnd) { 127 FramebufferAttachment(int id) : INHERITED(id), fNumSamples(1) {}
51 *fBuffers.append() = nullptr; // 0 is not a valid GL buffer id. 128 int numSamples() const { return fNumSamples; }
52 }
53 129
54 ~BufferManager() { 130 protected:
55 // nullptr out the entries that are really free list links rather than p trs before deleting. 131 int fNumSamples;
56 intptr_t curr = fFreeListHead; 132
57 while (kFreeListEnd != curr) { 133 typedef GLObject INHERITED;
58 intptr_t next = reinterpret_cast<intptr_t>(fBuffers[SkToS32(curr)]); 134 };
59 fBuffers[SkToS32(curr)] = nullptr; 135
60 curr = next; 136 class Renderbuffer : public FramebufferAttachment {
137 public:
138 Renderbuffer(int id) : INHERITED(id) {}
139 void setNumSamples(int numSamples) { fNumSamples = numSamples; }
140
141 private:
142 typedef FramebufferAttachment INHERITED;
143 };
144
145 class Texture : public FramebufferAttachment {
146 public:
147 static Texture* GetSingleInstance() {
bsalomon 2016/06/22 19:46:01 Can you add a comment about why we did this?
148 static Texture* singleInstance;
149 if (!singleInstance) {
150 singleInstance = new Texture();
61 } 151 }
62 152 return singleInstance;
63 fBuffers.deleteAll();
64 }
65
66 BufferObj* lookUp(GrGLuint id) {
67 BufferObj* buffer = fBuffers[id];
68 SkASSERT(buffer && buffer->id() == id);
69 return buffer;
70 }
71
72 BufferObj* create() {
73 GrGLuint id;
74 BufferObj* buffer;
75
76 if (kFreeListEnd == fFreeListHead) {
77 // no free slots - create a new one
78 id = fBuffers.count();
79 buffer = new BufferObj(id);
80 *fBuffers.append() = buffer;
81 } else {
82 // grab the head of the free list and advance the head to the next f ree slot.
83 id = static_cast<GrGLuint>(fFreeListHead);
84 fFreeListHead = reinterpret_cast<intptr_t>(fBuffers[id]);
85
86 buffer = new BufferObj(id);
87 fBuffers[id] = buffer;
88 }
89
90 return buffer;
91 }
92
93 void free(BufferObj* buffer) {
94 SkASSERT(buffer);
95 SkASSERT(fBuffers.count() > 0);
96
97 GrGLuint id = buffer->id();
98 delete buffer;
99
100 fBuffers[id] = reinterpret_cast<BufferObj*>(fFreeListHead);
101 fFreeListHead = id;
102 } 153 }
103 154
104 private: 155 private:
105 static const intptr_t kFreeListEnd = -1; 156 Texture() : INHERITED(1) {}
106 // Index of the first entry of fBuffers in the free list. Free slots in fBuf fers are indices to 157
107 // the next free slot. The last free slot has a value of kFreeListEnd. 158 typedef FramebufferAttachment INHERITED;
108 intptr_t fFreeListHead; 159 };
109 SkTDArray<BufferObj*> fBuffers; 160
161 class Framebuffer : public GLObject {
162 public:
163 Framebuffer(int id) : INHERITED(id) {}
164
165 void setAttachment(GrGLenum attachmentPoint, const FramebufferAttachment* at tachment) {
166 switch (attachmentPoint) {
167 default:
168 SK_ABORT("Invalid framebuffer attachment.");
169 break;
170 case GR_GL_STENCIL_ATTACHMENT:
171 fAttachments[(int)AttachmentPoint::kStencil].reset(SkRef(attachm ent));
172 break;
173 case GR_GL_DEPTH_ATTACHMENT:
174 fAttachments[(int)AttachmentPoint::kDepth].reset(SkRef(attachmen t));
175 break;
176 case GR_GL_COLOR_ATTACHMENT0:
177 fAttachments[(int)AttachmentPoint::kColor].reset(SkRef(attachmen t));
178 break;
179 }
180 }
181
182 void notifyAttachmentDeleteWhileBound(const FramebufferAttachment* deleted) {
183 for (auto& attachment : fAttachments) {
184 if (attachment == deleted) {
185 attachment.reset(nullptr);
186 }
187 }
188 }
189
190 int numSamples() const {
191 int numSamples = 0;
192 for (auto& attachment : fAttachments) {
193 if (!attachment) {
194 continue;
195 }
196 if (numSamples) {
197 GrAlwaysAssert(attachment->numSamples() == numSamples);
198 continue;
199 }
200 numSamples = attachment->numSamples();
201 }
202 GrAlwaysAssert(numSamples);
203 return numSamples;
204 }
205
206 private:
207 enum AttachmentPoint {
208 kStencil,
209 kDepth,
210 kColor
211 };
212 constexpr int static kNumAttachmentPoints = 1 + (int)AttachmentPoint::kColor ;
213
214 SkAutoTUnref<const FramebufferAttachment> fAttachments[kNumAttachmentPoints] ;
215
216 typedef GLObject INHERITED;
110 }; 217 };
111 218
112 /** Null interface implementation */ 219 /** Null interface implementation */
113 class NullInterface : public GrGLTestInterface { 220 class NullInterface : public GrGLTestInterface {
114 public: 221 public:
115 NullInterface(bool enableNVPR) 222 NullInterface(bool enableNVPR)
116 : fCurrProgramID(0) 223 : fCurrDrawFramebuffer(0)
224 , fCurrReadFramebuffer(0)
225 , fCurrRenderbuffer(0)
226 , fCurrProgramID(0)
117 , fCurrShaderID(0) 227 , fCurrShaderID(0)
118 , fCurrGenericID(0) 228 , fCurrGenericID(0)
119 , fCurrUniformLocation(0) 229 , fCurrUniformLocation(0)
120 , fCurrPathID(0) { 230 , fCurrPathID(0) {
121 memset(fBoundBuffers, 0, sizeof(fBoundBuffers)); 231 memset(fBoundBuffers, 0, sizeof(fBoundBuffers));
122 fExtensions.push_back("GL_ARB_framebuffer_object"); 232 fExtensions.push_back("GL_ARB_framebuffer_object");
123 fExtensions.push_back("GL_ARB_blend_func_extended"); 233 fExtensions.push_back("GL_ARB_blend_func_extended");
124 fExtensions.push_back("GL_ARB_timer_query"); 234 fExtensions.push_back("GL_ARB_timer_query");
125 fExtensions.push_back("GL_ARB_draw_buffers"); 235 fExtensions.push_back("GL_ARB_draw_buffers");
126 fExtensions.push_back("GL_ARB_occlusion_query"); 236 fExtensions.push_back("GL_ARB_occlusion_query");
127 fExtensions.push_back("GL_EXT_stencil_wrap"); 237 fExtensions.push_back("GL_EXT_stencil_wrap");
128 if (enableNVPR) { 238 if (enableNVPR) {
129 fExtensions.push_back("GL_NV_path_rendering"); 239 fExtensions.push_back("GL_NV_path_rendering");
130 fExtensions.push_back("GL_ARB_program_interface_query"); 240 fExtensions.push_back("GL_ARB_program_interface_query");
131 } 241 }
132 fExtensions.push_back(nullptr); 242 fExtensions.push_back(nullptr);
133 243
134 this->init(kGL_GrGLStandard); 244 this->init(kGL_GrGLStandard);
135 } 245 }
136 246
137 GrGLenum checkFramebufferStatus(GrGLenum target) override { 247 GrGLenum checkFramebufferStatus(GrGLenum target) override {
138 return GR_GL_FRAMEBUFFER_COMPLETE; 248 return GR_GL_FRAMEBUFFER_COMPLETE;
139 } 249 }
140 250
141 GrGLvoid genBuffers(GrGLsizei n, GrGLuint* ids) override { 251 GrGLvoid genBuffers(GrGLsizei n, GrGLuint* ids) override {
142 for (int i = 0; i < n; ++i) { 252 for (int i = 0; i < n; ++i) {
143 BufferObj* buffer = fBufferManager.create(); 253 Buffer* buffer = fBufferManager.create();
144 ids[i] = buffer->id(); 254 ids[i] = buffer->id();
145 } 255 }
146 } 256 }
147 257
148 GrGLvoid bufferData(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data , 258 GrGLvoid bufferData(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data ,
149 GrGLenum usage) override { 259 GrGLenum usage) override {
150 GrGLuint id = fBoundBuffers[GetBufferIndex(target)]; 260 GrGLuint id = fBoundBuffers[GetBufferIndex(target)];
151 if (id > 0) { 261 if (id > 0) {
152 BufferObj* buffer = fBufferManager.lookUp(id); 262 Buffer* buffer = fBufferManager.lookUp(id);
153 buffer->allocate(size, (const GrGLchar*) data); 263 buffer->allocate(size, (const GrGLchar*) data);
154 } 264 }
155 } 265 }
156 266
157 GrGLuint createProgram() override { 267 GrGLuint createProgram() override {
158 return ++fCurrProgramID; 268 return ++fCurrProgramID;
159 } 269 }
160 270
161 GrGLuint createShader(GrGLenum type) override { 271 GrGLuint createShader(GrGLenum type) override {
162 return ++fCurrShaderID; 272 return ++fCurrShaderID;
(...skipping 14 matching lines...) Expand all
177 if (ids[i] == fBoundBuffers[buffIdx]) { 287 if (ids[i] == fBoundBuffers[buffIdx]) {
178 fBoundBuffers[buffIdx] = 0; 288 fBoundBuffers[buffIdx] = 0;
179 break; 289 break;
180 } 290 }
181 } 291 }
182 } 292 }
183 293
184 // Then actually "delete" the buffers. 294 // Then actually "delete" the buffers.
185 for (int i = 0; i < n; ++i) { 295 for (int i = 0; i < n; ++i) {
186 if (ids[i] > 0) { 296 if (ids[i] > 0) {
187 BufferObj* buffer = fBufferManager.lookUp(ids[i]); 297 Buffer* buffer = fBufferManager.lookUp(ids[i]);
188 fBufferManager.free(buffer); 298 fBufferManager.free(buffer);
189 } 299 }
190 } 300 }
191 } 301 }
192 302
193 GrGLvoid genFramebuffers(GrGLsizei n, GrGLuint *framebuffers) override { 303 GrGLvoid genFramebuffers(GrGLsizei n, GrGLuint *framebuffers) override {
194 this->genGenericIds(n, framebuffers); 304 for (int i = 0; i < n; ++i) {
305 Framebuffer* framebuffer = fFramebufferManager.create();
306 framebuffers[i] = framebuffer->id();
307 }
308 }
309
310 GrGLvoid bindFramebuffer(GrGLenum target, GrGLuint framebuffer) override {
311 SkASSERT(GR_GL_FRAMEBUFFER == target || GR_GL_DRAW_FRAMEBUFFER == target ||
312 GR_GL_READ_FRAMEBUFFER == target);
313 if (GR_GL_READ_FRAMEBUFFER != target) {
314 fCurrDrawFramebuffer = framebuffer;
315 }
316 if (GR_GL_DRAW_FRAMEBUFFER != target) {
317 fCurrReadFramebuffer = framebuffer;
318 }
319 }
320
321 GrGLvoid deleteFramebuffers(GrGLsizei n, const GrGLuint* ids) override {
322 for (int i = 0; i < n; ++i) {
323 if (ids[i] == fCurrDrawFramebuffer) {
324 fCurrDrawFramebuffer = 0;
325 }
326 if (ids[i] == fCurrReadFramebuffer) {
327 fCurrReadFramebuffer = 0;
328 }
329
330 if (ids[i] > 0) {
331 Framebuffer* framebuffer = fFramebufferManager.lookUp(ids[i]);
332 fFramebufferManager.free(framebuffer);
333 }
334 }
195 } 335 }
196 336
197 GrGLvoid genQueries(GrGLsizei n, GrGLuint *ids) override { this->genGenericI ds(n, ids); } 337 GrGLvoid genQueries(GrGLsizei n, GrGLuint *ids) override { this->genGenericI ds(n, ids); }
198 338
199 GrGLvoid genRenderbuffers(GrGLsizei n, GrGLuint *renderbuffers) override { 339 GrGLvoid genRenderbuffers(GrGLsizei n, GrGLuint *renderbuffers) override {
200 this->genGenericIds(n, renderbuffers); 340 for (int i = 0; i < n; ++i) {
341 Renderbuffer* renderbuffer = fRenderbufferManager.create();
342 renderbuffers[i] = renderbuffer->id();
343 }
344 }
345
346 GrGLvoid bindRenderbuffer(GrGLenum target, GrGLuint renderbuffer) override {
347 SkASSERT(GR_GL_RENDERBUFFER == target);
348 fCurrRenderbuffer = renderbuffer;
349 }
350
351 GrGLvoid deleteRenderbuffers(GrGLsizei n, const GrGLuint* ids) override {
352 for (int i = 0; i < n; ++i) {
353 if (ids[i] <= 0) {
354 continue;
355 }
356 if (ids[i] == fCurrRenderbuffer) {
357 fCurrRenderbuffer = 0;
358 }
359 Renderbuffer* renderbuffer = fRenderbufferManager.lookUp(ids[i]);
360
361 if (fCurrDrawFramebuffer) {
362 Framebuffer* drawFramebuffer = fFramebufferManager.lookUp(fCurrD rawFramebuffer);
363 drawFramebuffer->notifyAttachmentDeleteWhileBound(renderbuffer);
364 }
365 if (fCurrReadFramebuffer) {
366 Framebuffer* readFramebuffer = fFramebufferManager.lookUp(fCurrR eadFramebuffer);
367 readFramebuffer->notifyAttachmentDeleteWhileBound(renderbuffer);
368 }
369
370 fRenderbufferManager.free(renderbuffer);
371 }
372 }
373
374 GrGLvoid renderbufferStorage(GrGLenum target, GrGLenum internalformat, GrGLs izei width,
375 GrGLsizei height) override {
376 GrAlwaysAssert(GR_GL_RENDERBUFFER == target);
377 GrAlwaysAssert(fCurrRenderbuffer);
378 Renderbuffer* renderbuffer = fRenderbufferManager.lookUp(fCurrRenderbuff er);
379 renderbuffer->setNumSamples(1);
380 }
381
382 GrGLvoid renderbufferStorageMultisample(GrGLenum target, GrGLsizei samples,
383 GrGLenum internalformat, GrGLsizei w idth,
384 GrGLsizei height) override {
385 GrAlwaysAssert(GR_GL_RENDERBUFFER == target);
386 GrAlwaysAssert(samples > 0);
387 GrAlwaysAssert(fCurrRenderbuffer);
388 Renderbuffer* renderbuffer = fRenderbufferManager.lookUp(fCurrRenderbuff er);
389 renderbuffer->setNumSamples(samples);
390 }
391
392 GrGLvoid namedRenderbufferStorage(GrGLuint renderbuffer, GrGLenum GrGLintern alformat,
393 GrGLsizei width, GrGLsizei height) overrid e {
394 SK_ABORT("Not implemented");
395 }
396
397 GrGLvoid namedRenderbufferStorageMultisample(GrGLuint renderbuffer, GrGLsize i samples,
398 GrGLenum GrGLinternalformat, Gr GLsizei width,
399 GrGLsizei height) override {
400 SK_ABORT("Not implemented");
401 }
402
403 GrGLvoid framebufferRenderbuffer(GrGLenum target, GrGLenum attachment,
404 GrGLenum renderbuffertarget,
405 GrGLuint renderBufferID) override {
406 GrGLuint id = this->getBoundFramebufferID(target);
407 GrAlwaysAssert(id);
408 Framebuffer* framebuffer = fFramebufferManager.lookUp(id);
409
410 GrAlwaysAssert(GR_GL_RENDERBUFFER == renderbuffertarget);
411 GrAlwaysAssert(fCurrRenderbuffer);
412 Renderbuffer* renderbuffer = fRenderbufferManager.lookUp(fCurrRenderbuff er);
413
414 framebuffer->setAttachment(attachment, renderbuffer);
415 }
416
417 GrGLvoid namedFramebufferRenderbuffer(GrGLuint framebuffer, GrGLenum attachm ent,
418 GrGLenum renderbuffertarget,
419 GrGLuint renderbuffer) override {
420 SK_ABORT("Not implemented");
201 } 421 }
202 422
203 GrGLvoid genTextures(GrGLsizei n, GrGLuint *textures) override { 423 GrGLvoid genTextures(GrGLsizei n, GrGLuint *textures) override {
204 this->genGenericIds(n, textures); 424 this->genGenericIds(n, textures);
205 } 425 }
206 426
427 GrGLvoid framebufferTexture2D(GrGLenum target, GrGLenum attachment, GrGLenum textarget,
428 GrGLuint textureID, GrGLint level) override {
429 GrGLuint id = this->getBoundFramebufferID(target);
430 GrAlwaysAssert(id);
431 Framebuffer* framebuffer = fFramebufferManager.lookUp(id);
432 framebuffer->setAttachment(attachment, Texture::GetSingleInstance());
433 }
434
435 GrGLvoid framebufferTexture2DMultisample(GrGLenum target, GrGLenum attachmen t,
436 GrGLenum textarget, GrGLuint textur e, GrGLint level,
437 GrGLsizei samples) override {
438 SK_ABORT("Not implemented");
439 }
440
441 GrGLvoid namedFramebufferTexture1D(GrGLuint framebuffer, GrGLenum attachment ,
442 GrGLenum textarget, GrGLuint texture,
443 GrGLint level) override {
444 SK_ABORT("Not implemented");
445 }
446
447 GrGLvoid namedFramebufferTexture2D(GrGLuint framebuffer, GrGLenum attachment ,
448 GrGLenum textarget, GrGLuint texture,
449 GrGLint level) override {
450 SK_ABORT("Not implemented");
451 }
452
453 GrGLvoid namedFramebufferTexture3D(GrGLuint framebuffer, GrGLenum attachment ,
454 GrGLenum textarget, GrGLuint texture, GrG Lint level,
455 GrGLint zoffset) override {
456 SK_ABORT("Not implemented");
457 }
458
207 GrGLvoid genVertexArrays(GrGLsizei n, GrGLuint *arrays) override { 459 GrGLvoid genVertexArrays(GrGLsizei n, GrGLuint *arrays) override {
208 this->genGenericIds(n, arrays); 460 this->genGenericIds(n, arrays);
209 } 461 }
210 462
211 GrGLenum getError() override { return GR_GL_NO_ERROR; } 463 GrGLenum getError() override { return GR_GL_NO_ERROR; }
212 464
213 GrGLvoid getIntegerv(GrGLenum pname, GrGLint* params) override { 465 GrGLvoid getIntegerv(GrGLenum pname, GrGLint* params) override {
214 // TODO: remove from Ganesh the #defines for gets we don't use. 466 // TODO: remove from Ganesh the #defines for gets we don't use.
215 // We would like to minimize gets overall due to performance issues 467 // We would like to minimize gets overall due to performance issues
216 switch (pname) { 468 switch (pname) {
217 case GR_GL_CONTEXT_PROFILE_MASK: 469 case GR_GL_CONTEXT_PROFILE_MASK:
218 *params = GR_GL_CONTEXT_COMPATIBILITY_PROFILE_BIT; 470 *params = GR_GL_CONTEXT_COMPATIBILITY_PROFILE_BIT;
219 break; 471 break;
220 case GR_GL_STENCIL_BITS: 472 case GR_GL_STENCIL_BITS:
221 *params = 8; 473 *params = 8;
222 break; 474 break;
223 case GR_GL_SAMPLES: 475 case GR_GL_SAMPLES: {
224 *params = 1; 476 GrAlwaysAssert(fCurrDrawFramebuffer);
477 Framebuffer* framebuffer = fFramebufferManager.lookUp(fCurrDrawF ramebuffer);
478 *params = framebuffer->numSamples();
225 break; 479 break;
480 }
226 case GR_GL_FRAMEBUFFER_BINDING: 481 case GR_GL_FRAMEBUFFER_BINDING:
227 *params = 0; 482 *params = 0;
228 break; 483 break;
229 case GR_GL_VIEWPORT: 484 case GR_GL_VIEWPORT:
230 params[0] = 0; 485 params[0] = 0;
231 params[1] = 0; 486 params[1] = 0;
232 params[2] = 800; 487 params[2] = 800;
233 params[3] = 600; 488 params[3] = 600;
234 break; 489 break;
235 case GR_GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: 490 case GR_GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 624
370 GrGLint getUniformLocation(GrGLuint program, const char* name) override { 625 GrGLint getUniformLocation(GrGLuint program, const char* name) override {
371 return ++fCurrUniformLocation; 626 return ++fCurrUniformLocation;
372 } 627 }
373 628
374 GrGLvoid* mapBufferRange(GrGLenum target, GrGLintptr offset, GrGLsizeiptr le ngth, 629 GrGLvoid* mapBufferRange(GrGLenum target, GrGLintptr offset, GrGLsizeiptr le ngth,
375 GrGLbitfield access) override { 630 GrGLbitfield access) override {
376 GrGLuint id = fBoundBuffers[GetBufferIndex(target)]; 631 GrGLuint id = fBoundBuffers[GetBufferIndex(target)];
377 if (id > 0) { 632 if (id > 0) {
378 // We just ignore the offset and length here. 633 // We just ignore the offset and length here.
379 BufferObj* buffer = fBufferManager.lookUp(id); 634 Buffer* buffer = fBufferManager.lookUp(id);
380 SkASSERT(!buffer->mapped()); 635 SkASSERT(!buffer->mapped());
381 buffer->setMapped(true); 636 buffer->setMapped(true);
382 return buffer->dataPtr(); 637 return buffer->dataPtr();
383 } 638 }
384 return nullptr; 639 return nullptr;
385 } 640 }
386 641
387 GrGLvoid* mapBuffer(GrGLenum target, GrGLenum access) override { 642 GrGLvoid* mapBuffer(GrGLenum target, GrGLenum access) override {
388 GrGLuint id = fBoundBuffers[GetBufferIndex(target)]; 643 GrGLuint id = fBoundBuffers[GetBufferIndex(target)];
389 if (id > 0) { 644 if (id > 0) {
390 BufferObj* buffer = fBufferManager.lookUp(id); 645 Buffer* buffer = fBufferManager.lookUp(id);
391 SkASSERT(!buffer->mapped()); 646 SkASSERT(!buffer->mapped());
392 buffer->setMapped(true); 647 buffer->setMapped(true);
393 return buffer->dataPtr(); 648 return buffer->dataPtr();
394 } 649 }
395 650
396 SkASSERT(false); 651 SkASSERT(false);
397 return nullptr; // no buffer bound to target 652 return nullptr; // no buffer bound to target
398 } 653 }
399 654
400 GrGLboolean unmapBuffer(GrGLenum target) override { 655 GrGLboolean unmapBuffer(GrGLenum target) override {
401 GrGLuint id = fBoundBuffers[GetBufferIndex(target)]; 656 GrGLuint id = fBoundBuffers[GetBufferIndex(target)];
402 if (id > 0) { 657 if (id > 0) {
403 BufferObj* buffer = fBufferManager.lookUp(id); 658 Buffer* buffer = fBufferManager.lookUp(id);
404 SkASSERT(buffer->mapped()); 659 SkASSERT(buffer->mapped());
405 buffer->setMapped(false); 660 buffer->setMapped(false);
406 return GR_GL_TRUE; 661 return GR_GL_TRUE;
407 } 662 }
408 663
409 GrAlwaysAssert(false); 664 GrAlwaysAssert(false);
410 return GR_GL_FALSE; // GR_GL_INVALID_OPERATION; 665 return GR_GL_FALSE; // GR_GL_INVALID_OPERATION;
411 } 666 }
412 667
413 GrGLvoid getBufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* para ms) override { 668 GrGLvoid getBufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* para ms) override {
414 switch (pname) { 669 switch (pname) {
415 case GR_GL_BUFFER_MAPPED: { 670 case GR_GL_BUFFER_MAPPED: {
416 *params = GR_GL_FALSE; 671 *params = GR_GL_FALSE;
417 GrGLuint id = fBoundBuffers[GetBufferIndex(target)]; 672 GrGLuint id = fBoundBuffers[GetBufferIndex(target)];
418 if (id > 0) { 673 if (id > 0) {
419 BufferObj* buffer = fBufferManager.lookUp(id); 674 Buffer* buffer = fBufferManager.lookUp(id);
420 if (buffer->mapped()) { 675 if (buffer->mapped()) {
421 *params = GR_GL_TRUE; 676 *params = GR_GL_TRUE;
422 } 677 }
423 } 678 }
424 break; } 679 break; }
425 default: 680 default:
426 SkFAIL("Unexpected pname to GetBufferParamateriv"); 681 SkFAIL("Unexpected pname to GetBufferParamateriv");
427 break; 682 break;
428 } 683 }
429 }; 684 };
(...skipping 11 matching lines...) Expand all
441 case GR_GL_ARRAY_BUFFER: return 0; 696 case GR_GL_ARRAY_BUFFER: return 0;
442 case GR_GL_ELEMENT_ARRAY_BUFFER: return 1; 697 case GR_GL_ELEMENT_ARRAY_BUFFER: return 1;
443 case GR_GL_TEXTURE_BUFFER: return 2; 698 case GR_GL_TEXTURE_BUFFER: return 2;
444 case GR_GL_DRAW_INDIRECT_BUFFER: return 3; 699 case GR_GL_DRAW_INDIRECT_BUFFER: return 3;
445 case GR_GL_PIXEL_PACK_BUFFER: return 4; 700 case GR_GL_PIXEL_PACK_BUFFER: return 4;
446 case GR_GL_PIXEL_UNPACK_BUFFER: return 5; 701 case GR_GL_PIXEL_UNPACK_BUFFER: return 5;
447 } 702 }
448 } 703 }
449 constexpr int static kNumBufferTargets = 6; 704 constexpr int static kNumBufferTargets = 6;
450 705
451 BufferManager fBufferManager; 706 TGLObjectManager<Buffer> fBufferManager;
452 GrGLuint fBoundBuffers[kNumBufferTargets]; 707 GrGLuint fBoundBuffers[kNumBufferTargets];
453 GrGLuint fCurrProgramID; 708 TGLObjectManager<Framebuffer> fFramebufferManager;
454 GrGLuint fCurrShaderID; 709 GrGLuint fCurrDrawFramebuffer;
455 GrGLuint fCurrGenericID; 710 GrGLuint fCurrReadFramebuffer;
456 GrGLuint fCurrUniformLocation; 711 TGLObjectManager<Renderbuffer> fRenderbufferManager;
457 GrGLuint fCurrPathID; 712 GrGLuint fCurrRenderbuffer;
458 SkTArray<const char*> fExtensions; 713 GrGLuint fCurrProgramID;
714 GrGLuint fCurrShaderID;
715 GrGLuint fCurrGenericID;
716 GrGLuint fCurrUniformLocation;
717 GrGLuint fCurrPathID;
718 SkTArray<const char*> fExtensions;
459 719
460 // the OpenGLES 2.0 spec says this must be >= 128 720 // the OpenGLES 2.0 spec says this must be >= 128
461 static const GrGLint kDefaultMaxVertexUniformVectors = 128; 721 static const GrGLint kDefaultMaxVertexUniformVectors = 128;
462 722
463 // the OpenGLES 2.0 spec says this must be >=16 723 // the OpenGLES 2.0 spec says this must be >=16
464 static const GrGLint kDefaultMaxFragmentUniformVectors = 16; 724 static const GrGLint kDefaultMaxFragmentUniformVectors = 16;
465 725
466 // the OpenGLES 2.0 spec says this must be >= 8 726 // the OpenGLES 2.0 spec says this must be >= 8
467 static const GrGLint kDefaultMaxVertexAttribs = 8; 727 static const GrGLint kDefaultMaxVertexAttribs = 8;
468 728
469 // the OpenGLES 2.0 spec says this must be >= 8 729 // the OpenGLES 2.0 spec says this must be >= 8
470 static const GrGLint kDefaultMaxVaryingVectors = 8; 730 static const GrGLint kDefaultMaxVaryingVectors = 8;
471 731
732 GrGLuint getBoundFramebufferID(GrGLenum target) {
733 switch (target) {
734 case GR_GL_FRAMEBUFFER:
735 case GR_GL_DRAW_FRAMEBUFFER:
736 return fCurrDrawFramebuffer;
737 case GR_GL_READ_FRAMEBUFFER:
738 return fCurrReadFramebuffer;
739 default:
740 SK_ABORT("Invalid framebuffer target.");
741 return 0;
742 }
743 }
744
472 const GrGLubyte* CombinedExtensionString() { 745 const GrGLubyte* CombinedExtensionString() {
473 static SkString gExtString; 746 static SkString gExtString;
474 static SkMutex gMutex; 747 static SkMutex gMutex;
475 gMutex.acquire(); 748 gMutex.acquire();
476 if (0 == gExtString.size()) { 749 if (0 == gExtString.size()) {
477 int i = 0; 750 int i = 0;
478 while (fExtensions[i]) { 751 while (fExtensions[i]) {
479 if (i > 0) { 752 if (i > 0) {
480 gExtString.append(" "); 753 gExtString.append(" ");
481 } 754 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 break; 806 break;
534 } 807 }
535 } 808 }
536 809
537 typedef GrGLTestInterface INHERITED; 810 typedef GrGLTestInterface INHERITED;
538 }; 811 };
539 812
540 } // anonymous namespace 813 } // anonymous namespace
541 814
542 const GrGLInterface* GrGLCreateNullInterface(bool enableNVPR) { return new NullI nterface(enableNVPR); } 815 const GrGLInterface* GrGLCreateNullInterface(bool enableNVPR) { return new NullI nterface(enableNVPR); }
OLDNEW
« no previous file with comments | « no previous file | tools/gpu/gl/debug/DebugGLTestContext.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698