Browse Source

[FEATURE] Add global inputs to shader program

Panagiotis Christopoulos Charitos 8 years ago
parent
commit
42b9b7237a

+ 6 - 1
programs/FsFog.ankiprog

@@ -1,4 +1,9 @@
-<?xml version="1.0" encoding="UTF-8" ?>
+<!-- 
+Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
+All rights reserved.
+Code licensed under the BSD License.
+http://www.anki3d.org/LICENSE
+-->
 <shaderProgram>
 	<shaders>
 		<shader type="vert">

+ 6 - 1
programs/FsParticles.ankiprog

@@ -1,4 +1,9 @@
-<?xml version="1.0" encoding="UTF-8" ?>
+<!-- 
+Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
+All rights reserved.
+Code licensed under the BSD License.
+http://www.anki3d.org/LICENSE
+-->
 <shaderProgram>
 	<mutators>
 		<mutator name="ANIMATED_TEXTURE" values="0 1"/>

+ 6 - 1
programs/MsGeneric.ankiprog

@@ -1,4 +1,9 @@
-<?xml version="1.0" encoding="UTF-8" ?>
+<!-- 
+Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
+All rights reserved.
+Code licensed under the BSD License.
+http://www.anki3d.org/LICENSE
+-->
 <shaderProgram>
 	<mutators>
 		<mutator name="INSTANCE_COUNT" values="1 2 4 8 16 32 64"/>

+ 14 - 11
shaders/ClusterLightCommon.glsl

@@ -97,6 +97,7 @@ layout(ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING), std140, row_major) unifor
 
 #ifdef ANKI_FRAGMENT_SHADER
 
+#if defined(LIGHT_LIGHTS)
 layout(ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING + 1), std140) uniform u1_
 {
 	PointLight u_pointLights[UBO_MAX_SIZE / (3 * 4 * 4)];
@@ -107,18 +108,29 @@ layout(ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING + 2), std140, row_major) un
 	SpotLight u_spotLights[UBO_MAX_SIZE / (9 * 4 * 4)];
 };
 
-#ifdef LIGHT_INDIRECT
+layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING)) uniform highp sampler2DArrayShadow u_spotMapArr;
+layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 1)) uniform highp samplerCubeArrayShadow u_omniMapArr;
+#endif
+
+#if defined(LIGHT_INDIRECT)
 layout(std140, row_major, ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING + 3)) uniform u3_
 {
 	ReflectionProbe u_reflectionProbes[UBO_MAX_SIZE / (2 * 4 * 4)];
 };
+
+layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 2)) uniform samplerCubeArray u_reflectionsTex;
+layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 3)) uniform samplerCubeArray u_irradianceTex;
+layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 4)) uniform sampler2D u_integrationLut;
 #endif
 
-#ifdef LIGHT_DECALS
+#if defined(LIGHT_DECALS)
 layout(std140, row_major, ANKI_UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING + 4)) uniform u4_
 {
 	Decal u_decals[UBO_MAX_SIZE / ((4 + 16) * 4)];
 };
+
+layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 5)) uniform sampler2D u_diffDecalTex;
+layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 6)) uniform sampler2D u_normalRoughnessDecalTex;
 #endif
 
 layout(ANKI_SS_BINDING(LIGHT_SET, LIGHT_SS_BINDING + 0), std430) readonly buffer s0_
@@ -131,15 +143,6 @@ layout(std430, ANKI_SS_BINDING(LIGHT_SET, LIGHT_SS_BINDING + 1)) readonly buffer
 	uint u_lightIndices[];
 };
 
-layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING)) uniform highp sampler2DArrayShadow u_spotMapArr;
-layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 1)) uniform highp samplerCubeArrayShadow u_omniMapArr;
-
-#ifdef LIGHT_INDIRECT
-layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 2)) uniform samplerCubeArray u_reflectionsTex;
-layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 3)) uniform samplerCubeArray u_irradianceTex;
-layout(ANKI_TEX_BINDING(LIGHT_SET, LIGHT_TEX_BINDING + 4)) uniform sampler2D u_integrationLut;
-#endif
-
 #endif // ANKI_FRAGMENT_SHADER
 
 #endif

+ 1 - 0
shaders/FsCommonFrag.glsl

@@ -18,6 +18,7 @@ layout(ANKI_TEX_BINDING(1, 0)) uniform sampler2D anki_msDepthRt;
 #define LIGHT_UBO_BINDING 0
 #define LIGHT_SS_BINDING 0
 #define LIGHT_TEX_BINDING 1
+#define LIGHT_LIGHTS
 #include "shaders/ClusterLightCommon.glsl"
 
 #define anki_u_time u_time

+ 7 - 8
shaders/Is.frag.glsl

@@ -10,19 +10,18 @@
 #define LIGHT_SET 0
 #define LIGHT_SS_BINDING 0
 #define LIGHT_UBO_BINDING 0
-#define LIGHT_TEX_BINDING 4
+#define LIGHT_TEX_BINDING 0
+#define LIGHT_LIGHTS
 #define LIGHT_INDIRECT
 #define LIGHT_DECALS
 #include "shaders/ClusterLightCommon.glsl"
 
-layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D u_msRt0;
-layout(ANKI_TEX_BINDING(0, 1)) uniform sampler2D u_msRt1;
-layout(ANKI_TEX_BINDING(0, 2)) uniform sampler2D u_msRt2;
-layout(ANKI_TEX_BINDING(0, 3)) uniform sampler2D u_msDepthRt;
+layout(ANKI_TEX_BINDING(1, 0)) uniform sampler2D u_msRt0;
+layout(ANKI_TEX_BINDING(1, 1)) uniform sampler2D u_msRt1;
+layout(ANKI_TEX_BINDING(1, 2)) uniform sampler2D u_msRt2;
+layout(ANKI_TEX_BINDING(1, 3)) uniform sampler2D u_msDepthRt;
 
-layout(ANKI_TEX_BINDING(1, 0)) uniform sampler2D u_diffDecalTex;
-layout(ANKI_TEX_BINDING(1, 1)) uniform sampler2D u_normalRoughnessDecalTex;
-layout(ANKI_TEX_BINDING(1, 2)) uniform sampler2D u_ssaoTex;
+layout(ANKI_TEX_BINDING(1, 4)) uniform sampler2D u_ssaoTex;
 
 layout(location = 0) in vec2 in_uv;
 layout(location = 1) in vec2 in_clusterIJ;

+ 1 - 0
shaders/Volumetric.frag.glsl

@@ -11,6 +11,7 @@
 #define LIGHT_UBO_BINDING 0
 #define LIGHT_SS_BINDING 0
 #define LIGHT_SET 0
+#define LIGHT_LIGHTS
 #include "shaders/ClusterLightCommon.glsl"
 
 layout(location = 0) in vec2 in_uv;

+ 23 - 23
src/anki/gr/Common.h

@@ -27,6 +27,29 @@ class FramebufferInitInfo;
 /// @addtogroup graphics
 /// @{
 
+// Some constants
+const U MAX_VERTEX_ATTRIBUTES = 8;
+const U MAX_COLOR_ATTACHMENTS = 4;
+const U MAX_MIPMAPS = 16;
+const U MAX_TEXTURE_LAYERS = 32;
+
+const U MAX_TEXTURE_BINDINGS = 8;
+const U MAX_UNIFORM_BUFFER_BINDINGS = 5;
+const U MAX_STORAGE_BUFFER_BINDINGS = 4;
+const U MAX_IMAGE_BINDINGS = 4;
+const U MAX_TEXTURE_BUFFER_BINDINGS = 4;
+
+const U MAX_BINDINGS_PER_DESCRIPTOR_SET = MAX_TEXTURE_BINDINGS + MAX_UNIFORM_BUFFER_BINDINGS
+	+ MAX_STORAGE_BUFFER_BINDINGS + MAX_IMAGE_BINDINGS + MAX_TEXTURE_BUFFER_BINDINGS;
+
+const U MAX_FRAMES_IN_FLIGHT = 3; ///< Triple buffering.
+const U MAX_DESCRIPTOR_SETS = 2; ///< Groups that can be bound at the same time.
+
+const U MAX_GR_OBJECT_NAME_LENGTH = 15;
+
+/// The number of commands in a command buffer that make it a small batch command buffer.
+const U COMMAND_BUFFER_SMALL_BATCH_MAX_COMMANDS = 100;
+
 /// Smart pointer for resources.
 template<typename T>
 using GrObjectPtr = IntrusivePtr<T, DefaultPtrDeleter<T>>;
@@ -147,18 +170,6 @@ public:
 	U32 m_level = 0;
 };
 
-// Some constants
-const U MAX_VERTEX_ATTRIBUTES = 8;
-const U MAX_COLOR_ATTACHMENTS = 4;
-const U MAX_MIPMAPS = 16;
-const U MAX_TEXTURE_LAYERS = 32;
-
-const U MAX_TEXTURE_BINDINGS = 10;
-const U MAX_UNIFORM_BUFFER_BINDINGS = 5;
-const U MAX_STORAGE_BUFFER_BINDINGS = 4;
-const U MAX_IMAGE_BINDINGS = 4;
-const U MAX_TEXTURE_BUFFER_BINDINGS = 4;
-
 enum class DescriptorType : U8
 {
 	TEXTURE,
@@ -170,17 +181,6 @@ enum class DescriptorType : U8
 	COUNT
 };
 
-const U MAX_BINDINGS_PER_DESCRIPTOR_SET = MAX_TEXTURE_BINDINGS + MAX_UNIFORM_BUFFER_BINDINGS
-	+ MAX_STORAGE_BUFFER_BINDINGS + MAX_IMAGE_BINDINGS + MAX_TEXTURE_BUFFER_BINDINGS;
-
-const U MAX_FRAMES_IN_FLIGHT = 3; ///< Triple buffering.
-const U MAX_DESCRIPTOR_SETS = 2; ///< Groups that can be bound at the same time.
-
-const U MAX_GR_OBJECT_NAME_LENGTH = 15;
-
-/// The number of commands in a command buffer that make it a small batch command buffer.
-const U COMMAND_BUFFER_SMALL_BATCH_MAX_COMMANDS = 100;
-
 /// The base of all init infos for GR.
 class GrBaseInitInfo
 {

+ 13 - 13
src/anki/renderer/Is.cpp

@@ -172,21 +172,21 @@ void Is::run(RenderingContext& ctx)
 	cmdb->setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
 	cmdb->bindShaderProgram(m_lightProg);
 
-	cmdb->bindTexture(0, 0, m_r->getMs().m_rt0);
-	cmdb->bindTexture(0, 1, m_r->getMs().m_rt1);
-	cmdb->bindTexture(0, 2, m_r->getMs().m_rt2);
-	cmdb->bindTexture(0, 3, m_r->getMs().m_depthRt, DepthStencilAspectBit::DEPTH);
-	cmdb->bindTexture(0, 4, m_r->getSm().m_spotTexArray);
-	cmdb->bindTexture(0, 5, m_r->getSm().m_omniTexArray);
-	cmdb->bindTexture(0, 6, m_r->getIr().getReflectionTexture());
-	cmdb->bindTexture(0, 7, m_r->getIr().getIrradianceTexture());
-	cmdb->bindTextureAndSampler(0, 8, m_r->getIr().getIntegrationLut(), m_r->getIr().getIntegrationLutSampler());
-
-	cmdb->bindTexture(1, 0, (ctx.m_is.m_diffDecalTex) ? ctx.m_is.m_diffDecalTex : m_r->getDummyTexture());
+	cmdb->bindTexture(1, 0, m_r->getMs().m_rt0);
+	cmdb->bindTexture(1, 1, m_r->getMs().m_rt1);
+	cmdb->bindTexture(1, 2, m_r->getMs().m_rt2);
+	cmdb->bindTexture(1, 3, m_r->getMs().m_depthRt, DepthStencilAspectBit::DEPTH);
+	cmdb->bindTexture(1, 4, m_r->getSsao().m_main.getPreviousRt());
+
+	cmdb->bindTexture(0, 0, m_r->getSm().m_spotTexArray);
+	cmdb->bindTexture(0, 1, m_r->getSm().m_omniTexArray);
+	cmdb->bindTexture(0, 2, m_r->getIr().getReflectionTexture());
+	cmdb->bindTexture(0, 3, m_r->getIr().getIrradianceTexture());
+	cmdb->bindTextureAndSampler(0, 4, m_r->getIr().getIntegrationLut(), m_r->getIr().getIntegrationLutSampler());
+	cmdb->bindTexture(0, 5, (ctx.m_is.m_diffDecalTex) ? ctx.m_is.m_diffDecalTex : m_r->getDummyTexture());
 	cmdb->bindTexture(
-		1, 1, (ctx.m_is.m_normRoughnessDecalTex) ? ctx.m_is.m_normRoughnessDecalTex : m_r->getDummyTexture());
+		0, 6, (ctx.m_is.m_normRoughnessDecalTex) ? ctx.m_is.m_normRoughnessDecalTex : m_r->getDummyTexture());
 	cmdb->informTextureCurrentUsage(m_r->getSsao().m_main.getPreviousRt(), TextureUsageBit::SAMPLED_FRAGMENT);
-	cmdb->bindTexture(1, 2, m_r->getSsao().m_main.getPreviousRt());
 
 	bindUniforms(cmdb, 0, 0, ctx.m_is.m_commonToken);
 	bindUniforms(cmdb, 0, 1, ctx.m_is.m_pointLightsToken);

+ 22 - 5
src/anki/resource/ShaderProgramResource.cpp

@@ -225,13 +225,10 @@ Error ShaderProgramResource::load(const ResourceFilename& filename)
 		} while(mutatorEl);
 	}
 
-	// <shaders>
-	XmlElement shadersEl;
-	ANKI_CHECK(rootEl.getChildElement("shaders", shadersEl));
-
-	// <shader>
 	// Count the input variables
 	U inputVarCount = 0;
+	XmlElement shadersEl;
+	ANKI_CHECK(rootEl.getChildElement("shaders", shadersEl));
 	XmlElement shaderEl;
 	ANKI_CHECK(shadersEl.getChildElement("shader", shaderEl));
 	do
@@ -254,6 +251,20 @@ Error ShaderProgramResource::load(const ResourceFilename& filename)
 		ANKI_CHECK(shaderEl.getNextSiblingElement("shader", shaderEl));
 	} while(shaderEl);
 
+	XmlElement inputsEl;
+	ANKI_CHECK(rootEl.getChildElementOptional("inputs", inputsEl));
+	if(inputsEl)
+	{
+		XmlElement inputEl;
+		ANKI_CHECK(inputsEl.getChildElement("input", inputEl));
+
+		U32 count;
+		ANKI_CHECK(inputEl.getSiblingElementsCount(count));
+		++count;
+
+		inputVarCount += count;
+	}
+
 	if(inputVarCount)
 	{
 		m_inputVars.create(getAllocator(), inputVarCount);
@@ -308,6 +319,12 @@ Error ShaderProgramResource::load(const ResourceFilename& filename)
 		ANKI_CHECK(shaderEl.getNextSiblingElement("shader", shaderEl));
 	} while(shaderEl);
 
+	// <inputs>
+	if(inputsEl)
+	{
+		ANKI_CHECK(parseInputs(inputsEl, inputVarCount, constSrcList, blockSrcList, globalsSrcList, definesSrcList));
+	}
+
 	ANKI_ASSERT(inputVarCount == m_inputVars.getSize());
 
 	// Sanity checks

+ 10 - 0
src/anki/resource/ShaderProgramResource.h

@@ -268,6 +268,15 @@ static_assert(sizeof(ShaderProgramResourceConstantValue) == sizeof(Vec4) * 2, "N
 /// 		<mutator name="str" values="array of ints"/>
 /// 	</mutators>]
 ///
+///		[<inputs> (3)
+///			<input name="str" type="float | vec2 | vec3 | vec4 | mat3 | mat4 | samplerXXX"
+///				[instanceCount="mutator name"] [const="0 | 1"]>
+///				[<mutators> (2)
+///					<mutator name="variant_name" values="array of ints"/>
+///				</mutators>]
+///			</input>
+///		</inputs>]
+///
 ///		<shaders>
 ///			<shader type="vert | frag | tese | tesc"/>
 ///
@@ -290,6 +299,7 @@ static_assert(sizeof(ShaderProgramResourceConstantValue) == sizeof(Vec4) * 2, "N
 /// (1): This is a variant list. It contains the means to permutate the program.
 /// (2): This lists a subset of mutators and out of these variants a subset of their values. The input variable will
 ///      become active only on those mutators. Mutators not listed are implicitly added with all their values.
+/// (3): Global inputs. For all shaders.
 class ShaderProgramResource : public ResourceObject
 {
 public: