1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // TransformFeedback.cpp: Implements the es2::TransformFeedback class 16 17 #include "TransformFeedback.h" 18 19 namespace es2 20 { 21 22 TransformFeedback::TransformFeedback(GLuint name) : NamedObject(name), mActive(false), mPaused(false), mVertexOffset(0) 23 { 24 mGenericBuffer = nullptr; 25 } 26 27 TransformFeedback::~TransformFeedback() 28 { 29 mGenericBuffer = nullptr; 30 for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i) 31 { 32 mBuffer[i].set(nullptr); 33 } 34 } 35 36 Buffer* TransformFeedback::getGenericBuffer() const 37 { 38 return mGenericBuffer; 39 } 40 41 Buffer* TransformFeedback::getBuffer(GLuint index) const 42 { 43 return mBuffer[index].get(); 44 } 45 46 GLuint TransformFeedback::getGenericBufferName() const 47 { 48 return mGenericBuffer.name(); 49 } 50 51 GLuint TransformFeedback::getBufferName(GLuint index) const 52 { 53 return mBuffer[index].get().name(); 54 } 55 56 int TransformFeedback::getOffset(GLuint index) const 57 { 58 return mBuffer[index].getOffset(); 59 } 60 61 int TransformFeedback::getSize(GLuint index) const 62 { 63 return mBuffer[index].getSize(); 64 } 65 66 void TransformFeedback::addVertexOffset(int count) 67 { 68 if(isActive() && !isPaused()) 69 { 70 mVertexOffset += count; 71 } 72 } 73 74 int TransformFeedback::vertexOffset() const 75 { 76 return mVertexOffset; 77 } 78 79 bool TransformFeedback::isActive() const 80 { 81 return mActive; 82 } 83 84 bool TransformFeedback::isPaused() const 85 { 86 return mPaused; 87 } 88 89 GLenum TransformFeedback::primitiveMode() const 90 { 91 return mPrimitiveMode; 92 } 93 94 void TransformFeedback::begin(GLenum primitiveMode) 95 { 96 mActive = true; mPrimitiveMode = primitiveMode; 97 } 98 99 void TransformFeedback::end() 100 { 101 mActive = false; 102 mPaused = false; 103 mVertexOffset = 0; 104 } 105 106 void TransformFeedback::setPaused(bool paused) 107 { 108 mPaused = paused; 109 } 110 111 void TransformFeedback::setGenericBuffer(Buffer* buffer) 112 { 113 mGenericBuffer = buffer; 114 } 115 116 void TransformFeedback::setBuffer(GLuint index, Buffer* buffer) 117 { 118 mBuffer[index].set(buffer); 119 } 120 121 void TransformFeedback::setBuffer(GLuint index, Buffer* buffer, GLintptr offset, GLsizeiptr size) 122 { 123 mBuffer[index].set(buffer, static_cast<int>(offset), static_cast<int>(size)); 124 } 125 126 void TransformFeedback::detachBuffer(GLuint buffer) 127 { 128 if(mGenericBuffer.name() == buffer) 129 { 130 mGenericBuffer = nullptr; 131 } 132 133 for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i) 134 { 135 if(mBuffer[i].get().name() == buffer) 136 { 137 mBuffer[i].set(nullptr); 138 } 139 } 140 } 141 142 } 143