Browse Source

Go back to old GL interface for programs and shaders. Less bugs that way

Panagiotis Christopoulos Charitos 10 years ago
parent
commit
611b00c758

+ 4 - 3
.travis.yml

@@ -15,13 +15,14 @@ install:
   - export CC="gcc-4.8"
 
 script:
+  - mkdir build
   - cd build
   - echo Build release
-  - cmake .. -DANKI_OPTIMIZE=ON -DANKI_DEBUG=OFF -DANKI_DEBUG_SYMBOLS=OFF -DANKI_BUILD_TOOLS=ON -DANKI_BUILD_TESTS=ON -DANKI_ENABLE_COUNTERS=OFF
+  - cmake .. -DANKI_OPTIMIZE=ON -DANKI_DEBUG=OFF -DANKI_DEBUG_SYMBOLS=OFF -DANKI_BUILD_TOOLS=ON -DANKI_BUILD_TESTS=ON -DANKI_ENABLE_TRACE=OFF
   - make
-  - ./clean.sh
+  - rm -rf ./*
   - echo Build debug
-  - cmake .. -DANKI_OPTIMIZE=OFF -DANKI_DEBUG=ON -DANKI_DEBUG_SYMBOLS=ON -DANKI_BUILD_TOOLS=ON -DANKI_BUILD_TESTS=ON -DANKI_ENABLE_COUNTERS=ON
+  - cmake .. -DANKI_OPTIMIZE=OFF -DANKI_DEBUG=ON -DANKI_DEBUG_SYMBOLS=ON -DANKI_BUILD_TOOLS=ON -DANKI_BUILD_TESTS=ON -DANKI_ENABLE_TRACE=ON
   - make
 
 branches:

+ 1 - 4
include/anki/gr/gl/PipelineImpl.h

@@ -23,10 +23,7 @@ public:
 	{
 	}
 
-	~PipelineImpl()
-	{
-		destroyDeferred(glDeleteProgramPipelines);
-	}
+	~PipelineImpl();
 
 	ANKI_USE_RESULT Error create(const PipelineInitializer& init);
 

+ 27 - 37
src/gr/gl/PipelineImpl.cpp

@@ -16,29 +16,8 @@ namespace anki
 {
 
 //==============================================================================
-static GLenum computeGlShaderType(const ShaderType idx, GLbitfield* bit)
-{
-	static const Array<GLenum, 6> gltype = {{GL_VERTEX_SHADER,
-		GL_TESS_CONTROL_SHADER,
-		GL_TESS_EVALUATION_SHADER,
-		GL_GEOMETRY_SHADER,
-		GL_FRAGMENT_SHADER,
-		GL_COMPUTE_SHADER}};
-
-	static const Array<GLuint, 6> glbit = {{GL_VERTEX_SHADER_BIT,
-		GL_TESS_CONTROL_SHADER_BIT,
-		GL_TESS_EVALUATION_SHADER_BIT,
-		GL_GEOMETRY_SHADER_BIT,
-		GL_FRAGMENT_SHADER_BIT,
-		GL_COMPUTE_SHADER_BIT}};
-
-	if(bit)
-	{
-		*bit = glbit[enumToType(idx)];
-	}
-
-	return gltype[enumToType(idx)];
-}
+// Misc                                                                        =
+//==============================================================================
 
 //==============================================================================
 static GLenum convertBlendMethod(BlendMethod in)
@@ -111,6 +90,24 @@ static GLenum convertBlendMethod(BlendMethod in)
 	return out;
 }
 
+//==============================================================================
+static void deletePrograms(GLsizei n, const GLuint* names)
+{
+	ANKI_ASSERT(n == 1);
+	ANKI_ASSERT(names);
+	glDeleteProgram(*names);
+}
+
+//==============================================================================
+// PipelineImpl                                                                =
+//==============================================================================
+
+//==============================================================================
+PipelineImpl::~PipelineImpl()
+{
+	destroyDeferred(deletePrograms);
+}
+
 //==============================================================================
 Error PipelineImpl::create(const PipelineInitializer& init)
 {
@@ -175,21 +172,16 @@ Error PipelineImpl::createGlPipeline()
 	}
 
 	// Create and attach programs
-	glGenProgramPipelines(1, &m_glName);
+	m_glName = glCreateProgram();
 	ANKI_ASSERT(m_glName != 0);
 
-	glBindProgramPipeline(m_glName);
-
 	for(U i = 0; i < m_in.m_shaders.getSize(); i++)
 	{
 		ShaderPtr& shader = m_in.m_shaders[i];
 
 		if(shader.isCreated())
 		{
-			GLbitfield bit;
-			computeGlShaderType(static_cast<ShaderType>(i), &bit);
-			glUseProgramStages(
-				m_glName, bit, shader->getImplementation().getGlName());
+			glAttachShader(m_glName, shader->getImplementation().getGlName());
 
 			if(i == U(ShaderType::TESSELLATION_CONTROL)
 				|| i == U(ShaderType::TESSELLATION_EVALUATION))
@@ -200,9 +192,9 @@ Error PipelineImpl::createGlPipeline()
 	}
 
 	// Validate and check error
-	glValidateProgramPipeline(m_glName);
+	glLinkProgram(m_glName);
 	GLint status = 0;
-	glGetProgramPipelineiv(m_glName, GL_VALIDATE_STATUS, &status);
+	glGetProgramiv(m_glName, GL_LINK_STATUS, &status);
 
 	if(!status)
 	{
@@ -210,26 +202,24 @@ Error PipelineImpl::createGlPipeline()
 		GLint charsWritten = 0;
 		DArrayAuto<char> infoLogTxt(getAllocator());
 
-		glGetProgramPipelineiv(m_glName, GL_INFO_LOG_LENGTH, &infoLen);
+		glGetProgramiv(m_glName, GL_INFO_LOG_LENGTH, &infoLen);
 
 		infoLogTxt.create(infoLen + 1);
 
-		glGetProgramPipelineInfoLog(
+		glGetProgramInfoLog(
 			m_glName, infoLen, &charsWritten, &infoLogTxt[0]);
 
 		ANKI_LOGE("Ppline error log follows:\n%s", &infoLogTxt[0]);
 		err = ErrorCode::USER_DATA;
 	}
 
-	glBindProgramPipeline(0);
-
 	return err;
 }
 
 //==============================================================================
 void PipelineImpl::bind(GlState& state)
 {
-	glBindProgramPipeline(m_glName);
+	glUseProgram(m_glName);
 
 	if(m_compute)
 	{

+ 1 - 1
src/gr/gl/RenderingThread.cpp

@@ -275,7 +275,7 @@ void RenderingThread::threadLoop()
 
 		if(err)
 		{
-			ANKI_LOGE("Error in rendering thread. Aborting\n");
+			ANKI_LOGE("Error in rendering thread. Aborting");
 			abort();
 		}
 	}

+ 18 - 13
src/gr/gl/ShaderImpl.cpp

@@ -18,19 +18,26 @@ namespace anki
 {
 
 //==============================================================================
-/// Fake glDeletePrograms because some jenius created conflicting interface
-static void deleteProgram(GLsizei n, const GLuint* names)
+// Misc                                                                        =
+//==============================================================================
+
+//==============================================================================
+/// Fake glDeleteShaders because some jenius created a conflicting interface
+static void deleteShaders(GLsizei n, const GLuint* names)
 {
 	ANKI_ASSERT(n == 1);
 	ANKI_ASSERT(names);
-	ANKI_ASSERT(*names > 0);
-	glDeleteProgram(*names);
+	glDeleteShader(*names);
 }
 
+//==============================================================================
+// ShaderImpl                                                                  =
+//==============================================================================
+
 //==============================================================================
 ShaderImpl::~ShaderImpl()
 {
-	destroyDeferred(deleteProgram);
+	destroyDeferred(deleteShaders);
 }
 
 //==============================================================================
@@ -84,11 +91,9 @@ Error ShaderImpl::create(ShaderType type, const CString& source)
 	//
 	const char* sourceStrs[1] = {nullptr};
 	sourceStrs[0] = &fullSrc[0];
-	m_glName = glCreateShaderProgramv(m_glType, 1, sourceStrs);
-	if(m_glName == 0)
-	{
-		return ErrorCode::FUNCTION_FAILED;
-	}
+	m_glName = glCreateShader(m_glType);
+	glShaderSource(m_glName, 1, sourceStrs, NULL);
+	glCompileShader(m_glName);
 
 #if ANKI_DUMP_SHADERS
 	{
@@ -131,7 +136,7 @@ Error ShaderImpl::create(ShaderType type, const CString& source)
 #endif
 
 	GLint status = GL_FALSE;
-	glGetProgramiv(m_glName, GL_LINK_STATUS, &status);
+	glGetShaderiv(m_glName, GL_COMPILE_STATUS, &status);
 	if(status == GL_FALSE)
 	{
 		handleError(fullSrc);
@@ -155,11 +160,11 @@ void ShaderImpl::handleError(String& src)
 	static const char* padding = "======================================="
 								 "=======================================";
 
-	glGetProgramiv(m_glName, GL_INFO_LOG_LENGTH, &compilerLogLen);
+	glGetShaderiv(m_glName, GL_INFO_LOG_LENGTH, &compilerLogLen);
 
 	compilerLog.create(alloc, ' ', compilerLogLen + 1);
 
-	glGetProgramInfoLog(
+	glGetShaderInfoLog(
 		m_glName, compilerLogLen, &charsWritten, &compilerLog[0]);
 
 	lines.splitString(alloc, src.toCString(), '\n');

+ 1 - 0
tests/util/Allocator.cpp

@@ -7,6 +7,7 @@
 #include "tests/util/Foo.h"
 #include "anki/util/Allocator.h"
 #include <string>
+#include <iostream>
 
 ANKI_TEST(Util, StackAllocator)
 {