mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-11-07 08:35:45 +00:00
Added cube array samplers. (#3979)
This commit is contained in:
@@ -182,6 +182,12 @@ struct BgfxSamplerCube
|
||||
TextureCube m_texture;
|
||||
};
|
||||
|
||||
struct BgfxSamplerCubeArray
|
||||
{
|
||||
SamplerState m_sampler;
|
||||
TextureCubeArray m_texture;
|
||||
};
|
||||
|
||||
struct BgfxSamplerCubeShadow
|
||||
{
|
||||
SamplerComparisonState m_sampler;
|
||||
@@ -312,6 +318,16 @@ vec4 bgfxTextureCubeBias(BgfxSamplerCube _sampler, vec3 _coord, float _bias)
|
||||
return _sampler.m_texture.SampleBias(_sampler.m_sampler, _coord, _bias);
|
||||
}
|
||||
|
||||
vec4 bgfxTextureCubeArray(BgfxSamplerCubeArray _sampler, vec4 _coord)
|
||||
{
|
||||
return _sampler.m_texture.Sample(_sampler.m_sampler, _coord);
|
||||
}
|
||||
|
||||
vec4 bgfxTextureCubeArrayLod(BgfxSamplerCubeArray _sampler, vec4 _coord, float _level)
|
||||
{
|
||||
return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level);
|
||||
}
|
||||
|
||||
vec4 bgfxTextureCubeLod(BgfxSamplerCube _sampler, vec3 _coord, float _level)
|
||||
{
|
||||
return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level);
|
||||
@@ -519,6 +535,14 @@ vec3 bgfxTextureSize(BgfxSampler3D _sampler, int _lod)
|
||||
# define textureCubeBias(_sampler, _coord, _bias) bgfxTextureCubeBias(_sampler, _coord, _bias)
|
||||
# define textureCubeLod(_sampler, _coord, _level) bgfxTextureCubeLod(_sampler, _coord, _level)
|
||||
|
||||
# define SAMPLERCUBEARRAY(_name, _reg) \
|
||||
uniform SamplerState _name ## Sampler : REGISTER(s, _reg); \
|
||||
uniform TextureCubeArray _name ## Texture : REGISTER(t, _reg); \
|
||||
static BgfxSamplerCubeArray _name = { _name ## Sampler, _name ## Texture }
|
||||
# define samplerCubeArray BgfxSamplerCubeArray
|
||||
# define textureCubeArray(_sampler, _coord) bgfxTextureCubeArray(_sampler, _coord)
|
||||
# define textureCubeArrayLod(_sampler, _coord, _level) bgfxTextureCubeArrayLod(_sampler, _coord, _level)
|
||||
|
||||
# define SAMPLERCUBESHADOW(_name, _reg) \
|
||||
uniform SamplerComparisonState _name ## SamplerComparison : REGISTER(s, _reg); \
|
||||
uniform TextureCube _name ## Texture : REGISTER(t, _reg); \
|
||||
@@ -650,6 +674,7 @@ vec4 mod(vec4 _a, vec4 _b) { return _a - _b * floor(_a / _b); }
|
||||
# define texture2DArray(_sampler, _coord) texture(_sampler, _coord)
|
||||
# define texture3D(_sampler, _coord) texture(_sampler, _coord)
|
||||
# define textureCube(_sampler, _coord) texture(_sampler, _coord)
|
||||
# define textureCubeArray(_sampler, _coord) texture(_sampler, _coord)
|
||||
# define texture2DLod(_sampler, _coord, _lod) textureLod(_sampler, _coord, _lod)
|
||||
# define texture2DLodOffset(_sampler, _coord, _lod, _offset) textureLodOffset(_sampler, _coord, _lod, _offset)
|
||||
# define texture2DArrayLod(_sampler, _coord, _lod) textureLod(_sampler, _coord, _lod)
|
||||
@@ -657,6 +682,7 @@ vec4 mod(vec4 _a, vec4 _b) { return _a - _b * floor(_a / _b); }
|
||||
# define texture3DLod(_sampler, _coord, _lod) textureLod(_sampler, _coord, _lod)
|
||||
# define texture3DLodOffset(_sampler, _coord, _lod, _offset) textureLodOffset(_sampler, _coord, _lod, _offset)
|
||||
# define textureCubeLod(_sampler, _coord, _lod) textureLod(_sampler, _coord, _lod)
|
||||
# define textureCubeArrayLod(_sampler, _coord, _lod) textureLod(_sampler, _coord, _lod)
|
||||
# define texture2DGrad(_sampler, _coord, _dPdx, _dPdy) textureGrad(_sampler, _coord, _dPdx, _dPdy)
|
||||
# define texture3DGrad(_sampler, _coord, _dPdx, _dPdy) textureGrad(_sampler, _coord, _dPdx, _dPdy)
|
||||
# define textureCubeGrad(_sampler, _coord, _dPdx, _dPdy) textureGrad(_sampler, _coord, _dPdx, _dPdy)
|
||||
|
||||
@@ -4787,7 +4787,7 @@ namespace bgfx { namespace d3d12
|
||||
case D3D12_SRV_DIMENSION_TEXTURECUBEARRAY:
|
||||
srvd->TextureCubeArray.MostDetailedMip = _firstMip;
|
||||
srvd->TextureCubeArray.MipLevels = numMips;
|
||||
srvd->TextureCubeArray.First2DArrayFace = _firstLayer;
|
||||
srvd->TextureCubeArray.First2DArrayFace = _firstLayer * 6;
|
||||
srvd->TextureCubeArray.NumCubes = numLayers;
|
||||
srvd->TextureCubeArray.ResourceMinLODClamp = 0;
|
||||
break;
|
||||
|
||||
+3
-2
@@ -6754,11 +6754,12 @@ namespace bgfx { namespace gl
|
||||
GLuint TextureGL::getViewId(uint8_t _firstMip, uint8_t _numMips, uint16_t _firstLayer, uint16_t _numLayers, GLenum* _target, bool _layered)
|
||||
{
|
||||
const uint16_t facesPerLayer = isCubeMap() ? 6 : 1;
|
||||
const uint32_t rangeScale = isCubeMap() && !_layered ? 6 : 1;
|
||||
const uint8_t firstMip = bx::min<uint8_t>(_firstMip, uint8_t(m_numMips - 1) );
|
||||
const uint8_t numMips = bx::min<uint8_t>(_numMips, uint8_t(m_numMips - firstMip) );
|
||||
const uint16_t numLayers0 = uint16_t(bx::max<uint32_t>(m_numLayers, 1) * facesPerLayer);
|
||||
const uint16_t firstLayer = bx::min<uint16_t>(_firstLayer, uint16_t(numLayers0 - 1) );
|
||||
const uint16_t numLayers = bx::min<uint16_t>(_numLayers, uint16_t(numLayers0 - firstLayer) );
|
||||
const uint16_t firstLayer = uint16_t(bx::min<uint32_t>(uint32_t(_firstLayer) * rangeScale, numLayers0 - 1) );
|
||||
const uint16_t numLayers = uint16_t(bx::min<uint32_t>(uint32_t(_numLayers) * rangeScale, numLayers0 - firstLayer) );
|
||||
|
||||
const bool fullRange = 0 == firstMip
|
||||
&& numMips >= m_numMips
|
||||
|
||||
+13
-5
@@ -4705,12 +4705,17 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
}
|
||||
}
|
||||
|
||||
const uint32_t totalLayers = uint32_t(ptr->arrayLength() * (TextureCube == m_type ? 6 : 1) );
|
||||
const bool isCube = TextureCube == m_type;
|
||||
const uint32_t rangeScale = isCube ? 6 : 1;
|
||||
const uint32_t totalUnits = uint32_t(ptr->arrayLength() );
|
||||
const uint32_t totalLayers = totalUnits * rangeScale;
|
||||
|
||||
const uint8_t firstMip = bx::min<uint8_t>(_firstMip, uint8_t(m_numMips - 1) );
|
||||
const uint8_t numMips = bx::min<uint8_t>(_numMips, uint8_t(m_numMips - firstMip) );
|
||||
const uint32_t firstLayer = bx::min<uint32_t>(_firstLayer, totalLayers - 1);
|
||||
const uint32_t numLayers = bx::min<uint32_t>(_numLayers, totalLayers - firstLayer);
|
||||
const uint32_t firstUnit = bx::min<uint32_t>(_firstLayer, totalUnits - 1);
|
||||
const uint32_t numUnits = bx::min<uint32_t>(_numLayers, totalUnits - firstUnit);
|
||||
const uint32_t firstLayer = firstUnit * rangeScale;
|
||||
const uint32_t numLayers = numUnits * rangeScale;
|
||||
|
||||
const bool fullRange = 0 == firstMip
|
||||
&& 0 == firstLayer
|
||||
@@ -4747,9 +4752,12 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
|
||||
MTL::TextureType type = ptr->textureType();
|
||||
|
||||
if (TextureCube == m_type)
|
||||
if (isCube)
|
||||
{
|
||||
type = (MTL::TextureType)MTL::TextureType2DArray;
|
||||
type = 1 == numUnits
|
||||
? (MTL::TextureType)MTL::TextureTypeCube
|
||||
: (MTL::TextureType)MTL::TextureTypeCubeArray
|
||||
;
|
||||
}
|
||||
else if (MTL::TextureType2DArray == type
|
||||
&& 1 == numLayers)
|
||||
|
||||
+11
-4
@@ -4068,8 +4068,12 @@ VK_IMPORT_DEVICE
|
||||
|
||||
_stencil = _stencil && !!(texture.m_aspectFlags & VK_IMAGE_ASPECT_STENCIL_BIT);
|
||||
|
||||
const uint32_t firstLayer = bx::min<uint32_t>(_firstLayer, texture.m_numSides);
|
||||
const uint32_t numLayers = bx::min<uint32_t>(_numLayers, texture.m_numSides - firstLayer);
|
||||
const uint32_t units = (VK_IMAGE_VIEW_TYPE_CUBE == _type || VK_IMAGE_VIEW_TYPE_CUBE_ARRAY == _type)
|
||||
? bx::max<uint32_t>(1, texture.m_numSides / 6)
|
||||
: texture.m_numSides
|
||||
;
|
||||
const uint32_t firstLayer = bx::min<uint32_t>(_firstLayer, units);
|
||||
const uint32_t numLayers = bx::min<uint32_t>(_numLayers, units - firstLayer);
|
||||
const uint32_t firstMip = bx::min<uint32_t>(_mip, texture.m_numMips);
|
||||
const uint32_t numMips = bx::min<uint32_t>(_numMips, texture.m_numMips - firstMip);
|
||||
|
||||
@@ -8018,10 +8022,13 @@ VK_DESTROY
|
||||
? VkComponentMapping{ VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY }
|
||||
: m_components
|
||||
;
|
||||
const bool cubeView = VK_IMAGE_VIEW_TYPE_CUBE == _type
|
||||
|| VK_IMAGE_VIEW_TYPE_CUBE_ARRAY == _type
|
||||
;
|
||||
viewInfo.subresourceRange.aspectMask = m_aspectFlags & _aspectMask;
|
||||
viewInfo.subresourceRange.baseMipLevel = _mip;
|
||||
viewInfo.subresourceRange.levelCount = _numMips;
|
||||
viewInfo.subresourceRange.baseArrayLayer = _layer;
|
||||
viewInfo.subresourceRange.baseArrayLayer = cubeView ? _layer * 6 : _layer;
|
||||
viewInfo.subresourceRange.layerCount = 1;
|
||||
|
||||
if (VK_IMAGE_VIEW_TYPE_2D != _type
|
||||
@@ -8029,7 +8036,7 @@ VK_DESTROY
|
||||
{
|
||||
viewInfo.subresourceRange.layerCount = VK_IMAGE_VIEW_TYPE_CUBE == _type
|
||||
? 6
|
||||
: _numLayers
|
||||
: cubeView ? _numLayers * 6 : _numLayers
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
+14
-1
@@ -5135,6 +5135,19 @@ WGPU_IMPORT
|
||||
arrayLayerCount = 1;
|
||||
}
|
||||
|
||||
uint32_t baseArrayLayer = _baseArrayLayer;
|
||||
|
||||
if (WGPUTextureViewDimension_Cube == tvd
|
||||
|| WGPUTextureViewDimension_CubeArray == tvd)
|
||||
{
|
||||
baseArrayLayer *= 6;
|
||||
|
||||
if (WGPU_ARRAY_LAYER_COUNT_UNDEFINED != arrayLayerCount)
|
||||
{
|
||||
arrayLayerCount *= 6;
|
||||
}
|
||||
}
|
||||
|
||||
WGPUTextureViewDescriptor textureViewDesc =
|
||||
{
|
||||
.nextInChain = NULL,
|
||||
@@ -5143,7 +5156,7 @@ WGPU_IMPORT
|
||||
.dimension = tvd,
|
||||
.baseMipLevel = _baseMipLevel,
|
||||
.mipLevelCount = UINT8_MAX == _mipLevelCount ? WGPU_MIP_LEVEL_COUNT_UNDEFINED : _mipLevelCount,
|
||||
.baseArrayLayer = _baseArrayLayer,
|
||||
.baseArrayLayer = baseArrayLayer,
|
||||
.arrayLayerCount = arrayLayerCount,
|
||||
.aspect = _stencil
|
||||
? WGPUTextureAspect_StencilOnly
|
||||
|
||||
@@ -235,6 +235,7 @@ namespace bgfx { namespace metal
|
||||
"BgfxISampler3D",
|
||||
"BgfxUSampler3D",
|
||||
"BgfxSamplerCube",
|
||||
"BgfxSamplerCubeArray",
|
||||
"BgfxSamplerCubeShadow",
|
||||
"BgfxSampler2DMS",
|
||||
};
|
||||
|
||||
@@ -338,6 +338,7 @@ namespace bgfx { namespace spirv
|
||||
"BgfxISampler3D",
|
||||
"BgfxUSampler3D",
|
||||
"BgfxSamplerCube",
|
||||
"BgfxSamplerCubeArray",
|
||||
"BgfxSamplerCubeShadow",
|
||||
"BgfxSampler2DMS",
|
||||
};
|
||||
|
||||
@@ -328,6 +328,7 @@ namespace bgfx { namespace wgsl
|
||||
"BgfxISampler3D",
|
||||
"BgfxUSampler3D",
|
||||
"BgfxSamplerCube",
|
||||
"BgfxSamplerCubeArray",
|
||||
"BgfxSamplerCubeShadow",
|
||||
"BgfxSampler2DMS",
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user