Ver Fonte

Minor tuning of bindless

Panagiotis Christopoulos Charitos há 5 anos atrás
pai
commit
7c789d46d6

+ 2 - 1
src/anki/gr/ShaderCompiler.cpp

@@ -72,7 +72,8 @@ static const char* SHADER_HEADER = R"(#version 450 core
 #	define ANKI_MAX_BINDLESS_TEXTURES %u
 #	define ANKI_MAX_BINDLESS_IMAGES %u
 #	define ANKI_BINDLESS_SET(set_) \
-		layout(set = set_, binding = 0) uniform utexture2D u_bindlessTextures[ANKI_MAX_BINDLESS_TEXTURES]; \
+		layout(set = set_, binding = 0) uniform utexture2D u_bindlessTexturesU2d[ANKI_MAX_BINDLESS_TEXTURES]; \
+		layout(set = set_, binding = 0) uniform texture2D u_bindlessTextures2d[ANKI_MAX_BINDLESS_TEXTURES]; \
 		layout(set = set_, binding = 1) uniform readonly uimage2D u_bindlessImages[ANKI_MAX_BINDLESS_IMAGES];
 #endif
 

+ 11 - 1
src/anki/shader_compiler/ShaderProgramParser.cpp

@@ -45,6 +45,14 @@ static const char* SHADER_HEADER = R"(#version 450 core
 #define ANKI_MAX_BINDLESS_TEXTURES %u
 #define ANKI_MAX_BINDLESS_IMAGES %u
 
+#define ANKI_BINDLESS_SET(set_) \
+	layout(set = set_, binding = 0) uniform utexture2D u_bindlessTextures2dU32[ANKI_MAX_BINDLESS_TEXTURES]; \
+	layout(set = set_, binding = 0) uniform itexture2D u_bindlessTextures2dI32[ANKI_MAX_BINDLESS_TEXTURES]; \
+	layout(set = set_, binding = 0) uniform texture2D u_bindlessTextures2dF32[ANKI_MAX_BINDLESS_TEXTURES]; \
+	layout(set = set_, binding = 1) uniform readonly uimage2D u_bindlessImages2dU32[ANKI_MAX_BINDLESS_IMAGES]; \
+	layout(set = set_, binding = 1) uniform readonly iimage2D u_bindlessImages2dI32[ANKI_MAX_BINDLESS_IMAGES]; \
+	layout(set = set_, binding = 1) uniform readonly image2D u_bindlessImages2dF32[ANKI_MAX_BINDLESS_IMAGES];
+
 #define F32 float
 #define Vec2 vec2
 #define Vec3 vec3
@@ -120,6 +128,8 @@ static const char* SHADER_HEADER = R"(#version 450 core
 #define ANKI_SPECIALIZATION_CONSTANT_VEC4(n, id, defltVal) _ANKI_SCONST_X4(Vec4, F32, n, id, defltVal,)
 )";
 
+static const U64 SHADER_HEADER_HASH = computeHash(SHADER_HEADER, sizeof(SHADER_HEADER));
+
 ShaderProgramParser::ShaderProgramParser(CString fname,
 	ShaderProgramFilesystemInterface* fsystem,
 	GenericMemoryPoolAllocator<U8> alloc,
@@ -699,7 +709,7 @@ Error ShaderProgramParser::parse()
 		m_codeLines.join("\n", m_codeSource);
 		m_codeLines.destroy();
 
-		m_codeSourceHash = computeHash(m_codeSource.getBegin(), m_codeSource.getLength());
+		m_codeSourceHash = appendHash(m_codeSource.getBegin(), m_codeSource.getLength(), SHADER_HEADER_HASH);
 	}
 
 	return Error::NONE;

+ 11 - 11
src/anki/util/Hash.cpp

@@ -9,13 +9,13 @@
 namespace anki
 {
 
-const U64 HASH_M = 0xc6a4a7935bd1e995;
-const U64 HASH_R = 47;
+constexpr U64 HASH_M = 0xc6a4a7935bd1e995;
+constexpr U64 HASH_R = 47;
 
 U64 appendHash(const void* buffer, PtrSize bufferSize, U64 h)
 {
 	const U64* data = static_cast<const U64*>(buffer);
-	const U64* end = data + (bufferSize / sizeof(U64));
+	const U64* const end = data + (bufferSize / sizeof(U64));
 
 	while(data != end)
 	{
@@ -34,19 +34,19 @@ U64 appendHash(const void* buffer, PtrSize bufferSize, U64 h)
 	switch(bufferSize & (sizeof(U64) - 1))
 	{
 	case 7:
-		h ^= static_cast<U64>(data2[6]) << 48;
+		h ^= U64(data2[6]) << 48;
 	case 6:
-		h ^= static_cast<U64>(data2[5]) << 40;
+		h ^= U64(data2[5]) << 40;
 	case 5:
-		h ^= static_cast<U64>(data2[4]) << 32;
+		h ^= U64(data2[4]) << 32;
 	case 4:
-		h ^= static_cast<U64>(data2[3]) << 24;
+		h ^= U64(data2[3]) << 24;
 	case 3:
-		h ^= static_cast<U64>(data2[2]) << 16;
+		h ^= U64(data2[2]) << 16;
 	case 2:
-		h ^= static_cast<U64>(data2[1]) << 8;
+		h ^= U64(data2[1]) << 8;
 	case 1:
-		h ^= static_cast<U64>(data2[0]);
+		h ^= U64(data2[0]);
 		h *= HASH_M;
 	};
 
@@ -60,7 +60,7 @@ U64 appendHash(const void* buffer, PtrSize bufferSize, U64 h)
 
 U64 computeHash(const void* buffer, PtrSize bufferSize, U64 seed)
 {
-	U64 h = seed ^ (bufferSize * HASH_M);
+	const U64 h = seed ^ (bufferSize * HASH_M);
 	return appendHash(buffer, bufferSize, h);
 }
 

+ 22 - 8
tests/gr/Gr.cpp

@@ -2270,6 +2270,10 @@ ANKI_TEST(Gr, Bindless)
 	// Create texture B
 	TexturePtr texB = gr->newTexture(texInit);
 
+	// Create texture C
+	texInit.m_format = Format::R32G32B32A32_SFLOAT;
+	TexturePtr texC = gr->newTexture(texInit);
+
 	// Create sampler
 	SamplerInitInfo samplerInit;
 	SamplerPtr sampler = gr->newSampler(samplerInit);
@@ -2277,6 +2281,7 @@ ANKI_TEST(Gr, Bindless)
 	// Create views
 	TextureViewPtr viewA = gr->newTextureView(TextureViewInitInfo(texA, TextureSurfaceInfo()));
 	TextureViewPtr viewB = gr->newTextureView(TextureViewInitInfo(texB, TextureSurfaceInfo()));
+	TextureViewPtr viewC = gr->newTextureView(TextureViewInitInfo(texC, TextureSurfaceInfo()));
 
 	// Create result buffer
 	BufferPtr resBuff =
@@ -2303,9 +2308,10 @@ layout(push_constant) uniform pc_
 void main()
 {
 	uvec4 val0 = imageLoad(u_bindlessImages[u_texIndices[0]], ivec2(0));
-	uvec4 val1 = texelFetch(usampler2D(u_bindlessTextures[u_texIndices[1]], u_sampler), ivec2(0), 0);
+	uvec4 val1 = texelFetch(usampler2D(u_bindlessTexturesU2d[u_texIndices[1]], u_sampler), ivec2(0), 0);
+	vec4 val2 = texelFetch(sampler2D(u_bindlessTextures2d[u_texIndices[2]], u_sampler), ivec2(0), 0);
 
-	u_result = val0 + val1;
+	u_result = val0 + val1 + uvec4(val2);
 })";
 
 	ShaderPtr shader = createShader(PROG_SRC, ShaderType::COMPUTE, *gr);
@@ -2322,17 +2328,23 @@ void main()
 		texA, TextureUsageBit::NONE, TextureUsageBit::TRANSFER_DESTINATION, TextureSurfaceInfo());
 	cmdb->setTextureSurfaceBarrier(
 		texB, TextureUsageBit::NONE, TextureUsageBit::TRANSFER_DESTINATION, TextureSurfaceInfo());
+	cmdb->setTextureSurfaceBarrier(
+		texC, TextureUsageBit::NONE, TextureUsageBit::TRANSFER_DESTINATION, TextureSurfaceInfo());
 
-	TransferGpuAllocatorHandle handle0, handle1;
+	TransferGpuAllocatorHandle handle0, handle1, handle2;
 	const UVec4 mip0 = UVec4(1, 2, 3, 4);
 	UPLOAD_TEX_SURFACE(cmdb, texA, TextureSurfaceInfo(0, 0, 0, 0), &mip0[0], sizeof(mip0), handle0);
 	const UVec4 mip1 = UVec4(10, 20, 30, 40);
 	UPLOAD_TEX_SURFACE(cmdb, texB, TextureSurfaceInfo(0, 0, 0, 0), &mip1[0], sizeof(mip1), handle1);
+	const Vec4 mip2 = Vec4(2.2f, 3.3f, 4.4f, 5.5f);
+	UPLOAD_TEX_SURFACE(cmdb, texC, TextureSurfaceInfo(0, 0, 0, 0), &mip2[0], sizeof(mip2), handle2);
 
 	cmdb->setTextureSurfaceBarrier(
 		texA, TextureUsageBit::TRANSFER_DESTINATION, TextureUsageBit::IMAGE_COMPUTE_READ, TextureSurfaceInfo());
 	cmdb->setTextureSurfaceBarrier(
 		texB, TextureUsageBit::TRANSFER_DESTINATION, TextureUsageBit::SAMPLED_COMPUTE, TextureSurfaceInfo());
+	cmdb->setTextureSurfaceBarrier(
+		texC, TextureUsageBit::TRANSFER_DESTINATION, TextureUsageBit::SAMPLED_COMPUTE, TextureSurfaceInfo());
 
 	cmdb->bindStorageBuffer(1, 0, resBuff, 0, MAX_PTR_SIZE);
 	cmdb->bindSampler(1, 1, sampler);
@@ -2340,7 +2352,8 @@ void main()
 
 	const U32 idx0 = cmdb->bindBindlessImage(viewA);
 	const U32 idx1 = cmdb->bindBindlessTexture(viewB, TextureUsageBit::SAMPLED_COMPUTE);
-	UVec4 pc(idx0, idx1, 0, 0);
+	const U32 idx2 = cmdb->bindBindlessTexture(viewC, TextureUsageBit::SAMPLED_COMPUTE);
+	UVec4 pc(idx0, idx1, idx2, 0);
 	cmdb->setPushConstants(&pc, sizeof(pc));
 
 	cmdb->bindAllBindless(0);
@@ -2352,15 +2365,16 @@ void main()
 	cmdb->flush(&fence);
 	transfAlloc->release(handle0, fence);
 	transfAlloc->release(handle1, fence);
+	transfAlloc->release(handle2, fence);
 	gr->finish();
 
 	// Check result
 	UVec4* res = static_cast<UVec4*>(resBuff->map(0, sizeof(UVec4), BufferMapAccessBit::READ));
 
-	ANKI_TEST_EXPECT_EQ(res->x(), 11);
-	ANKI_TEST_EXPECT_EQ(res->y(), 22);
-	ANKI_TEST_EXPECT_EQ(res->z(), 33);
-	ANKI_TEST_EXPECT_EQ(res->w(), 44);
+	ANKI_TEST_EXPECT_EQ(res->x(), 13);
+	ANKI_TEST_EXPECT_EQ(res->y(), 25);
+	ANKI_TEST_EXPECT_EQ(res->z(), 37);
+	ANKI_TEST_EXPECT_EQ(res->w(), 49);
 
 	resBuff->unmap();