diff --git a/source/blender/gpu/GPU_vertex_format.hh b/source/blender/gpu/GPU_vertex_format.hh index bf58a0c9c85..a418cb87765 100644 --- a/source/blender/gpu/GPU_vertex_format.hh +++ b/source/blender/gpu/GPU_vertex_format.hh @@ -73,6 +73,35 @@ enum class VertAttrType : uint8_t { /* UFLOAT_9_9_9_EXP_5_(impl) Available on Metal (and maybe VK) but not on GL. */ GPU_VERTEX_FORMAT_EXPAND(DECLARE) +#undef DECLARE + +#define DECLARE(a, b, c, blender_enum, d, e, f, g, h) \ + blender_enum##_DEPRECATED = int(DataFormat::blender_enum), + +/* Deprecated formats. To be removed in 5.0. Needed for python shaders. */ +#define GPU_VERTEX_DEPRECATED_FORMAT_EXPAND(impl) \ + SNORM_8_(impl) \ + SNORM_8_8_(impl) \ + SNORM_8_8_8_(impl) \ + SNORM_16_(impl) \ + SNORM_16_16_16_(impl) \ + UNORM_8_(impl) \ + UNORM_8_8_(impl) \ + UNORM_8_8_8_(impl) \ + UNORM_16_(impl) \ + UNORM_16_16_16_(impl) \ + SINT_8_(impl) \ + SINT_8_8_(impl) \ + SINT_8_8_8_(impl) \ + SINT_16_(impl) \ + SINT_16_16_16_(impl) \ + UINT_8_(impl) \ + UINT_8_8_(impl) \ + UINT_8_8_8_(impl) \ + UINT_16_(impl) \ + UINT_16_16_16_(impl) + + GPU_VERTEX_DEPRECATED_FORMAT_EXPAND(DECLARE) #undef DECLARE }; diff --git a/source/blender/gpu/intern/gpu_vertex_format.cc b/source/blender/gpu/intern/gpu_vertex_format.cc index af7673f0c41..9f96d8d697e 100644 --- a/source/blender/gpu/intern/gpu_vertex_format.cc +++ b/source/blender/gpu/intern/gpu_vertex_format.cc @@ -42,12 +42,24 @@ static VertAttrType vertex_format_combine(GPUVertCompType component_type, switch (fetch_mode) { case GPU_FETCH_INT_TO_FLOAT_UNIT: switch (component_len) { + case 1: + return VertAttrType::SNORM_8_DEPRECATED; + case 2: + return VertAttrType::SNORM_8_8_DEPRECATED; + case 3: + return VertAttrType::SNORM_8_8_8_DEPRECATED; case 4: return VertAttrType::SNORM_8_8_8_8; } break; case GPU_FETCH_INT: switch (component_len) { + case 1: + return VertAttrType::SINT_8_DEPRECATED; + case 2: + return VertAttrType::SINT_8_8_DEPRECATED; + case 3: + return VertAttrType::SINT_8_8_8_DEPRECATED; case 4: return VertAttrType::SINT_8_8_8_8; } @@ -61,12 +73,24 @@ static VertAttrType vertex_format_combine(GPUVertCompType component_type, switch (fetch_mode) { case GPU_FETCH_INT_TO_FLOAT_UNIT: switch (component_len) { + case 1: + return VertAttrType::UNORM_8_DEPRECATED; + case 2: + return VertAttrType::UNORM_8_8_DEPRECATED; + case 3: + return VertAttrType::UNORM_8_8_8_DEPRECATED; case 4: return VertAttrType::UNORM_8_8_8_8; } break; case GPU_FETCH_INT: switch (component_len) { + case 1: + return VertAttrType::UINT_8_DEPRECATED; + case 2: + return VertAttrType::UINT_8_8_DEPRECATED; + case 3: + return VertAttrType::UINT_8_8_8_DEPRECATED; case 4: return VertAttrType::UINT_8_8_8_8; } @@ -80,16 +104,24 @@ static VertAttrType vertex_format_combine(GPUVertCompType component_type, switch (fetch_mode) { case GPU_FETCH_INT_TO_FLOAT_UNIT: switch (component_len) { + case 1: + return VertAttrType::SNORM_16_DEPRECATED; case 2: return VertAttrType::SNORM_16_16; + case 3: + return VertAttrType::SNORM_16_16_16_DEPRECATED; case 4: return VertAttrType::SNORM_16_16_16_16; } break; case GPU_FETCH_INT: switch (component_len) { + case 1: + return VertAttrType::SINT_16_DEPRECATED; case 2: return VertAttrType::SINT_16_16; + case 3: + return VertAttrType::SINT_16_16_16_DEPRECATED; case 4: return VertAttrType::SINT_16_16_16_16; } @@ -103,16 +135,24 @@ static VertAttrType vertex_format_combine(GPUVertCompType component_type, switch (fetch_mode) { case GPU_FETCH_INT_TO_FLOAT_UNIT: switch (component_len) { + case 1: + return VertAttrType::UNORM_16_DEPRECATED; case 2: return VertAttrType::UNORM_16_16; + case 3: + return VertAttrType::UNORM_16_16_16_DEPRECATED; case 4: return VertAttrType::UNORM_16_16_16_16; } break; case GPU_FETCH_INT: switch (component_len) { + case 1: + return VertAttrType::UINT_16_DEPRECATED; case 2: return VertAttrType::UINT_16_16; + case 3: + return VertAttrType::UINT_16_16_16_DEPRECATED; case 4: return VertAttrType::UINT_16_16_16_16; } diff --git a/source/blender/python/gpu/gpu_py_vertex_format.cc b/source/blender/python/gpu/gpu_py_vertex_format.cc index 5e90f3b3975..1a62842396b 100644 --- a/source/blender/python/gpu/gpu_py_vertex_format.cc +++ b/source/blender/python/gpu/gpu_py_vertex_format.cc @@ -63,6 +63,16 @@ static PyObject *pygpu_vertformat__tp_new(PyTypeObject * /*type*/, PyObject *arg return BPyGPUVertFormat_CreatePyObject(nullptr); } +static uint attr_size(GPUVertCompType type, int len) +{ + if (type == GPU_COMP_I10) { + return 4; /* Always packed as 10_10_10_2. */ + } + BLI_assert(type <= GPU_COMP_F32); /* Other types have irregular sizes (not bytes). */ + const uint sizes[] = {1, 1, 2, 2, 4, 4, 4}; + return len * sizes[type]; +} + PyDoc_STRVAR( /* Wrap. */ pygpu_vertformat_attr_add_doc, @@ -124,6 +134,21 @@ static PyObject *pygpu_vertformat_attr_add(BPyGPUVertFormat *self, PyObject *arg GPUVertCompType comp_type_enum = GPUVertCompType(comp_type.value_found); GPUVertFetchMode fetch_mode_enum = GPUVertFetchMode(fetch_mode.value_found); + if (len > 4) { + PyErr_WarnEx( + PyExc_DeprecationWarning, + "Using GPUVertFormat.attr_add(...) with component count greater than 4 is deprecated. " + "Use several attributes for each matrix columns instead.", + 1); + } + + if (attr_size(comp_type_enum, len) % 4 != 0) { + PyErr_WarnEx(PyExc_DeprecationWarning, + "Using GPUVertFormat.attr_add(...) with a format that is not 4 bytes aligned is " + "deprecated. Add padding components and/or higher precision integers.", + 1); + } + bool int_to_float = (int(fetch_mode_enum) == int(GPU_FETCH_INT_TO_FLOAT_DEPRECATED)); /* Fetch int to float is not supported anymore. * Simply store the data as float in the vertex buffer and convert inside `attr_fill`. */