blob: 8906eeea8c3107d7bade0e7796d50e9603363598 [file] [log] [blame]
/*
* gl_command.h - GL command class
*
* Copyright (c) 2018 Intel Corporation
*
* 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.
*
* Author: Yinhang Liu <[email protected]>
*/
#ifndef XCAM_GL_COMMAND_H
#define XCAM_GL_COMMAND_H
#include <list>
#include <gles/gles_std.h>
namespace XCam {
namespace UniformOps {
template <typename TType>
GLenum uniform (GLint location, TType value);
template <typename TType>
GLenum uniform_array (GLint location, const TType *value, GLsizei count);
template <typename TType, uint32_t TDim>
GLenum uniform_vect (GLint location, const TType *value, GLsizei count = 1);
template <typename TType, uint32_t TDim>
GLenum uniform_mat (GLint location, const TType *value, GLsizei count = 1);
}
class GLCommand
{
public:
virtual ~GLCommand () {}
virtual XCamReturn run (GLuint program) = 0;
protected:
explicit GLCommand () {}
private:
XCAM_DEAD_COPY (GLCommand);
};
typedef std::list<SmartPtr<GLCommand> > GLCmdList;
class GLCmdUniform
: public GLCommand
{
public:
virtual ~GLCmdUniform ();
virtual XCamReturn run (GLuint program);
protected:
explicit GLCmdUniform (const GLchar *name);
private:
GLint get_uniform_location (GLuint program, const GLchar *name);
virtual GLenum uniform (GLint location) = 0;
protected:
GLchar _name[XCAM_GL_NAME_LENGTH];
};
/* uniform single variable */
template <typename TType>
class GLCmdUniformT
: public GLCmdUniform
{
public:
GLCmdUniformT (const GLchar *name, TType value)
: GLCmdUniform (name)
, _value (value)
{}
~GLCmdUniformT () {}
private:
virtual GLenum uniform (GLint location) {
return UniformOps::uniform <TType> (location, _value);
}
private:
TType _value;
};
/* uniform array: TType array[TCount] */
template <typename TType, int TCount>
class GLCmdUniformTArray
: public GLCmdUniform
{
public:
GLCmdUniformTArray (const GLchar *name, const TType *value)
: GLCmdUniform (name)
{
XCAM_ASSERT (value);
memcpy (&_value[0], value, sizeof (TType) * TCount);
}
~GLCmdUniformTArray () {}
private:
virtual GLenum uniform (GLint location) {
return UniformOps::uniform_array <TType> (location, _value, TCount);
}
private:
TType _value[TCount];
};
/* uniform vectors: TType vec{TDim}[TCount]*/
template <typename TType, int TDim, int TCount = 1>
class GLCmdUniformTVect
: public GLCmdUniform
{
public:
GLCmdUniformTVect (const GLchar *name, const TType *value)
: GLCmdUniform (name)
{
XCAM_ASSERT (value);
memcpy (&_value[0], value, sizeof (TType) * TDim * TCount);
}
~GLCmdUniformTVect () {}
private:
virtual GLenum uniform (GLint location) {
return UniformOps::uniform_vect <TType, TDim> (location, _value, TCount);
}
private:
TType _value[TDim * TCount];
};
/* uniform matrix: TType mat{TColumns}x{TRows}[TCount], only support square matrix */
template <typename TType, int TColumns, int TRows, int TCount = 1>
class GLCmdUniformTMat
: public GLCmdUniform
{
public:
GLCmdUniformTMat (const GLchar *name, const TType *value)
: GLCmdUniform (name)
{
XCAM_ASSERT (value);
memcpy (&_value[0], value, sizeof (TType) * TColumns * TRows * TCount);
}
~GLCmdUniformTMat () {}
private:
virtual GLenum uniform (GLint location) {
XCAM_FAIL_RETURN (
ERROR, TColumns == TRows, -1,
"uniform_mat only support square matrix, invalid dimension:%dx%d", TColumns, TRows);
return UniformOps::uniform_mat <TType, TColumns> (location, _value, TCount);
}
private:
TType _value[TColumns * TRows * TCount];
};
class GLBuffer;
class GLCmdBindBufBase
: public GLCommand
{
public:
GLCmdBindBufBase (const SmartPtr<GLBuffer> &buf, uint32_t index);
virtual ~GLCmdBindBufBase ();
virtual XCamReturn run (GLuint program);
private:
SmartPtr<GLBuffer> _buf;
uint32_t _index;
};
class GLCmdBindBufRange
: public GLCommand
{
public:
GLCmdBindBufRange (const SmartPtr<GLBuffer> &buf, uint32_t index, uint32_t offset_x = 0);
GLCmdBindBufRange (
const SmartPtr<GLBuffer> &buf, uint32_t index, NV12PlaneIdx plane, uint32_t offset_in_plane = 0);
virtual ~GLCmdBindBufRange ();
virtual XCamReturn run (GLuint program);
private:
SmartPtr<GLBuffer> _buf;
uint32_t _index;
uint32_t _offset;
uint32_t _size;
};
}
#endif // XCAM_GL_COMMAND_H