mirror of
https://github.com/godotengine/godot.git
synced 2025-10-20 00:13:30 +00:00
Align Vertex Buffer to 4 Bytes
With the octahedral compression, we had attributes of a size of 2 bytes which potentially caused performance regressions on iOS/Mac Now add padding to the normal/tangent buffer For octahedral, normal will always be oct32 encoded UNLESS tangent exists and is also compressed then both will be oct16 encoded and packed into a vec4<GL_BYTE> attribute
This commit is contained in:
parent
8db0bd4424
commit
f0de7ec2b6
5 changed files with 59 additions and 56 deletions
|
@ -491,7 +491,7 @@ Error VisualServer::_surface_set_data(Array p_arrays, uint32_t p_format, uint32_
|
|||
// setting vertices means regenerating the AABB
|
||||
|
||||
if (p_format & ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION) {
|
||||
if (p_format & ARRAY_COMPRESS_NORMAL) {
|
||||
if ((p_format & ARRAY_COMPRESS_NORMAL) && (p_format & ARRAY_FORMAT_TANGENT) && (p_format & ARRAY_COMPRESS_TANGENT)) {
|
||||
for (int i = 0; i < p_vertex_array_len; i++) {
|
||||
Vector2 res = norm_to_oct(src[i]);
|
||||
int8_t vector[2] = {
|
||||
|
@ -878,7 +878,10 @@ uint32_t VisualServer::mesh_surface_make_offsets_from_format(uint32_t p_format,
|
|||
} break;
|
||||
case VS::ARRAY_NORMAL: {
|
||||
if (p_format & ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION) {
|
||||
if (p_format & ARRAY_COMPRESS_NORMAL) {
|
||||
// normal will always be oct32 (4 byte) encoded
|
||||
// UNLESS tangent exists and is also compressed
|
||||
// then it will be oct16 encoded along with tangent
|
||||
if ((p_format & ARRAY_COMPRESS_NORMAL) && (p_format & ARRAY_FORMAT_TANGENT) && (p_format & ARRAY_COMPRESS_TANGENT)) {
|
||||
elem_size = sizeof(uint8_t) * 2;
|
||||
} else {
|
||||
elem_size = sizeof(uint16_t) * 2;
|
||||
|
@ -1083,7 +1086,10 @@ void VisualServer::mesh_add_surface_from_arrays(RID p_mesh, PrimitiveType p_prim
|
|||
} break;
|
||||
case VS::ARRAY_NORMAL: {
|
||||
if (p_compress_format & ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION) {
|
||||
if (p_compress_format & ARRAY_COMPRESS_NORMAL) {
|
||||
// normal will always be oct32 (4 byte) encoded
|
||||
// UNLESS tangent exists and is also compressed
|
||||
// then it will be oct16 encoded along with tangent
|
||||
if ((p_compress_format & ARRAY_COMPRESS_NORMAL) && (format & ARRAY_FORMAT_TANGENT) && (p_compress_format & ARRAY_COMPRESS_TANGENT)) {
|
||||
elem_size = sizeof(uint8_t) * 2;
|
||||
} else {
|
||||
elem_size = sizeof(uint16_t) * 2;
|
||||
|
@ -1286,7 +1292,10 @@ Array VisualServer::_get_array_from_surface(uint32_t p_format, PoolVector<uint8_
|
|||
} break;
|
||||
case VS::ARRAY_NORMAL: {
|
||||
if (p_format & ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION) {
|
||||
if (p_format & ARRAY_COMPRESS_NORMAL) {
|
||||
// normal will always be oct32 (4 byte) encoded
|
||||
// UNLESS tangent exists and is also compressed
|
||||
// then it will be oct16 encoded along with tangent
|
||||
if ((p_format & ARRAY_COMPRESS_NORMAL) && (p_format & ARRAY_FORMAT_TANGENT) && (p_format & ARRAY_COMPRESS_TANGENT)) {
|
||||
elem_size = sizeof(uint8_t) * 2;
|
||||
} else {
|
||||
elem_size = sizeof(uint16_t) * 2;
|
||||
|
@ -1443,7 +1452,7 @@ Array VisualServer::_get_array_from_surface(uint32_t p_format, PoolVector<uint8_
|
|||
arr.resize(p_vertex_len);
|
||||
|
||||
if (p_format & ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION) {
|
||||
if (p_format & ARRAY_COMPRESS_NORMAL) {
|
||||
if (p_format & ARRAY_COMPRESS_NORMAL && (p_format & ARRAY_FORMAT_TANGENT) && (p_format & ARRAY_COMPRESS_TANGENT)) {
|
||||
PoolVector<Vector3>::Write w = arr.write();
|
||||
|
||||
for (int j = 0; j < p_vertex_len; j++) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue