1 #ifndef _SGLRREFERENCECONTEXT_HPP 2 #define _SGLRREFERENCECONTEXT_HPP 3 /*------------------------------------------------------------------------- 4 * drawElements Quality Program OpenGL ES Utilities 5 * ------------------------------------------------ 6 * 7 * Copyright 2014 The Android Open Source Project 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 *//*! 22 * \file 23 * \brief Reference Rendering Context. 24 *//*--------------------------------------------------------------------*/ 25 26 #include "tcuDefs.hpp" 27 #include "sglrContext.hpp" 28 #include "tcuPixelFormat.hpp" 29 #include "tcuSurface.hpp" 30 #include "tcuTexture.hpp" 31 #include "tcuVector.hpp" 32 #include "gluRenderContext.hpp" 33 #include "rrFragmentOperations.hpp" 34 #include "rrRenderState.hpp" 35 #include "rrRenderer.hpp" 36 #include "rrMultisamplePixelBufferAccess.hpp" 37 #include "gluShaderUtil.hpp" 38 39 #include <map> 40 #include <vector> 41 42 namespace sglr 43 { 44 namespace rc 45 { 46 47 enum 48 { 49 MAX_TEXTURE_SIZE_LOG2 = 14, 50 MAX_TEXTURE_SIZE = 1<<MAX_TEXTURE_SIZE_LOG2 51 }; 52 53 class NamedObject 54 { 55 public: 56 virtual ~NamedObject (void) {} 57 58 deUint32 getName (void) const { return m_name; } 59 60 int getRefCount (void) const { return m_refCount; } 61 void incRefCount (void) { m_refCount += 1; } 62 void decRefCount (void) { DE_ASSERT(m_refCount > 0); m_refCount -= 1; } 63 64 protected: 65 NamedObject (deUint32 name) : m_name(name), m_refCount(1) {} 66 67 private: 68 deUint32 m_name; 69 int m_refCount; 70 }; 71 72 class Texture : public NamedObject 73 { 74 public: 75 enum Type 76 { 77 TYPE_1D, 78 TYPE_2D, 79 TYPE_CUBE_MAP, 80 TYPE_2D_ARRAY, 81 TYPE_3D, 82 TYPE_CUBE_MAP_ARRAY, 83 84 TYPE_LAST 85 }; 86 87 Texture (deUint32 name, Type type); 88 virtual ~Texture (void) {} 89 90 Type getType (void) const { return m_type; } 91 92 int getBaseLevel (void) const { return m_baseLevel; } 93 int getMaxLevel (void) const { return m_maxLevel; } 94 bool isImmutable (void) const { return m_immutable; } 95 96 void setBaseLevel (int baseLevel) { m_baseLevel = baseLevel; } 97 void setMaxLevel (int maxLevel) { m_maxLevel = maxLevel; } 98 void setImmutable (void) { m_immutable = true; } 99 100 const tcu::Sampler& getSampler (void) const { return m_sampler; } 101 tcu::Sampler& getSampler (void) { return m_sampler; } 102 103 private: 104 Type m_type; 105 106 bool m_immutable; 107 108 tcu::Sampler m_sampler; 109 int m_baseLevel; 110 int m_maxLevel; 111 }; 112 113 //! Class for managing list of texture levels. 114 class TextureLevelArray 115 { 116 public: 117 TextureLevelArray (void); 118 ~TextureLevelArray (void); 119 120 bool hasLevel (int level) const { return level < DE_LENGTH_OF_ARRAY(m_data) && m_data[level]; } 121 const tcu::PixelBufferAccess& getLevel (int level) { DE_ASSERT(hasLevel(level)); return m_access[level]; } 122 const tcu::ConstPixelBufferAccess& getLevel (int level) const { DE_ASSERT(hasLevel(level)); return m_access[level]; } 123 124 const tcu::ConstPixelBufferAccess* getLevels (void) const { return &m_access[0]; } 125 126 void allocLevel (int level, const tcu::TextureFormat& format, int width, int height, int depth); 127 void clearLevel (int level); 128 129 void clear (void); 130 131 private: 132 deUint8* m_data[MAX_TEXTURE_SIZE_LOG2]; 133 tcu::PixelBufferAccess m_access[MAX_TEXTURE_SIZE_LOG2]; 134 }; 135 136 class Texture1D : public Texture 137 { 138 public: 139 Texture1D (deUint32 name = 0); 140 virtual ~Texture1D (void); 141 142 void clearLevels (void) { m_levels.clear(); } 143 144 bool hasLevel (int level) const { return m_levels.hasLevel(level); } 145 const tcu::ConstPixelBufferAccess& getLevel (int level) const { return m_levels.getLevel(level); } 146 const tcu::PixelBufferAccess& getLevel (int level) { return m_levels.getLevel(level); } 147 148 void allocLevel (int level, const tcu::TextureFormat& format, int width); 149 150 bool isComplete (void) const; 151 152 void updateView (void); // \note View must be refreshed after texture parameter/size changes, before calling sample*() 153 154 tcu::Vec4 sample (float s, float lod) const; 155 void sample4 (tcu::Vec4 output[4], const float packetTexcoords[4], float lodBias = 0.0f) const; 156 157 private: 158 TextureLevelArray m_levels; 159 tcu::Texture2DView m_view; 160 }; 161 162 class Texture2D : public Texture 163 { 164 public: 165 Texture2D (deUint32 name = 0); 166 virtual ~Texture2D (void); 167 168 void clearLevels (void) { m_levels.clear(); } 169 170 bool hasLevel (int level) const { return m_levels.hasLevel(level); } 171 const tcu::ConstPixelBufferAccess& getLevel (int level) const { return m_levels.getLevel(level); } 172 const tcu::PixelBufferAccess& getLevel (int level) { return m_levels.getLevel(level); } 173 174 void allocLevel (int level, const tcu::TextureFormat& format, int width, int height); 175 176 bool isComplete (void) const; 177 178 void updateView (void); // \note View must be refreshed after texture parameter/size changes, before calling sample*() 179 180 tcu::Vec4 sample (float s, float t, float lod) const; 181 void sample4 (tcu::Vec4 output[4], const tcu::Vec2 packetTexcoords[4], float lodBias = 0.0f) const; 182 183 private: 184 TextureLevelArray m_levels; 185 tcu::Texture2DView m_view; 186 }; 187 188 class TextureCube : public Texture 189 { 190 public: 191 TextureCube (deUint32 name = 0); 192 virtual ~TextureCube (void); 193 194 void clearLevels (void); 195 196 bool hasFace (int level, tcu::CubeFace face) const { return m_levels[face].hasLevel(level); } 197 const tcu::PixelBufferAccess& getFace (int level, tcu::CubeFace face) { return m_levels[face].getLevel(level); } 198 const tcu::ConstPixelBufferAccess& getFace (int level, tcu::CubeFace face) const { return m_levels[face].getLevel(level); } 199 200 void allocFace (int level, tcu::CubeFace face, const tcu::TextureFormat& format, int width, int height); 201 202 bool isComplete (void) const; 203 void updateView (void); // \note View must be refreshed after texture parameter/size changes, before calling sample*() 204 205 tcu::Vec4 sample (float s, float t, float p, float lod) const; 206 void sample4 (tcu::Vec4 output[4], const tcu::Vec3 packetTexcoords[4], float lodBias = 0.0f) const; 207 208 private: 209 TextureLevelArray m_levels[tcu::CUBEFACE_LAST]; 210 tcu::TextureCubeView m_view; 211 }; 212 213 class Texture2DArray : public Texture 214 { 215 public: 216 Texture2DArray (deUint32 name = 0); 217 virtual ~Texture2DArray (void); 218 219 void clearLevels (void) { m_levels.clear(); } 220 221 bool hasLevel (int level) const { return m_levels.hasLevel(level); } 222 const tcu::ConstPixelBufferAccess& getLevel (int level) const { return m_levels.getLevel(level); } 223 const tcu::PixelBufferAccess& getLevel (int level) { return m_levels.getLevel(level); } 224 225 void allocLevel (int level, const tcu::TextureFormat& format, int width, int height, int numLayers); 226 227 bool isComplete (void) const; 228 229 void updateView (void); // \note View must be refreshed after texture parameter/size changes, before calling sample*() 230 231 tcu::Vec4 sample (float s, float t, float r, float lod) const; 232 void sample4 (tcu::Vec4 output[4], const tcu::Vec3 packetTexcoords[4], float lodBias = 0.0f) const; 233 234 private: 235 TextureLevelArray m_levels; 236 tcu::Texture2DArrayView m_view; 237 }; 238 239 class Texture3D : public Texture 240 { 241 public: 242 Texture3D (deUint32 name = 0); 243 virtual ~Texture3D (void); 244 245 void clearLevels (void) { m_levels.clear(); } 246 247 bool hasLevel (int level) const { return m_levels.hasLevel(level); } 248 const tcu::ConstPixelBufferAccess& getLevel (int level) const { return m_levels.getLevel(level); } 249 const tcu::PixelBufferAccess& getLevel (int level) { return m_levels.getLevel(level); } 250 251 void allocLevel (int level, const tcu::TextureFormat& format, int width, int height, int numLayers); 252 253 bool isComplete (void) const; 254 255 void updateView (void); // \note View must be refreshed after texture parameter/size changes, before calling sample*() 256 257 tcu::Vec4 sample (float s, float t, float r, float lod) const; 258 void sample4 (tcu::Vec4 output[4], const tcu::Vec3 packetTexcoords[4], float lodBias = 0.0f) const; 259 260 private: 261 TextureLevelArray m_levels; 262 tcu::Texture3DView m_view; 263 }; 264 265 class TextureCubeArray : public Texture 266 { 267 public: 268 TextureCubeArray (deUint32 name = 0); 269 virtual ~TextureCubeArray (void); 270 271 void clearLevels (void) { m_levels.clear(); } 272 273 bool hasLevel (int level) const { return m_levels.hasLevel(level); } 274 const tcu::ConstPixelBufferAccess& getLevel (int level) const { return m_levels.getLevel(level); } 275 const tcu::PixelBufferAccess& getLevel (int level) { return m_levels.getLevel(level); } 276 277 void allocLevel (int level, const tcu::TextureFormat& format, int width, int height, int numLayers); 278 279 bool isComplete (void) const; 280 281 void updateView (void); // \note View must be refreshed after texture parameter/size changes, before calling sample*() 282 283 tcu::Vec4 sample (float s, float t, float r, float q, float lod) const; 284 void sample4 (tcu::Vec4 output[4], const tcu::Vec4 packetTexcoords[4], float lodBias = 0.0f) const; 285 286 private: 287 TextureLevelArray m_levels; 288 tcu::TextureCubeArrayView m_view; 289 }; 290 291 class Renderbuffer : public NamedObject 292 { 293 public: 294 enum Format 295 { 296 FORMAT_DEPTH_COMPONENT16, 297 FORMAT_RGBA4, 298 FORMAT_RGB5_A1, 299 FORMAT_RGB565, 300 FORMAT_STENCIL_INDEX8, 301 302 FORMAT_LAST 303 }; 304 305 Renderbuffer (deUint32 name); 306 virtual ~Renderbuffer (void); 307 308 void setStorage (const tcu::TextureFormat& format, int width, int height); 309 310 int getWidth (void) const { return m_data.getWidth(); } 311 int getHeight (void) const { return m_data.getHeight(); } 312 tcu::TextureFormat getFormat (void) const { return m_data.getFormat(); } 313 314 tcu::PixelBufferAccess getAccess (void) { return m_data.getAccess(); } 315 tcu::ConstPixelBufferAccess getAccess (void) const { return m_data.getAccess(); } 316 317 private: 318 tcu::TextureLevel m_data; 319 }; 320 321 class Framebuffer : public NamedObject 322 { 323 public: 324 enum AttachmentPoint 325 { 326 ATTACHMENTPOINT_COLOR0, 327 ATTACHMENTPOINT_DEPTH, 328 ATTACHMENTPOINT_STENCIL, 329 330 ATTACHMENTPOINT_LAST 331 }; 332 333 enum AttachmentType 334 { 335 ATTACHMENTTYPE_RENDERBUFFER, 336 ATTACHMENTTYPE_TEXTURE, 337 338 ATTACHMENTTYPE_LAST 339 }; 340 341 enum TexTarget 342 { 343 TEXTARGET_2D, 344 TEXTARGET_CUBE_MAP_POSITIVE_X, 345 TEXTARGET_CUBE_MAP_POSITIVE_Y, 346 TEXTARGET_CUBE_MAP_POSITIVE_Z, 347 TEXTARGET_CUBE_MAP_NEGATIVE_X, 348 TEXTARGET_CUBE_MAP_NEGATIVE_Y, 349 TEXTARGET_CUBE_MAP_NEGATIVE_Z, 350 TEXTARGET_2D_ARRAY, 351 TEXTARGET_3D, 352 TEXTARGET_CUBE_MAP_ARRAY, 353 354 TEXTARGET_LAST 355 }; 356 357 struct Attachment 358 { 359 AttachmentType type; 360 deUint32 name; 361 TexTarget texTarget; 362 int level; 363 int layer; 364 365 Attachment (void) 366 : type (ATTACHMENTTYPE_LAST) 367 , name (0) 368 , texTarget (TEXTARGET_LAST) 369 , level (0) 370 , layer (0) 371 { 372 } 373 }; 374 375 Framebuffer (deUint32 name); 376 virtual ~Framebuffer (void); 377 378 Attachment& getAttachment (AttachmentPoint point) { return m_attachments[point]; } 379 const Attachment& getAttachment (AttachmentPoint point) const { return m_attachments[point]; } 380 381 private: 382 383 Attachment m_attachments[ATTACHMENTPOINT_LAST]; 384 }; 385 386 class DataBuffer : public NamedObject 387 { 388 public: 389 DataBuffer (deUint32 name) : NamedObject(name) {} 390 ~DataBuffer (void) {} 391 392 void setStorage (int size) { m_data.resize(size); } 393 394 int getSize (void) const { return (int)m_data.size(); } 395 const deUint8* getData (void) const { return m_data.empty() ? DE_NULL : &m_data[0]; } 396 deUint8* getData (void) { return m_data.empty() ? DE_NULL : &m_data[0]; } 397 398 private: 399 std::vector<deUint8> m_data; 400 }; 401 402 class VertexArray : public NamedObject 403 { 404 public: 405 struct VertexAttribArray 406 { 407 bool enabled; 408 int size; 409 int stride; 410 deUint32 type; 411 412 bool normalized; 413 bool integer; 414 int divisor; 415 416 /** 417 ! These three variables define the state. bufferDeleted is needed to distinguish 418 ! drawing from user pointer and offset to a deleted buffer from each other. 419 ! 420 ! Only these three combinations are possible: 421 ! 1) bufferDeleted = false, bufferBinding = NULL, pointer = user_ptr. < render from a user ptr 422 ! 2) bufferDeleted = false, bufferBinding = ptr, pointer = offset. < render from a buffer with offset 423 ! 3) bufferDeleted = true, bufferBinding = NULL, pointer = offset < render from a deleted buffer. Don't do anything 424 ! 425 ! (bufferFreed = true) implies (bufferBinding = NULL) 426 */ 427 bool bufferDeleted; 428 rc::DataBuffer* bufferBinding; 429 const void* pointer; 430 }; 431 432 VertexArray (deUint32 name, int maxVertexAttribs); 433 ~VertexArray (void) {} 434 435 rc::DataBuffer* m_elementArrayBufferBinding; 436 std::vector<VertexAttribArray> m_arrays; 437 }; 438 439 class ShaderProgramObjectContainer : public NamedObject 440 { 441 public: 442 ShaderProgramObjectContainer (deUint32 name, ShaderProgram* program); 443 ~ShaderProgramObjectContainer (void); 444 445 ShaderProgram* m_program; 446 bool m_deleteFlag; 447 }; 448 449 template <typename T> 450 class ObjectManager 451 { 452 public: 453 ObjectManager (void); 454 ~ObjectManager (void); 455 456 deUint32 allocateName (void); 457 void insert (T* object); 458 T* find (deUint32 name); 459 460 void acquireReference (T* object); 461 void releaseReference (T* object); 462 463 int getCount (void) const { return (int)m_objects.size(); } 464 void getAll (typename std::vector<T*>& objects) const; 465 466 private: 467 ObjectManager (const ObjectManager<T>& other); 468 ObjectManager& operator= (const ObjectManager<T>& other); 469 470 deUint32 m_lastName; 471 std::map<deUint32, T*> m_objects; 472 }; 473 474 template <typename T> 475 ObjectManager<T>::ObjectManager (void) 476 : m_lastName(0) 477 { 478 } 479 480 template <typename T> 481 ObjectManager<T>::~ObjectManager (void) 482 { 483 DE_ASSERT(m_objects.size() == 0); 484 } 485 486 template <typename T> 487 deUint32 ObjectManager<T>::allocateName (void) 488 { 489 TCU_CHECK(m_lastName != 0xffffffff); 490 return ++m_lastName; 491 } 492 493 template <typename T> 494 void ObjectManager<T>::insert (T* object) 495 { 496 deUint32 name = object->getName(); 497 DE_ASSERT(object->getName() != 0); 498 499 if (name > m_lastName) 500 m_lastName = name; 501 502 m_objects.insert(std::pair<deUint32, T*>(name, object)); 503 } 504 505 template <typename T> 506 T* ObjectManager<T>::find (deUint32 name) 507 { 508 typename std::map<deUint32, T*>::iterator it = m_objects.find(name); 509 if (it != m_objects.end()) 510 return it->second; 511 else 512 return DE_NULL; 513 } 514 515 template <typename T> 516 void ObjectManager<T>::acquireReference (T* object) 517 { 518 DE_ASSERT(find(object->getName()) == object); 519 object->incRefCount(); 520 } 521 522 template <typename T> 523 void ObjectManager<T>::releaseReference (T* object) 524 { 525 DE_ASSERT(find(object->getName()) == object); 526 object->decRefCount(); 527 528 if (object->getRefCount() == 0) 529 { 530 m_objects.erase(object->getName()); 531 delete object; 532 } 533 } 534 535 template <typename T> 536 void ObjectManager<T>::getAll (typename std::vector<T*>& objects) const 537 { 538 objects.resize(m_objects.size()); 539 typename std::vector<T*>::iterator dst = objects.begin(); 540 541 for (typename std::map<deUint32, T*>::const_iterator i = m_objects.begin(); 542 i != m_objects.end(); i++) 543 { 544 *dst++ = i->second; 545 } 546 } 547 548 } // rc 549 550 struct ReferenceContextLimits 551 { 552 ReferenceContextLimits (void) 553 : contextType (glu::ApiType::es(3,0)) 554 , maxTextureImageUnits (16) 555 , maxTexture2DSize (2048) 556 , maxTextureCubeSize (2048) 557 , maxTexture2DArrayLayers (256) 558 , maxTexture3DSize (256) 559 , maxRenderbufferSize (2048) 560 , maxVertexAttribs (16) 561 { 562 } 563 564 ReferenceContextLimits (const glu::RenderContext& renderCtx); 565 566 void addExtension (const char* extension); 567 568 glu::ContextType contextType; 569 570 int maxTextureImageUnits; 571 int maxTexture2DSize; 572 int maxTextureCubeSize; 573 int maxTexture2DArrayLayers; 574 int maxTexture3DSize; 575 int maxRenderbufferSize; 576 int maxVertexAttribs; 577 578 // Both variants are needed since there are glGetString() and glGetStringi() 579 std::vector<std::string> extensionList; 580 std::string extensionStr; 581 }; 582 583 class ReferenceContextBuffers 584 { 585 public: 586 ReferenceContextBuffers (const tcu::PixelFormat& colorBits, int depthBits, int stencilBits, int width, int height, int samples = 1); 587 588 rr::MultisamplePixelBufferAccess getColorbuffer (void) { return rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_colorbuffer.getAccess()); } 589 rr::MultisamplePixelBufferAccess getDepthbuffer (void) { return rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_depthbuffer.getAccess()); } 590 rr::MultisamplePixelBufferAccess getStencilbuffer (void) { return rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_stencilbuffer.getAccess()); } 591 592 private: 593 tcu::TextureLevel m_colorbuffer; 594 tcu::TextureLevel m_depthbuffer; 595 tcu::TextureLevel m_stencilbuffer; 596 }; 597 598 class ReferenceContext : public Context 599 { 600 public: 601 ReferenceContext (const ReferenceContextLimits& limits, const rr::MultisamplePixelBufferAccess& colorbuffer, const rr::MultisamplePixelBufferAccess& depthbuffer, const rr::MultisamplePixelBufferAccess& stencilbuffer); 602 virtual ~ReferenceContext (void); 603 604 virtual int getWidth (void) const { return m_defaultColorbuffer.raw().getHeight(); } 605 virtual int getHeight (void) const { return m_defaultColorbuffer.raw().getDepth(); } 606 607 virtual void viewport (int x, int y, int width, int height) { m_viewport = tcu::IVec4(x, y, width, height); } 608 virtual void activeTexture (deUint32 texture); 609 610 virtual void bindTexture (deUint32 target, deUint32 texture); 611 virtual void genTextures (int numTextures, deUint32* textures); 612 virtual void deleteTextures (int numTextures, const deUint32* textures); 613 614 virtual void bindFramebuffer (deUint32 target, deUint32 framebuffer); 615 virtual void genFramebuffers (int numFramebuffers, deUint32* framebuffers); 616 virtual void deleteFramebuffers (int numFramebuffers, const deUint32* framebuffers); 617 618 virtual void bindRenderbuffer (deUint32 target, deUint32 renderbuffer); 619 virtual void genRenderbuffers (int numRenderbuffers, deUint32* renderbuffers); 620 virtual void deleteRenderbuffers (int numRenderbuffers, const deUint32* renderbuffers); 621 622 virtual void pixelStorei (deUint32 pname, int param); 623 virtual void texImage1D (deUint32 target, int level, deUint32 internalFormat, int width, int border, deUint32 format, deUint32 type, const void* data); 624 virtual void texImage2D (deUint32 target, int level, deUint32 internalFormat, int width, int height, int border, deUint32 format, deUint32 type, const void* data); 625 virtual void texImage3D (deUint32 target, int level, deUint32 internalFormat, int width, int height, int depth, int border, deUint32 format, deUint32 type, const void* data); 626 virtual void texSubImage1D (deUint32 target, int level, int xoffset, int width, deUint32 format, deUint32 type, const void* data); 627 virtual void texSubImage2D (deUint32 target, int level, int xoffset, int yoffset, int width, int height, deUint32 format, deUint32 type, const void* data); 628 virtual void texSubImage3D (deUint32 target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, deUint32 format, deUint32 type, const void* data); 629 virtual void copyTexImage1D (deUint32 target, int level, deUint32 internalFormat, int x, int y, int width, int border); 630 virtual void copyTexImage2D (deUint32 target, int level, deUint32 internalFormat, int x, int y, int width, int height, int border); 631 virtual void copyTexSubImage1D (deUint32 target, int level, int xoffset, int x, int y, int width); 632 virtual void copyTexSubImage2D (deUint32 target, int level, int xoffset, int yoffset, int x, int y, int width, int height); 633 virtual void copyTexSubImage3D (deUint32 target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height); 634 635 virtual void texStorage2D (deUint32 target, int levels, deUint32 internalFormat, int width, int height); 636 virtual void texStorage3D (deUint32 target, int levels, deUint32 internalFormat, int width, int height, int depth); 637 638 virtual void texParameteri (deUint32 target, deUint32 pname, int value); 639 640 virtual void framebufferTexture2D (deUint32 target, deUint32 attachment, deUint32 textarget, deUint32 texture, int level); 641 virtual void framebufferTextureLayer (deUint32 target, deUint32 attachment, deUint32 texture, int level, int layer); 642 virtual void framebufferRenderbuffer (deUint32 target, deUint32 attachment, deUint32 renderbuffertarget, deUint32 renderbuffer); 643 virtual deUint32 checkFramebufferStatus (deUint32 target); 644 645 virtual void getFramebufferAttachmentParameteriv (deUint32 target, deUint32 attachment, deUint32 pname, int* params); 646 647 virtual void renderbufferStorage (deUint32 target, deUint32 internalformat, int width, int height); 648 virtual void renderbufferStorageMultisample (deUint32 target, int samples, deUint32 internalFormat, int width, int height); 649 650 virtual void bindBuffer (deUint32 target, deUint32 buffer); 651 virtual void genBuffers (int numBuffers, deUint32* buffers); 652 virtual void deleteBuffers (int numBuffers, const deUint32* buffers); 653 654 virtual void bufferData (deUint32 target, deIntptr size, const void* data, deUint32 usage); 655 virtual void bufferSubData (deUint32 target, deIntptr offset, deIntptr size, const void* data); 656 657 virtual void clearColor (float red, float green, float blue, float alpha); 658 virtual void clearDepthf (float depth); 659 virtual void clearStencil (int stencil); 660 661 virtual void clear (deUint32 buffers); 662 virtual void clearBufferiv (deUint32 buffer, int drawbuffer, const int* value); 663 virtual void clearBufferfv (deUint32 buffer, int drawbuffer, const float* value); 664 virtual void clearBufferuiv (deUint32 buffer, int drawbuffer, const deUint32* value); 665 virtual void clearBufferfi (deUint32 buffer, int drawbuffer, float depth, int stencil); 666 virtual void scissor (int x, int y, int width, int height); 667 668 virtual void enable (deUint32 cap); 669 virtual void disable (deUint32 cap); 670 671 virtual void stencilFunc (deUint32 func, int ref, deUint32 mask); 672 virtual void stencilOp (deUint32 sfail, deUint32 dpfail, deUint32 dppass); 673 virtual void stencilFuncSeparate (deUint32 face, deUint32 func, int ref, deUint32 mask); 674 virtual void stencilOpSeparate (deUint32 face, deUint32 sfail, deUint32 dpfail, deUint32 dppass); 675 676 virtual void depthFunc (deUint32 func); 677 virtual void depthRangef (float n, float f); 678 virtual void depthRange (double n, double f); 679 680 virtual void polygonOffset (float factor, float units); 681 virtual void provokingVertex (deUint32 convention); 682 virtual void primitiveRestartIndex (deUint32 index); 683 684 virtual void blendEquation (deUint32 mode); 685 virtual void blendEquationSeparate (deUint32 modeRGB, deUint32 modeAlpha); 686 virtual void blendFunc (deUint32 src, deUint32 dst); 687 virtual void blendFuncSeparate (deUint32 srcRGB, deUint32 dstRGB, deUint32 srcAlpha, deUint32 dstAlpha); 688 virtual void blendColor (float red, float green, float blue, float alpha); 689 690 virtual void colorMask (deBool r, deBool g, deBool b, deBool a); 691 virtual void depthMask (deBool mask); 692 virtual void stencilMask (deUint32 mask); 693 virtual void stencilMaskSeparate (deUint32 face, deUint32 mask); 694 695 virtual void blitFramebuffer (int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, deUint32 mask, deUint32 filter); 696 697 virtual void invalidateSubFramebuffer(deUint32 target, int numAttachments, const deUint32* attachments, int x, int y, int width, int height); 698 virtual void invalidateFramebuffer (deUint32 target, int numAttachments, const deUint32* attachments); 699 700 virtual void bindVertexArray (deUint32 array); 701 virtual void genVertexArrays (int numArrays, deUint32* vertexArrays); 702 virtual void deleteVertexArrays (int numArrays, const deUint32* vertexArrays); 703 704 virtual void vertexAttribPointer (deUint32 index, int size, deUint32 type, deBool normalized, int stride, const void *pointer); 705 virtual void vertexAttribIPointer (deUint32 index, int size, deUint32 type, int stride, const void *pointer); 706 virtual void enableVertexAttribArray (deUint32 index); 707 virtual void disableVertexAttribArray(deUint32 index); 708 virtual void vertexAttribDivisor (deUint32 index, deUint32 divisor); 709 710 virtual void vertexAttrib1f (deUint32 index, float); 711 virtual void vertexAttrib2f (deUint32 index, float, float); 712 virtual void vertexAttrib3f (deUint32 index, float, float, float); 713 virtual void vertexAttrib4f (deUint32 index, float, float, float, float); 714 virtual void vertexAttribI4i (deUint32 index, deInt32, deInt32, deInt32, deInt32); 715 virtual void vertexAttribI4ui (deUint32 index, deUint32, deUint32, deUint32, deUint32); 716 717 virtual deInt32 getAttribLocation (deUint32 program, const char *name); 718 719 virtual void uniform1f (deInt32 location, float); 720 virtual void uniform1i (deInt32 location, deInt32); 721 virtual void uniform1fv (deInt32 index, deInt32 count, const float*); 722 virtual void uniform2fv (deInt32 index, deInt32 count, const float*); 723 virtual void uniform3fv (deInt32 index, deInt32 count, const float*); 724 virtual void uniform4fv (deInt32 index, deInt32 count, const float*); 725 virtual void uniform1iv (deInt32 index, deInt32 count, const deInt32*); 726 virtual void uniform2iv (deInt32 index, deInt32 count, const deInt32*); 727 virtual void uniform3iv (deInt32 index, deInt32 count, const deInt32*); 728 virtual void uniform4iv (deInt32 index, deInt32 count, const deInt32*); 729 virtual void uniformMatrix3fv (deInt32 location, deInt32 count, deInt32 transpose, const float *value); 730 virtual void uniformMatrix4fv (deInt32 location, deInt32 count, deInt32 transpose, const float *value); 731 virtual deInt32 getUniformLocation (deUint32 program, const char *name); 732 733 virtual void lineWidth (float); 734 735 virtual void drawArrays (deUint32 mode, int first, int count); 736 virtual void drawArraysInstanced (deUint32 mode, int first, int count, int instanceCount); 737 virtual void drawElements (deUint32 mode, int count, deUint32 type, const void *indices); 738 virtual void drawElementsBaseVertex (deUint32 mode, int count, deUint32 type, const void *indices, int baseVertex); 739 virtual void drawElementsInstanced (deUint32 mode, int count, deUint32 type, const void *indices, int instanceCount); 740 virtual void drawElementsInstancedBaseVertex (deUint32 mode, int count, deUint32 type, const void *indices, int instanceCount, int baseVertex); 741 virtual void drawRangeElements (deUint32 mode, deUint32 start, deUint32 end, int count, deUint32 type, const void *indices); 742 virtual void drawRangeElementsBaseVertex (deUint32 mode, deUint32 start, deUint32 end, int count, deUint32 type, const void *indices, int baseVertex); 743 virtual void drawArraysIndirect (deUint32 mode, const void *indirect); 744 virtual void drawElementsIndirect (deUint32 mode, deUint32 type, const void *indirect); 745 746 virtual void multiDrawArrays (deUint32 mode, const int* first, const int* count, int primCount); 747 virtual void multiDrawElements (deUint32 mode, const int* count, deUint32 type, const void** indices, int primCount); 748 virtual void multiDrawElementsBaseVertex (deUint32 mode, const int* count, deUint32 type, const void** indices, int primCount, const int* baseVertex); 749 750 virtual deUint32 createProgram (ShaderProgram* program); 751 virtual void useProgram (deUint32 program); 752 virtual void deleteProgram (deUint32 program); 753 754 virtual void readPixels (int x, int y, int width, int height, deUint32 format, deUint32 type, void* data); 755 virtual deUint32 getError (void); 756 virtual void finish (void); 757 758 virtual void getIntegerv (deUint32 pname, int* params); 759 virtual const char* getString (deUint32 pname); 760 761 // Expose helpers from Context. 762 using Context::readPixels; 763 using Context::texImage2D; 764 using Context::texSubImage2D; 765 766 private: 767 ReferenceContext (const ReferenceContext& other); // Not allowed! 768 ReferenceContext& operator= (const ReferenceContext& other); // Not allowed! 769 770 void deleteTexture (rc::Texture* texture); 771 void deleteFramebuffer (rc::Framebuffer* framebuffer); 772 void deleteRenderbuffer (rc::Renderbuffer* renderbuffer); 773 void deleteBuffer (rc::DataBuffer* buffer); 774 void deleteVertexArray (rc::VertexArray* vertexArray); 775 void deleteProgramObject (rc::ShaderProgramObjectContainer* sp); 776 777 void acquireFboAttachmentReference (const rc::Framebuffer::Attachment& attachment); 778 void releaseFboAttachmentReference (const rc::Framebuffer::Attachment& attachment); 779 tcu::PixelBufferAccess getFboAttachment (const rc::Framebuffer& framebuffer, rc::Framebuffer::AttachmentPoint point); 780 781 deUint32 blitResolveMultisampleFramebuffer (deUint32 mask, const tcu::IVec4& srcRect, const tcu::IVec4& dstRect, bool flipX, bool flipY); 782 783 rr::MultisamplePixelBufferAccess getDrawColorbuffer (void) { return (m_drawFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_drawFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_COLOR0))) : (m_defaultColorbuffer); } 784 rr::MultisamplePixelBufferAccess getDrawDepthbuffer (void) { return (m_drawFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_drawFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_DEPTH))) : (m_defaultDepthbuffer); } 785 rr::MultisamplePixelBufferAccess getDrawStencilbuffer (void) { return (m_drawFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_drawFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_STENCIL))) : (m_defaultStencilbuffer); } 786 rr::MultisamplePixelBufferAccess getReadColorbuffer (void) { return (m_readFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_readFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_COLOR0))) : (m_defaultColorbuffer); } 787 rr::MultisamplePixelBufferAccess getReadDepthbuffer (void) { return (m_readFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_readFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_DEPTH))) : (m_defaultDepthbuffer); } 788 rr::MultisamplePixelBufferAccess getReadStencilbuffer (void) { return (m_readFramebufferBinding) ? (rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(getFboAttachment(*m_readFramebufferBinding, rc::Framebuffer::ATTACHMENTPOINT_STENCIL))) : (m_defaultStencilbuffer); } 789 790 const rc::Texture2D& getTexture2D (int unitNdx) const; 791 const rc::TextureCube& getTextureCube (int unitNdx) const; 792 const tcu::IVec4& getViewport (void) const { return m_viewport; } 793 794 void setError (deUint32 error); 795 796 void setTex1DBinding (int unit, rc::Texture1D* tex1D); 797 void setTex2DBinding (int unit, rc::Texture2D* tex2D); 798 void setTexCubeBinding (int unit, rc::TextureCube* texCube); 799 void setTex2DArrayBinding (int unit, rc::Texture2DArray* tex2DArray); 800 void setTex3DBinding (int unit, rc::Texture3D* tex3D); 801 void setTexCubeArrayBinding (int unit, rc::TextureCubeArray* texCubeArray); 802 803 void setBufferBinding (deUint32 target, rc::DataBuffer* buffer); 804 rc::DataBuffer* getBufferBinding (deUint32 target) const; 805 806 void* getPixelPackPtr (void* ptrOffset) const { return m_pixelPackBufferBinding ? (void*)((deUintptr)m_pixelPackBufferBinding->getData()+(deUintptr)ptrOffset) : ptrOffset; } 807 const void* getPixelUnpackPtr (const void* ptrOffset) const { return m_pixelUnpackBufferBinding ? (const void*)((deUintptr)m_pixelUnpackBufferBinding->getData()+(deUintptr)ptrOffset) : ptrOffset; } 808 809 bool predrawErrorChecks (deUint32 mode); 810 void drawWithReference (const rr::PrimitiveList& primitives, int instanceCount); 811 812 // Helpers for getting valid access object based on current unpack state. 813 tcu::ConstPixelBufferAccess getUnpack2DAccess (const tcu::TextureFormat& format, int width, int height, const void* data); 814 tcu::ConstPixelBufferAccess getUnpack3DAccess (const tcu::TextureFormat& format, int width, int height, int depth, const void* data); 815 816 void uniformv (deInt32 index, glu::DataType type, deInt32 count, const void*); 817 818 struct TextureUnit 819 { 820 821 rc::Texture1D* tex1DBinding; 822 rc::Texture2D* tex2DBinding; 823 rc::TextureCube* texCubeBinding; 824 rc::Texture2DArray* tex2DArrayBinding; 825 rc::Texture3D* tex3DBinding; 826 rc::TextureCubeArray* texCubeArrayBinding; 827 828 rc::Texture1D default1DTex; 829 rc::Texture2D default2DTex; 830 rc::TextureCube defaultCubeTex; 831 rc::Texture2DArray default2DArrayTex; 832 rc::Texture3D default3DTex; 833 rc::TextureCubeArray defaultCubeArrayTex; 834 835 TextureUnit (void) 836 : tex1DBinding (DE_NULL) 837 , tex2DBinding (DE_NULL) 838 , texCubeBinding (DE_NULL) 839 , tex2DArrayBinding (DE_NULL) 840 , tex3DBinding (DE_NULL) 841 , texCubeArrayBinding (DE_NULL) 842 , default1DTex (0) 843 , default2DTex (0) 844 , defaultCubeTex (0) 845 , default2DArrayTex (0) 846 , default3DTex (0) 847 , defaultCubeArrayTex (0) 848 { 849 } 850 }; 851 852 struct StencilState 853 { 854 deUint32 func; 855 int ref; 856 deUint32 opMask; 857 deUint32 opStencilFail; 858 deUint32 opDepthFail; 859 deUint32 opDepthPass; 860 deUint32 writeMask; 861 862 StencilState (void); 863 }; 864 865 ReferenceContextLimits m_limits; 866 867 rr::MultisamplePixelBufferAccess m_defaultColorbuffer; 868 rr::MultisamplePixelBufferAccess m_defaultDepthbuffer; 869 rr::MultisamplePixelBufferAccess m_defaultStencilbuffer; 870 rc::VertexArray m_clientVertexArray; 871 872 tcu::IVec4 m_viewport; 873 874 rc::ObjectManager<rc::Texture> m_textures; 875 rc::ObjectManager<rc::Framebuffer> m_framebuffers; 876 rc::ObjectManager<rc::Renderbuffer> m_renderbuffers; 877 rc::ObjectManager<rc::DataBuffer> m_buffers; 878 rc::ObjectManager<rc::VertexArray> m_vertexArrays; 879 rc::ObjectManager<rc::ShaderProgramObjectContainer> m_programs; 880 881 int m_activeTexture; 882 std::vector<TextureUnit> m_textureUnits; 883 rc::Texture1D m_emptyTex1D; 884 rc::Texture2D m_emptyTex2D; 885 rc::TextureCube m_emptyTexCube; 886 rc::Texture2DArray m_emptyTex2DArray; 887 rc::Texture3D m_emptyTex3D; 888 rc::TextureCubeArray m_emptyTexCubeArray; 889 890 int m_pixelUnpackRowLength; 891 int m_pixelUnpackSkipRows; 892 int m_pixelUnpackSkipPixels; 893 int m_pixelUnpackImageHeight; 894 int m_pixelUnpackSkipImages; 895 int m_pixelUnpackAlignment; 896 int m_pixelPackAlignment; 897 898 rc::Framebuffer* m_readFramebufferBinding; 899 rc::Framebuffer* m_drawFramebufferBinding; 900 rc::Renderbuffer* m_renderbufferBinding; 901 rc::VertexArray* m_vertexArrayBinding; 902 rc::ShaderProgramObjectContainer* m_currentProgram; 903 904 rc::DataBuffer* m_arrayBufferBinding; 905 rc::DataBuffer* m_pixelPackBufferBinding; 906 rc::DataBuffer* m_pixelUnpackBufferBinding; 907 rc::DataBuffer* m_transformFeedbackBufferBinding; 908 rc::DataBuffer* m_uniformBufferBinding; 909 rc::DataBuffer* m_copyReadBufferBinding; 910 rc::DataBuffer* m_copyWriteBufferBinding; 911 rc::DataBuffer* m_drawIndirectBufferBinding; 912 913 tcu::Vec4 m_clearColor; 914 float m_clearDepth; 915 int m_clearStencil; 916 917 bool m_scissorEnabled; 918 tcu::IVec4 m_scissorBox; 919 920 bool m_stencilTestEnabled; 921 StencilState m_stencil[rr::FACETYPE_LAST]; 922 923 bool m_depthTestEnabled; 924 deUint32 m_depthFunc; 925 float m_depthRangeNear; 926 float m_depthRangeFar; 927 928 float m_polygonOffsetFactor; 929 float m_polygonOffsetUnits; 930 bool m_polygonOffsetFillEnabled; 931 932 bool m_provokingFirstVertexConvention; 933 934 bool m_blendEnabled; 935 deUint32 m_blendModeRGB; 936 deUint32 m_blendModeAlpha; 937 deUint32 m_blendFactorSrcRGB; 938 deUint32 m_blendFactorDstRGB; 939 deUint32 m_blendFactorSrcAlpha; 940 deUint32 m_blendFactorDstAlpha; 941 tcu::Vec4 m_blendColor; 942 943 bool m_sRGBUpdateEnabled; 944 945 bool m_depthClampEnabled; 946 947 tcu::BVec4 m_colorMask; 948 bool m_depthMask; 949 950 std::vector<rr::GenericVec4> m_currentAttribs; 951 float m_lineWidth; 952 953 bool m_primitiveRestartFixedIndex; 954 bool m_primitiveRestartSettableIndex; 955 deUint32 m_primitiveRestartIndex; 956 957 deUint32 m_lastError; 958 959 rr::FragmentProcessor m_fragmentProcessor; 960 std::vector<rr::Fragment> m_fragmentBuffer; 961 std::vector<float> m_fragmentDepths; 962 }; 963 964 } // sglr 965 966 #endif // _SGLRREFERENCECONTEXT_HPP 967