When using float2/int2/uint2 arrays the elements could be incorrectly alligned. This wasn't noticable when using Blender as it isn't used, However python addons and forks can use it. Fixes an issue with UPBGE Pull Request: https://projects.blender.org/blender/blender/pulls/139082
219 lines
5.2 KiB
C++
219 lines
5.2 KiB
C++
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
/** \file
|
|
* \ingroup gpu
|
|
*/
|
|
|
|
#include "vk_memory_layout.hh"
|
|
|
|
namespace blender::gpu {
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/** \name Std430 memory layout
|
|
* \{ */
|
|
|
|
uint32_t Std430::component_mem_size(const shader::Type /*type*/)
|
|
{
|
|
return 4;
|
|
}
|
|
|
|
uint32_t Std430::element_alignment(const shader::Type type, const bool /*is_array*/)
|
|
{
|
|
switch (type) {
|
|
case shader::Type::float_t:
|
|
case shader::Type::uint_t:
|
|
case shader::Type::int_t:
|
|
case shader::Type::bool_t:
|
|
return 4;
|
|
case shader::Type::float2_t:
|
|
case shader::Type::uint2_t:
|
|
case shader::Type::int2_t:
|
|
return 8;
|
|
case shader::Type::float3_t:
|
|
case shader::Type::uint3_t:
|
|
case shader::Type::int3_t:
|
|
case shader::Type::float4_t:
|
|
case shader::Type::uint4_t:
|
|
case shader::Type::int4_t:
|
|
case shader::Type::float3x3_t:
|
|
case shader::Type::float4x4_t:
|
|
return 16;
|
|
default:
|
|
BLI_assert_msg(false, "Type not supported in dynamic structs.");
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
uint32_t Std430::element_components_len(const shader::Type type)
|
|
{
|
|
switch (type) {
|
|
case shader::Type::float_t:
|
|
case shader::Type::uint_t:
|
|
case shader::Type::int_t:
|
|
case shader::Type::bool_t:
|
|
return 1;
|
|
case shader::Type::float2_t:
|
|
case shader::Type::uint2_t:
|
|
case shader::Type::int2_t:
|
|
return 2;
|
|
case shader::Type::float3_t:
|
|
case shader::Type::uint3_t:
|
|
case shader::Type::int3_t:
|
|
return 3;
|
|
case shader::Type::float4_t:
|
|
case shader::Type::uint4_t:
|
|
case shader::Type::int4_t:
|
|
return 4;
|
|
case shader::Type::float3x3_t:
|
|
return 12;
|
|
case shader::Type::float4x4_t:
|
|
return 16;
|
|
default:
|
|
BLI_assert_msg(false, "Type not supported in dynamic structs.");
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
uint32_t Std430::array_components_len(const shader::Type type)
|
|
{
|
|
switch (type) {
|
|
case shader::Type::float_t:
|
|
case shader::Type::uint_t:
|
|
case shader::Type::int_t:
|
|
case shader::Type::bool_t:
|
|
return 1;
|
|
case shader::Type::float2_t:
|
|
case shader::Type::uint2_t:
|
|
case shader::Type::int2_t:
|
|
return 2;
|
|
case shader::Type::float3_t:
|
|
case shader::Type::uint3_t:
|
|
case shader::Type::int3_t:
|
|
case shader::Type::float4_t:
|
|
case shader::Type::uint4_t:
|
|
case shader::Type::int4_t:
|
|
return 4;
|
|
case shader::Type::float3x3_t:
|
|
return 12;
|
|
case shader::Type::float4x4_t:
|
|
return 16;
|
|
default:
|
|
BLI_assert_msg(false, "Type not supported in dynamic structs.");
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
uint32_t Std430::inner_row_padding(const shader::Type type)
|
|
{
|
|
return type == shader::Type::float3x3_t ? 3 : 0;
|
|
}
|
|
|
|
/** \} */
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/** \name Std140 memory layout
|
|
* \{ */
|
|
|
|
uint32_t Std140::component_mem_size(const shader::Type /*type*/)
|
|
{
|
|
return 4;
|
|
}
|
|
|
|
uint32_t Std140::element_alignment(const shader::Type type, const bool is_array)
|
|
{
|
|
if (is_array) {
|
|
return 16;
|
|
}
|
|
switch (type) {
|
|
case shader::Type::float_t:
|
|
case shader::Type::uint_t:
|
|
case shader::Type::int_t:
|
|
case shader::Type::bool_t:
|
|
return 4;
|
|
case shader::Type::float2_t:
|
|
case shader::Type::uint2_t:
|
|
case shader::Type::int2_t:
|
|
return 8;
|
|
case shader::Type::float3_t:
|
|
case shader::Type::uint3_t:
|
|
case shader::Type::int3_t:
|
|
case shader::Type::float4_t:
|
|
case shader::Type::uint4_t:
|
|
case shader::Type::int4_t:
|
|
case shader::Type::float3x3_t:
|
|
case shader::Type::float4x4_t:
|
|
return 16;
|
|
default:
|
|
BLI_assert_msg(false, "Type not supported in dynamic structs.");
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
uint32_t Std140::element_components_len(const shader::Type type)
|
|
{
|
|
switch (type) {
|
|
case shader::Type::float_t:
|
|
case shader::Type::uint_t:
|
|
case shader::Type::int_t:
|
|
case shader::Type::bool_t:
|
|
return 1;
|
|
case shader::Type::float2_t:
|
|
case shader::Type::uint2_t:
|
|
case shader::Type::int2_t:
|
|
return 2;
|
|
case shader::Type::float3_t:
|
|
case shader::Type::uint3_t:
|
|
case shader::Type::int3_t:
|
|
return 3;
|
|
case shader::Type::float4_t:
|
|
case shader::Type::uint4_t:
|
|
case shader::Type::int4_t:
|
|
return 4;
|
|
case shader::Type::float3x3_t:
|
|
return 12;
|
|
case shader::Type::float4x4_t:
|
|
return 16;
|
|
default:
|
|
BLI_assert_msg(false, "Type not supported in dynamic structs.");
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
uint32_t Std140::array_components_len(const shader::Type type)
|
|
{
|
|
switch (type) {
|
|
case shader::Type::float_t:
|
|
case shader::Type::uint_t:
|
|
case shader::Type::int_t:
|
|
case shader::Type::bool_t:
|
|
case shader::Type::float2_t:
|
|
case shader::Type::uint2_t:
|
|
case shader::Type::int2_t:
|
|
case shader::Type::float3_t:
|
|
case shader::Type::uint3_t:
|
|
case shader::Type::int3_t:
|
|
case shader::Type::float4_t:
|
|
case shader::Type::uint4_t:
|
|
case shader::Type::int4_t:
|
|
return 4;
|
|
case shader::Type::float3x3_t:
|
|
return 12;
|
|
case shader::Type::float4x4_t:
|
|
return 16;
|
|
default:
|
|
BLI_assert_msg(false, "Type not supported in dynamic structs.");
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
uint32_t Std140::inner_row_padding(const shader::Type /*type*/)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
/** \} */
|
|
|
|
} // namespace blender::gpu
|