Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
libgui|Shaders|GL: Added geometry shader as a new type of shader
  • Loading branch information
skyjake committed Sep 1, 2019
1 parent 32d5226 commit be22acd
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 103 deletions.
10 changes: 10 additions & 0 deletions doomsday/libs/gui/include/de/graphics/glprogram.h
Expand Up @@ -77,6 +77,16 @@ class LIBGUI_PUBLIC GLProgram : public Asset
*/
GLProgram &build(GLShader const *vertexShader, GLShader const *fragmentShader);

/**
* Builds a program out of a list of shaders. GLProgram retains a reference to
* all the shaders.
*
* @param shaders One or more shaders.
*
* @return Reference to this program.
*/
GLProgram &build(QVector<GLShader const *> const &shaders);

GLProgram &build(IByteArray const &vertexShaderSource,
IByteArray const &fragmentShaderSource);

Expand Down
2 changes: 1 addition & 1 deletion doomsday/libs/gui/include/de/graphics/glshader.h
Expand Up @@ -42,7 +42,7 @@ namespace de {
class LIBGUI_PUBLIC GLShader : public Counted, public Asset
{
public:
enum Type { Vertex, Fragment };
enum Type { Vertex, Geometry, Fragment };

/// There was a failure related to OpenGL resource allocation. @ingroup errors
DENG2_ERROR(AllocError);
Expand Down
19 changes: 10 additions & 9 deletions doomsday/libs/gui/src/graphics/glprogram.cpp
Expand Up @@ -361,21 +361,22 @@ void GLProgram::clear()

GLProgram &GLProgram::build(GLShader const *vertexShader, GLShader const *fragmentShader)
{
DENG2_ASSERT(vertexShader != 0);
DENG2_ASSERT(vertexShader->isReady());
DENG2_ASSERT(vertexShader->type() == GLShader::Vertex);
DENG2_ASSERT(fragmentShader != 0);
DENG2_ASSERT(fragmentShader->isReady());
DENG2_ASSERT(fragmentShader->type() == GLShader::Fragment);
return build({vertexShader, fragmentShader});
}

GLProgram &GLProgram::build(QVector<GLShader const *> const &shaders)
{
d->releaseButRetainBindings();
d->attach(vertexShader);
d->attach(fragmentShader);
for (GLShader const *shd : shaders)
{
DENG2_ASSERT(shd != nullptr);
DENG2_ASSERT(shd->isReady());
d->attach(shd);
}
d->bindVertexAttribs();
d->markAllBoundUniformsChanged();

setState(Ready);

return *this;
}

Expand Down
22 changes: 13 additions & 9 deletions doomsday/libs/gui/src/graphics/glshader.cpp
Expand Up @@ -25,15 +25,13 @@

namespace de {

//int const GLShader::MAX_BATCH_UNIFORMS = 64;

DENG2_PIMPL(GLShader)
{
GLuint name;
Type type;
// Block compiledSource;
GLuint name = 0;
Type type = Vertex;
//Block compiledSource;

Impl(Public *i) : Base(i), name(0), type(Vertex)
Impl(Public *i) : Base(i)
{}

~Impl()
Expand All @@ -45,7 +43,9 @@ DENG2_PIMPL(GLShader)
{
if (!name)
{
name = LIBGUI_GL.glCreateShader(type == Vertex? GL_VERTEX_SHADER : GL_FRAGMENT_SHADER);
name = LIBGUI_GL.glCreateShader(type == Vertex ? GL_VERTEX_SHADER
: type == Geometry ? GL_GEOMETRY_SHADER
: GL_FRAGMENT_SHADER);
LIBGUI_ASSERT_GL_OK();
if (!name)
{
Expand Down Expand Up @@ -117,7 +117,7 @@ Block GLShader::prefixToSource(Block const &source, Block const &prefix)
void GLShader::compile(Type shaderType, IByteArray const &shaderSource)
{
#if defined (DENG_OPENGL)
static const Block DEFAULT_VERSION("#version 330\n");
static const Block DEFAULT_VERSION("#version 330 core\n");
// With non-ES OpenGL, ignore the precision attributes.
static const Block PREFIX("#ifndef GL_ES\n"
"# define lowp\n"
Expand All @@ -130,7 +130,7 @@ void GLShader::compile(Type shaderType, IByteArray const &shaderSource)
static Block const PREFIX("\n");
#endif

DENG2_ASSERT(shaderType == Vertex || shaderType == Fragment);
DENG2_ASSERT(shaderType == Vertex || shaderType == Geometry || shaderType == Fragment);

Block preamble;
Block source = shaderSource;
Expand Down Expand Up @@ -162,6 +162,10 @@ void GLShader::compile(Type shaderType, IByteArray const &shaderSource)
"#define DENG_ATTRIB attribute\n";
#endif
}
else if (shaderType == Geometry)
{
predefs = QByteArray("#define DENG_GEOMETRY_SHADER\n");
}
else
{
preamble += "#define DENG_FRAGMENT_SHADER\n";
Expand Down

0 comments on commit be22acd

Please sign in to comment.