// 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.

// VertexDataManager.h: Defines the VertexDataManager, a class that
// runs the Buffer translation process.

#ifndef LIBGLESV2_VERTEXDATAMANAGER_H_
#define LIBGLESV2_VERTEXDATAMANAGER_H_

#include "Context.h"
#include "Device.hpp"

#include <GLES2/gl2.h>

namespace es2
{

struct TranslatedAttribute
{
	sw::StreamType type;
	int count;
	bool normalized;

	unsigned int offset;
	unsigned int stride;   // 0 means not to advance the read pointer at all

	sw::Resource *vertexBuffer;
};

class VertexBuffer
{
public:
	VertexBuffer(unsigned int size);
	virtual ~VertexBuffer();

	void unmap();

	sw::Resource *getResource() const;

protected:
	sw::Resource *mVertexBuffer;
};

class ConstantVertexBuffer : public VertexBuffer
{
public:
	ConstantVertexBuffer(float x, float y, float z, float w);
	~ConstantVertexBuffer();
};

class StreamingVertexBuffer : public VertexBuffer
{
public:
	StreamingVertexBuffer(unsigned int size);
	~StreamingVertexBuffer();

	void *map(const VertexAttribute &attribute, unsigned int requiredSpace, unsigned int *streamOffset);
	void reserveRequiredSpace();
	void addRequiredSpace(unsigned int requiredSpace);

protected:
	unsigned int mBufferSize;
	unsigned int mWritePosition;
	unsigned int mRequiredSpace;
};

class VertexDataManager
{
public:
	VertexDataManager(Context *context);
	virtual ~VertexDataManager();

	void dirtyCurrentValue(int index) { mDirtyCurrentValue[index] = true; }

	GLenum prepareVertexData(GLint start, GLsizei count, TranslatedAttribute *outAttribs, GLsizei instanceId);

private:
	unsigned int writeAttributeData(StreamingVertexBuffer *vertexBuffer, GLint start, GLsizei count, const VertexAttribute &attribute);

	Context *const mContext;

	StreamingVertexBuffer *mStreamingBuffer;

	bool mDirtyCurrentValue[MAX_VERTEX_ATTRIBS];
	ConstantVertexBuffer *mCurrentValueBuffer[MAX_VERTEX_ATTRIBS];
};

}

#endif   // LIBGLESV2_VERTEXDATAMANAGER_H_
