// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// TransformFeedback.cpp: Implements the es2::TransformFeedback class
#include "TransformFeedback.h"
namespace es2
{
TransformFeedback::TransformFeedback(GLuint name) : NamedObject(name), mActive(false), mPaused(false), mVertexOffset(0)
{
mGenericBuffer = nullptr;
}
TransformFeedback::~TransformFeedback()
{
mGenericBuffer = nullptr;
for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i)
{
mBuffer[i].set(nullptr);
}
}
Buffer* TransformFeedback::getGenericBuffer() const
{
return mGenericBuffer;
}
Buffer* TransformFeedback::getBuffer(GLuint index) const
{
return mBuffer[index].get();
}
GLuint TransformFeedback::getGenericBufferName() const
{
return mGenericBuffer.name();
}
GLuint TransformFeedback::getBufferName(GLuint index) const
{
return mBuffer[index].get().name();
}
int TransformFeedback::getOffset(GLuint index) const
{
return mBuffer[index].getOffset();
}
int TransformFeedback::getSize(GLuint index) const
{
return mBuffer[index].getSize();
}
void TransformFeedback::addVertexOffset(int count)
{
if(isActive() && !isPaused())
{
mVertexOffset += count;
}
}
int TransformFeedback::vertexOffset() const
{
return mVertexOffset;
}
bool TransformFeedback::isActive() const
{
return mActive;
}
bool TransformFeedback::isPaused() const
{
return mPaused;
}
GLenum TransformFeedback::primitiveMode() const
{
return mPrimitiveMode;
}
void TransformFeedback::begin(GLenum primitiveMode)
{
mActive = true; mPrimitiveMode = primitiveMode;
}
void TransformFeedback::end()
{
mActive = false;
mPaused = false;
mVertexOffset = 0;
}
void TransformFeedback::setPaused(bool paused)
{
mPaused = paused;
}
void TransformFeedback::setGenericBuffer(Buffer* buffer)
{
mGenericBuffer = buffer;
}
void TransformFeedback::setBuffer(GLuint index, Buffer* buffer)
{
mBuffer[index].set(buffer);
}
void TransformFeedback::setBuffer(GLuint index, Buffer* buffer, GLintptr offset, GLsizeiptr size)
{
mBuffer[index].set(buffer, static_cast<int>(offset), static_cast<int>(size));
}
void TransformFeedback::detachBuffer(GLuint buffer)
{
if(mGenericBuffer.name() == buffer)
{
mGenericBuffer = nullptr;
}
for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i)
{
if(mBuffer[i].get().name() == buffer)
{
mBuffer[i].set(nullptr);
}
}
}
}