Bladeren bron

Shader renaming

Panagiotis Christopoulos Charitos 10 jaren geleden
bovenliggende
commit
ca4f275d00

+ 15 - 15
include/anki/gr/Enums.h

@@ -58,21 +58,21 @@ enum class BlendMethod: U8
 	ONE,
 	SRC_COLOR,
 	ONE_MINUS_SRC_COLOR,
-    DEST_COLOR,
-    ONE_MINUS_DEST_COLOR,
-    SRC_ALPHA,
-    ONE_MINUS_SRC_ALPHA,
-    DEST_ALPHA,
-    ONE_MINUS_DEST_ALPHA,
-    CONSTANT_COLOR,
-    ONE_MINUS_CONSTANT_COLOR,
-    CONSTANT_ALPHA,
-    ONE_MINUS_CONSTANT_ALPHA,
-    SRC_ALPHA_SATURATE,
-    SRC1_COLOR,
-    ONE_MINUS_SRC1_COLOR,
-    SRC1_ALPHA,
-    ONE_MINUS_SRC1_ALPHA
+	DEST_COLOR,
+	ONE_MINUS_DEST_COLOR,
+	SRC_ALPHA,
+	ONE_MINUS_SRC_ALPHA,
+	DEST_ALPHA,
+	ONE_MINUS_DEST_ALPHA,
+	CONSTANT_COLOR,
+	ONE_MINUS_CONSTANT_COLOR,
+	CONSTANT_ALPHA,
+	ONE_MINUS_CONSTANT_ALPHA,
+	SRC_ALPHA_SATURATE,
+	SRC1_COLOR,
+	ONE_MINUS_SRC1_COLOR,
+	SRC1_ALPHA,
+	ONE_MINUS_SRC1_ALPHA
 };
 
 enum class BlendFunction: U8

+ 27 - 0
include/anki/gr/PipelineCommon.h

@@ -0,0 +1,27 @@
+// Copyright (C) 2009-2015, Panagiotis Christopoulos Charitos.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#ifndef ANKI_GR_PIPELINE_COMMON_H
+#define ANKI_GR_PIPELINE_COMMON_H
+
+#include "anki/gr/Common.h"
+#include "anki/gr/ShaderHandle.h"
+
+namespace anki {
+
+/// @addtogroup graphics
+/// @{
+
+/// Pipeline initializer.
+struct PipelineInitializer
+{
+	Array<ShaderHandle, 5> m_graphicsShaders;
+	ShaderHandle m_computeShader;
+};
+/// @}
+
+} // end namespace anki
+
+#endif

+ 0 - 3
include/anki/gr/PipelineHandle.h

@@ -39,9 +39,6 @@ public:
 	/// Bind it to the state
 	void bind(CommandBufferHandle& commands);
 
-	/// Get an attached program. It may serialize
-	ShaderHandle getAttachedProgram(GLenum type) const;
-
 public:
 	ANKI_USE_RESULT Error commonConstructor(CommandBufferHandle& commands,
 		const ShaderHandle* progsBegin, const ShaderHandle* progsEnd);

+ 1 - 7
include/anki/gr/ShaderHandle.h

@@ -25,13 +25,7 @@ public:
 
 	/// Create shader program.
 	ANKI_USE_RESULT Error create(CommandBufferHandle& commands, 
-		GLenum shaderType, const void* source, PtrSize sourceSize);
-
-	/// @name Accessors
-	/// They will sync client with server.
-	/// @{
-	GLenum getType() const;
-	/// @}
+		ShaderType shaderType, const void* source, PtrSize sourceSize);
 };
 /// @}
 

+ 0 - 1
include/anki/gr/TextureCommon.h

@@ -45,4 +45,3 @@ struct TextureInitializer
 
 #endif
 
-

+ 0 - 2
include/anki/gr/gl/PipelineImpl.h

@@ -32,8 +32,6 @@ public:
 	ANKI_USE_RESULT Error create(
 		const ShaderHandle* progsBegin, const ShaderHandle* progsEnd);
 
-	ShaderHandle getAttachedProgram(GLenum type) const;
-
 	/// Bind the pipeline to the state
 	void bind();
 

+ 10 - 3
include/anki/gr/gl/ShaderImpl.h

@@ -36,17 +36,24 @@ public:
 	/// @param shaderType The type of the shader in the program
 	/// @param source The shader's source
 	ANKI_USE_RESULT Error create(
-		GLenum shaderType, 
+		ShaderType shaderType, 
 		const CString& source);
 
-	GLenum getType() const
+	GLenum getGlType() const
+	{
+		ANKI_ASSERT(isCreated());
+		return m_glType;
+	}
+
+	ShaderType getType() const
 	{
 		ANKI_ASSERT(isCreated());
 		return m_type;
 	}
 
 private:
-	GLenum m_type = 0;
+	GLenum m_glType = 0;
+	ShaderType m_type;
 
 	void destroy();
 

+ 0 - 1
include/anki/resource/Model.h

@@ -92,7 +92,6 @@ private:
 	/// Called by @a create multiple times to create and populate a single
 	/// vertex descriptor
 	static ANKI_USE_RESULT Error createVertexDesc(
-		const ShaderHandle& prog,
 		const Mesh& mesh,
 		CommandBufferHandle& vertexJobs);
 

+ 6 - 0
include/anki/resource/ShaderResource.h

@@ -54,8 +54,14 @@ public:
 		ResourceManager& manager,
 		TempResourceString& out);
 
+	ShaderType getType() const
+	{
+		return m_type;
+	}
+
 private:
 	ShaderHandle m_shader;
+	ShaderType m_type;
 }; 
 /// @}
 

+ 0 - 15
src/gr/gl/PipelineHandle.cpp

@@ -126,20 +126,5 @@ void PipelineHandle::bind(CommandBufferHandle& commands)
 	commands.get().pushBackNewCommand<BindPipelineCommand>(*this);
 }
 
-//==============================================================================
-ShaderHandle PipelineHandle::getAttachedProgram(GLenum type) const
-{
-	ANKI_ASSERT(isCreated());
-	Error err = get().serializeOnGetter();
-	if(!err)
-	{
-		return get().getAttachedProgram(type);
-	}
-	else
-	{
-		return ShaderHandle();
-	}
-}
-
 } // end namespace anki
 

+ 6 - 16
src/gr/gl/PipelineImpl.cpp

@@ -28,16 +28,17 @@ Error PipelineImpl::create(
 
 	for(U i = 0; i < m_shaders.size(); i++)
 	{
-		ShaderHandle& prog = m_shaders[i];
+		ShaderHandle& shader = m_shaders[i];
 
-		if(prog.isCreated())
+		if(shader.isCreated())
 		{
 			GLbitfield bit;
 			GLenum gltype = 
 				computeGlShaderType(static_cast<ShaderType>(i), &bit);
-			ANKI_ASSERT(prog.getType() == gltype && "Attached wrong shader");
+			ANKI_ASSERT(shader.get().getGlType() == gltype 
+				&& "Attached wrong shader");
 			(void)gltype;
-			glUseProgramStages(m_glName, bit, prog.get().getGlName());
+			glUseProgramStages(m_glName, bit, shader.get().getGlName());
 		}
 	}
 
@@ -90,7 +91,7 @@ void PipelineImpl::attachProgramsInternal(
 	while(count-- != 0)
 	{
 		const ShaderHandle& prog = progs[count];
-		ShaderType type = computeShaderTypeIndex(prog.get().getType());
+		ShaderType type = prog.get().getType();
 		U idx = enumToType(type);
 
 		ANKI_ASSERT(!m_shaders[idx].isCreated() && "Attaching the same");
@@ -129,16 +130,5 @@ void PipelineImpl::bind()
 	glBindProgramPipeline(m_glName);
 }
 
-//==============================================================================
-ShaderHandle PipelineImpl::getAttachedProgram(GLenum type) const
-{
-	ANKI_ASSERT(isCreated());
-	ShaderType stype = computeShaderTypeIndex(type);
-	U idx = enumToType(stype);
-	ShaderHandle prog = m_shaders[idx];
-	ANKI_ASSERT(prog.isCreated() && "Asking for non-created program");
-	return prog;
-}
-
 } // end namespace anki
 

+ 3 - 9
src/gr/gl/ShaderHandle.cpp

@@ -19,11 +19,11 @@ class ShaderCreateCommand final: public GlCommand
 {
 public:
 	ShaderHandle m_shader;
-	GLenum m_type;
+	ShaderType m_type;
 	char* m_source;
 
 	ShaderCreateCommand(ShaderHandle shader, 
-		GLenum type, char* source)
+		ShaderType type, char* source)
 	:	m_shader(shader), 
 		m_type(type), 
 		m_source(source)
@@ -60,7 +60,7 @@ ShaderHandle::~ShaderHandle()
 
 //==============================================================================
 Error ShaderHandle::create(CommandBufferHandle& commands, 
-	GLenum type, const void* source, PtrSize sourceSize)
+	ShaderType type, const void* source, PtrSize sourceSize)
 {
 	ANKI_ASSERT(strlen(static_cast<const char*>(source)) == sourceSize - 1);
 	using DeleteCommand = DeleteObjectCommand<ShaderImpl>;
@@ -82,11 +82,5 @@ Error ShaderHandle::create(CommandBufferHandle& commands,
 	return err;
 }
 
-//==============================================================================
-GLenum ShaderHandle::getType() const
-{
-	return (get().serializeOnGetter()) ? GL_NONE : get().getType();
-}
-
 } // end namespace anki
 

+ 9 - 4
src/gr/gl/ShaderImpl.cpp

@@ -17,14 +17,19 @@
 namespace anki {
 
 //==============================================================================
-Error ShaderImpl::create(GLenum type, const CString& source)
+Error ShaderImpl::create(ShaderType type, const CString& source)
 {
 	ANKI_ASSERT(source);
 	ANKI_ASSERT(!isCreated());
 
 	Error err = ErrorCode::NONE;
 
+	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}};
+
 	m_type = type;
+	m_glType = gltype[U(type)];
 
 	// 1) Append some things in the source string
 	//
@@ -51,7 +56,7 @@ Error ShaderImpl::create(GLenum type, const CString& source)
 	{
 		const char* sourceStrs[1] = {nullptr};
 		sourceStrs[0] = &fullSrc[0];
-		m_glName = glCreateShaderProgramv(m_type, 1, sourceStrs);
+		m_glName = glCreateShaderProgramv(m_glType, 1, sourceStrs);
 		if(m_glName == 0)
 		{
 			err = ErrorCode::FUNCTION_FAILED;
@@ -63,7 +68,7 @@ Error ShaderImpl::create(GLenum type, const CString& source)
 	{
 		const char* ext;
 
-		switch(m_type)
+		switch(m_glType)
 		{
 		case GL_VERTEX_SHADER:
 			ext = "vert";
@@ -169,7 +174,7 @@ Error ShaderImpl::handleError(String& src)
 	if(!err)
 	{
 		ANKI_LOGE("Shader compilation failed (type %x):\n%s\n%s\n%s\n%s",
-			m_type, padding, &compilerLog[0], padding, &prettySrc[0]);
+			m_glType, padding, &compilerLog[0], padding, &prettySrc[0]);
 	}
 
 	lines.destroy(alloc);

+ 1 - 2
src/resource/Material.cpp

@@ -302,8 +302,7 @@ ShaderResourcePointer& Material::getProgram(
 
 	if(out.isLoaded())
 	{
-		ANKI_ASSERT(
-			computeShaderTypeIndex(out->getGrShader().getType()) == type);
+		ANKI_ASSERT(out->getType() == type);
 	}
 
 	return out;

+ 1 - 13
src/resource/Model.cpp

@@ -27,7 +27,6 @@ ModelPatchBase::~ModelPatchBase()
 
 //==============================================================================
 Error ModelPatchBase::createVertexDesc(
-	const ShaderHandle& prog,
 	const Mesh& mesh,
 	CommandBufferHandle& vertexJobs)
 {
@@ -164,7 +163,6 @@ Error ModelPatchBase::create(GrManager* gl)
 		for(U pass = 0; pass < mtl.getPassesCount(); ++pass)
 		{
 			RenderingKey key((Pass)pass, lod, false);
-			ShaderHandle prog;
 			const Mesh* mesh;
 
 			// Get mesh
@@ -172,21 +170,11 @@ Error ModelPatchBase::create(GrManager* gl)
 			RenderingKey meshKey = key;
 			meshKey.m_lod = std::min(key.m_lod, (U8)(getMeshesCount() - 1));
 			mesh = &getMesh(meshKey);
-
-			// Get shader prog
-			ANKI_ASSERT(getMaterial().getLevelsOfDetail() > 0);
-			RenderingKey shaderKey = key;
-			shaderKey.m_lod = std::min(key.m_lod, 
-				(U8)(getMaterial().getLevelsOfDetail() - 1));
-
-			PipelineHandle ppline;
-			ANKI_CHECK(m_mtl->getProgramPipeline(shaderKey, ppline));
-			prog = ppline.getAttachedProgram(GL_VERTEX_SHADER);
 			
 			// Create vert descriptor
 			CommandBufferHandle vertJobs;
 			ANKI_CHECK(vertJobs.create(gl));
-			ANKI_CHECK(createVertexDesc(prog, *mesh, vertJobs));
+			ANKI_CHECK(createVertexDesc(*mesh, vertJobs));
 
 			m_vertJobs[getVertexDescIdx(key)] = vertJobs;
 		}

+ 19 - 59
src/resource/ShaderResource.cpp

@@ -43,22 +43,18 @@ Error ShaderResource::load(const CString& filename, const CString& extraSrc,
 	// Create
 	GrManager& gr = manager.getGrManager();
 	CommandBufferHandle cmdb;
-	err = cmdb.create(&gr);
-	if(err)
-	{
-		return err;
-	}
+	ANKI_CHECK(cmdb.create(&gr));
 
-	err = m_shader.create(cmdb, 
-		computeGlShaderType(pars.getShaderType()), &source[0], 
-		source.getLength() + 1);
-	if(err)
-	{
-		return err;
-	}
+	ANKI_CHECK(
+		m_shader.create(
+		cmdb, 
+		pars.getShaderType(), &source[0], 
+		source.getLength() + 1));
 
 	cmdb.flush();
 
+	m_type = pars.getShaderType();
+
 	return err;
 }
 
@@ -80,17 +76,9 @@ Error ShaderResource::createToCache(
 	TempResourceString unique;
 	TempResourceString::ScopeDestroyer uniqued(&unique, alloc);
 
-	err = unique.create(alloc, filename);
-	if(err)
-	{
-		return err;
-	}
+	ANKI_CHECK(unique.create(alloc, filename));
 
-	err = unique.append(alloc, preAppendedSrcCode);
-	if(err)
-	{
-		return err;
-	}
+	ANKI_CHECK(unique.append(alloc, preAppendedSrcCode));
 
 	U64 h = computeHash(&unique[0], unique.getLength());
 
@@ -102,16 +90,13 @@ Error ShaderResource::createToCache(
 	TempResourceString newFilename;
 	TempResourceString::ScopeDestroyer newFilenamed(&newFilename, alloc);
 
-	err = newFilename.sprintf(
+	ANKI_CHECK(
+		newFilename.sprintf(
 		alloc,
 		"%s/%s%s.glsl", 
 		&manager._getCacheDirectory()[0],
 		&filenamePrefix[0],
-		&suffix[0]);
-	if(err)
-	{
-		return err;
-	}
+		&suffix[0]));
 
 	if(fileExists(newFilename.toCString()))
 	{
@@ -125,45 +110,20 @@ Error ShaderResource::createToCache(
 
 	TempResourceString fixedFname;
 	TempResourceString::ScopeDestroyer fixedFnamed(&fixedFname, alloc);
-	err = manager.fixResourceFilename(filename, fixedFname);
-	if(err)
-	{
-		return err;
-	}
+	ANKI_CHECK(manager.fixResourceFilename(filename, fixedFname));
 
 	File file;
-	err = file.open(fixedFname.toCString(), File::OpenFlag::READ);
-	if(err)
-	{
-		return err;
-	}
-	err = file.readAllText(TempResourceAllocator<char>(alloc), src);
-	if(err)
-	{
-		return err;
-	}
+	ANKI_CHECK(file.open(fixedFname.toCString(), File::OpenFlag::READ));
+	ANKI_CHECK(file.readAllText(TempResourceAllocator<char>(alloc), src));
 
 	TempResourceString srcfull;
 	TempResourceString::ScopeDestroyer srcfulld(&srcfull, alloc);
-	err = srcfull.sprintf(alloc, "%s%s", &preAppendedSrcCode[0], &src[0]);
-	if(err)
-	{
-		return err;
-	}
+	ANKI_CHECK(srcfull.sprintf(alloc, "%s%s", &preAppendedSrcCode[0], &src[0]));
 
 	// Write cached file
 	File f;
-	err = f.open(newFilename.toCString(), File::OpenFlag::WRITE);
-	if(err)
-	{
-		return err;
-	}
-
-	err = f.writeText("%s\n", &srcfull[0]);
-	if(err)
-	{
-		return err;
-	}
+	ANKI_CHECK(f.open(newFilename.toCString(), File::OpenFlag::WRITE));
+	ANKI_CHECK(f.writeText("%s\n", &srcfull[0]));
 
 	out = std::move(newFilename);
 	return err;