Quellcode durchsuchen

added texture functions (array,offset,gather) and image types

attilaz vor 7 Jahren
Ursprung
Commit
ec321a836e
3 geänderte Dateien mit 66 neuen und 6 gelöschten Zeilen
  1. 19 0
      src/bgfx_compute.sh
  2. 38 0
      src/bgfx_shader.sh
  3. 9 6
      src/renderer_gl.cpp

+ 19 - 0
src/bgfx_compute.sh

@@ -68,12 +68,17 @@
 #define rg32ui   uint2
 #define rgba32ui uint4
 #define r32f     float
+#define r16f     float
 #define rg16f    float2
 #define rgba16f  float4
 #if BGFX_SHADER_LANGUAGE_HLSL
 #	define rgba8 unorm float4
+#	define rg8   unorm float2
+#	define r8    unorm float
 #else
 #	define rgba8       float4
+#	define rg8         float2
+#	define r8          float
 #endif // BGFX_SHADER_LANGUAGE_HLSL
 #define rgba32f  float4
 
@@ -247,12 +252,24 @@
 		_image.m_texture[_uvw] = _value._storeComponents;                            \
 	}
 
+#define __IMAGE_IMPL_ATOMIC(_format, _storeComponents, _type, _loadComponents)            \
+	\
+	void imageAtomicAdd(BgfxRWImage2D_ ## _format _image, ivec2 _uv,  _type _value)  \
+	{				                                                                 \
+		InterlockedAdd(_image.m_texture[_uv], _value._storeComponents);	             \
+	}                                                                                \
+
+
 __IMAGE_IMPL_A(rgba8,       xyzw, vec4,  xyzw)
+__IMAGE_IMPL_A(rg8,         xy,   vec4,  xyyy)
+__IMAGE_IMPL_A(r8,          x,    vec4,  xxxx)
 __IMAGE_IMPL_A(rg16f,       xy,   vec4,  xyyy)
 #if BGFX_SHADER_LANGUAGE_HLSL
 __IMAGE_IMPL_S(rgba16f,     xyzw, vec4,  xyzw)
+__IMAGE_IMPL_S(r16f,        x,    vec4,  xxxx)
 #else
 __IMAGE_IMPL_A(rgba16f,     xyzw, vec4,  xyzw)
+__IMAGE_IMPL_A(r16f,        x,    vec4,  xxxx)
 #endif // BGFX_SHADER_LANGUAGE_HLSL
 __IMAGE_IMPL_A(r32f,        x,    vec4,  xxxx)
 __IMAGE_IMPL_A(rgba32f,     xyzw, vec4,  xyzw)
@@ -260,6 +277,8 @@ __IMAGE_IMPL_A(r32ui,       x,    uvec4, xxxx)
 __IMAGE_IMPL_A(rg32ui,      xy,   uvec4, xyyy)
 __IMAGE_IMPL_A(rgba32ui,    xyzw, uvec4, xyzw)
 
+__IMAGE_IMPL_ATOMIC(r32ui,       x,    uvec4, xxxx)
+
 #define atomicAdd(_mem, _data)                                       InterlockedAdd(_mem, _data)
 #define atomicAnd(_mem, _data)                                       InterlockedAnd(_mem, _data)
 #define atomicMax(_mem, _data)                                       InterlockedMax(_mem, _data)

+ 38 - 0
src/bgfx_shader.sh

@@ -177,6 +177,11 @@ vec4 bgfxTexture2DLod(BgfxSampler2D _sampler, vec2 _coord, float _level)
 	return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level);
 }
 
+vec4 bgfxTexture2DLodOffset(BgfxSampler2D _sampler, vec2 _coord, float _level, ivec2 _offset)
+{
+	return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level, _offset);
+}
+
 vec4 bgfxTexture2DProj(BgfxSampler2D _sampler, vec3 _coord)
 {
 	vec2 coord = _coord.xy * rcp(_coord.z);
@@ -204,6 +209,11 @@ vec4 bgfxTexture2DArrayLod(BgfxSampler2DArray _sampler, vec3 _coord, float _lod)
 	return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _lod);
 }
 
+vec4 bgfxTexture2DArrayLodOffset(BgfxSampler2DArray _sampler, vec3 _coord, float _level, ivec2 _offset)
+{
+	return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level, _offset);
+}
+
 float bgfxShadow2D(BgfxSampler2DShadow _sampler, vec3 _coord)
 {
 	return _sampler.m_texture.SampleCmpLevelZero(_sampler.m_sampler, _coord.xy, _coord.z);
@@ -264,6 +274,11 @@ vec4 bgfxTexelFetch(BgfxSampler2D _sampler, ivec2 _coord, int _lod)
 	return _sampler.m_texture.Load(ivec3(_coord, _lod) );
 }
 
+vec4 bgfxTexelFetchOffset(BgfxSampler2D _sampler, ivec2 _coord, int _lod, ivec2 _offset)
+{
+	return _sampler.m_texture.Load(ivec3(_coord, _lod), _offset );
+}
+
 vec2 bgfxTextureSize(BgfxSampler2D _sampler, int _lod)
 {
 	vec2 result;
@@ -271,6 +286,19 @@ vec2 bgfxTextureSize(BgfxSampler2D _sampler, int _lod)
 	return result;
 }
 
+vec4 bgfxTextureGather(BgfxSampler2D _sampler, vec2 _coord)
+{
+	return _sampler.m_texture.GatherRed(_sampler.m_sampler, _coord );
+}
+vec4 bgfxTextureGatherOffset(BgfxSampler2D _sampler, vec2 _coord, ivec2 _offset)
+{
+	return _sampler.m_texture.GatherRed(_sampler.m_sampler, _coord, _offset );
+}
+vec4 bgfxTextureGather(BgfxSampler2DArray _sampler, vec3 _coord)
+{
+	return _sampler.m_texture.GatherRed(_sampler.m_sampler, _coord );
+}
+
 ivec4 bgfxTexelFetch(BgfxISampler2D _sampler, ivec2 _coord, int _lod)
 {
 	return _sampler.m_texture.Load(ivec3(_coord, _lod) );
@@ -286,6 +314,11 @@ vec4 bgfxTexelFetch(BgfxSampler2DMS _sampler, ivec2 _coord, int _sampleIdx)
 	return _sampler.m_texture.Load(_coord, _sampleIdx);
 }
 
+vec4 bgfxTexelFetch(BgfxSampler2DArray _sampler, ivec3 _coord, int _lod)
+{
+	return _sampler.m_texture.Load(ivec4(_coord, _lod) );
+}
+
 vec4 bgfxTexelFetch(BgfxSampler3D _sampler, ivec3 _coord, int _lod)
 {
 	return _sampler.m_texture.Load(ivec4(_coord, _lod) );
@@ -311,6 +344,7 @@ vec3 bgfxTextureSize(BgfxSampler3D _sampler, int _lod)
 #		define sampler2D BgfxSampler2D
 #		define texture2D(_sampler, _coord) bgfxTexture2D(_sampler, _coord)
 #		define texture2DLod(_sampler, _coord, _level) bgfxTexture2DLod(_sampler, _coord, _level)
+#		define texture2DLodOffset(_sampler, _coord, _level, _offset) bgfxTexture2DLodOffset(_sampler, _coord, _level, _offset)
 #		define texture2DProj(_sampler, _coord) bgfxTexture2DProj(_sampler, _coord)
 #		define texture2DGrad(_sampler, _coord, _dPdx, _dPdy) bgfxTexture2DGrad(_sampler, _coord, _dPdx, _dPdy)
 
@@ -321,6 +355,7 @@ vec3 bgfxTextureSize(BgfxSampler3D _sampler, int _lod)
 #		define sampler2DArray BgfxSampler2DArray
 #		define texture2DArray(_sampler, _coord) bgfxTexture2DArray(_sampler, _coord)
 #		define texture2DArrayLod(_sampler, _coord, _lod) bgfxTexture2DArrayLod(_sampler, _coord, _lod)
+#		define texture2DArrayLodOffset(_sampler, _coord, _level, _offset) bgfxTexture2DArrayLodOffset(_sampler, _coord, _level, _offset)
 
 #		define SAMPLER2DMS(_name, _reg) \
 			uniform Texture2DMS<vec4> _name ## Texture : REGISTER(t, _reg); \
@@ -372,7 +407,10 @@ vec3 bgfxTextureSize(BgfxSampler3D _sampler, int _lod)
 #		define shadowCube(_sampler, _coord) bgfxShadowCube(_sampler, _coord)
 
 #		define texelFetch(_sampler, _coord, _lod) bgfxTexelFetch(_sampler, _coord, _lod)
+#		define texelFetchOffset(_sampler, _coord, _lod, _offset) bgfxTexelFetchOffset(_sampler, _coord, _lod, _offset)
 #		define textureSize(_sampler, _lod) bgfxTextureSize(_sampler, _lod)
+#		define textureGather(_sampler, _coord) bgfxTextureGather(_sampler, _coord)
+#		define textureGatherOffset(_sampler, _coord, _offset) bgfxTextureGatherOffset(_sampler, _coord, _offset)
 #	else
 
 #		define sampler2DShadow sampler2D

+ 9 - 6
src/renderer_gl.cpp

@@ -5776,12 +5776,15 @@ BX_TRACE("%d, %d, %d, %s", _array, _srgb, _mipAutogen, getName(_format) );
 
 				bx::write(&writer
 					, "#version 430\n"
-					  "#define texture2DLod    textureLod\n"
-					  "#define texture3DLod    textureLod\n"
-					  "#define textureCubeLod  textureLod\n"
-					  "#define texture2DGrad   textureGrad\n"
-					  "#define texture3DGrad   textureGrad\n"
-					  "#define textureCubeGrad textureGrad\n"
+					  "#define texture2DLod             textureLod\n"
+					  "#define texture2DLodOffset       textureLodOffset\n"
+					  "#define texture2DArrayLod        textureLod\n"
+					  "#define texture2DArrayLodOffset  textureLodOffset\n"
+					  "#define texture3DLod             textureLod\n"
+					  "#define textureCubeLod           textureLod\n"
+					  "#define texture2DGrad            textureGrad\n"
+					  "#define texture3DGrad            textureGrad\n"
+					  "#define textureCubeGrad          textureGrad\n"
 					);
 
 				bx::write(&writer, code.getPtr()+bx::strLen("#version 430"), codeLen);