Mesa (main): mesa: remove PADDING_64BIT by adding the dlist header into vbo_save_vertex_list
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Oct 29 08:01:51 UTC 2021
Module: Mesa
Branch: main
Commit: fa2c39df0fd25d7c57dfbe20c9e8189093046b6a
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=fa2c39df0fd25d7c57dfbe20c9e8189093046b6a
Author: Marek Olšák <marek.olsak at amd.com>
Date: Sat Oct 23 16:14:25 2021 -0400
mesa: remove PADDING_64BIT by adding the dlist header into vbo_save_vertex_list
Now we can put useful data where the padding was.
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13506>
---
src/mesa/main/dlist.c | 65 ++++++++-------------------------------------
src/mesa/main/dlist.h | 33 +++++++++++++++++++++++
src/mesa/vbo/vbo_save.h | 3 +++
src/mesa/vbo/vbo_save_api.c | 1 -
4 files changed, 47 insertions(+), 55 deletions(-)
diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c
index 6085c6d961a..86b7e3fa77f 100644
--- a/src/mesa/main/dlist.c
+++ b/src/mesa/main/dlist.c
@@ -643,51 +643,6 @@ typedef enum
OPCODE_END_OF_LIST
} OpCode;
-/* We want the vertex list payload to start at offset 8 on x86_64 because it
- * contains pointers. The header node has 4 bytes, so add 1 more node to get
- * 8 bytes.
- */
-#define PADDING_64BIT (sizeof(void*) == 8 ? 1 : 0)
-
-
-/**
- * Display list node.
- *
- * Display list instructions are stored as sequences of "nodes". Nodes
- * are allocated in blocks. Each block has BLOCK_SIZE nodes. Blocks
- * are linked together with a pointer.
- *
- * Each instruction in the display list is stored as a sequence of
- * contiguous nodes in memory.
- * Each node is the union of a variety of data types.
- *
- * Note, all of these members should be 4 bytes in size or less for the
- * sake of compact display lists. We store 8-byte pointers in a pair of
- * these nodes using the save/get_pointer() functions below.
- */
-union gl_dlist_node
-{
- struct {
-#if !DETECT_OS_WINDOWS
- OpCode opcode:16;
-#else
- /* sizeof(Node) is 8 with MSVC/mingw, so use an explicit 16 bits type. */
- uint16_t opcode;
-#endif
- uint16_t InstSize;
- };
- GLboolean b;
- GLbitfield bf;
- GLubyte ub;
- GLshort s;
- GLushort us;
- GLint i;
- GLuint ui;
- GLenum e;
- GLfloat f;
- GLsizei si;
-};
-
typedef union gl_dlist_node Node;
@@ -1387,7 +1342,7 @@ _mesa_delete_list(struct gl_context *ctx, struct gl_display_list *dlist)
case OPCODE_VERTEX_LIST:
case OPCODE_VERTEX_LIST_LOOPBACK:
case OPCODE_VERTEX_LIST_COPY_CURRENT:
- vbo_destroy_vertex_list(ctx, (struct vbo_save_vertex_list *) &n[1 + PADDING_64BIT]);
+ vbo_destroy_vertex_list(ctx, (struct vbo_save_vertex_list *) &n[0]);
break;
case OPCODE_CONTINUE:
n = (Node *) get_pointer(&n[1]);
@@ -1615,12 +1570,14 @@ _mesa_dlist_alloc_vertex_list(struct gl_context *ctx, bool copy_to_current)
Node *n = dlist_alloc(ctx,
copy_to_current ? OPCODE_VERTEX_LIST_COPY_CURRENT :
OPCODE_VERTEX_LIST,
- PADDING_64BIT * 4 + sizeof(struct vbo_save_vertex_list),
+ sizeof(struct vbo_save_vertex_list) - sizeof(Node),
true);
- if (n)
- return n + 1 + PADDING_64BIT; /* return pointer to payload area, after opcode */
- else
+ if (!n)
return NULL;
+
+ /* Clear all nodes except the header */
+ memset(n + 1, 0, sizeof(struct vbo_save_vertex_list) - sizeof(Node));
+ return n;
}
@@ -13385,15 +13342,15 @@ execute_list(struct gl_context *ctx, GLuint list)
n[5].f, n[6].f, n[7].f, n[8].f));
break;
case OPCODE_VERTEX_LIST:
- vbo_save_playback_vertex_list(ctx, &n[1 + PADDING_64BIT], false);
+ vbo_save_playback_vertex_list(ctx, &n[0], false);
break;
case OPCODE_VERTEX_LIST_COPY_CURRENT:
- vbo_save_playback_vertex_list(ctx, &n[1 + PADDING_64BIT], true);
+ vbo_save_playback_vertex_list(ctx, &n[0], true);
break;
case OPCODE_VERTEX_LIST_LOOPBACK:
- vbo_save_playback_vertex_list_loopback(ctx, &n[1 + PADDING_64BIT]);
+ vbo_save_playback_vertex_list_loopback(ctx, &n[0]);
break;
case OPCODE_CONTINUE:
@@ -14976,7 +14933,7 @@ print_list(struct gl_context *ctx, GLuint list, const char *fname)
case OPCODE_VERTEX_LIST:
case OPCODE_VERTEX_LIST_LOOPBACK:
case OPCODE_VERTEX_LIST_COPY_CURRENT:
- vbo_print_vertex_list(ctx, (struct vbo_save_vertex_list *) &n[1 + PADDING_64BIT], opcode, f);
+ vbo_print_vertex_list(ctx, (struct vbo_save_vertex_list *) &n[0], opcode, f);
break;
default:
if (opcode < 0 || opcode > OPCODE_END_OF_LIST) {
diff --git a/src/mesa/main/dlist.h b/src/mesa/main/dlist.h
index 6a7d418b4ca..a319124fd35 100644
--- a/src/mesa/main/dlist.h
+++ b/src/mesa/main/dlist.h
@@ -36,6 +36,39 @@
struct gl_context;
+/**
+ * Display list node.
+ *
+ * Display list instructions are stored as sequences of "nodes". Nodes
+ * are allocated in blocks. Each block has BLOCK_SIZE nodes. Blocks
+ * are linked together with a pointer.
+ *
+ * Each instruction in the display list is stored as a sequence of
+ * contiguous nodes in memory.
+ * Each node is the union of a variety of data types.
+ *
+ * Note, all of these members should be 4 bytes in size or less for the
+ * sake of compact display lists. We store 8-byte pointers in a pair of
+ * these nodes using the save/get_pointer() functions below.
+ */
+union gl_dlist_node
+{
+ struct {
+ uint16_t opcode; /* dlist.c : enum Opcode */
+ uint16_t InstSize;
+ };
+ GLboolean b;
+ GLbitfield bf;
+ GLubyte ub;
+ GLshort s;
+ GLushort us;
+ GLint i;
+ GLuint ui;
+ GLenum e;
+ GLfloat f;
+ GLsizei si;
+};
+
/**
* Describes the location and size of a glBitmap image in a texture atlas.
*/
diff --git a/src/mesa/vbo/vbo_save.h b/src/mesa/vbo/vbo_save.h
index 96ed597781d..eb9b0e392ab 100644
--- a/src/mesa/vbo/vbo_save.h
+++ b/src/mesa/vbo/vbo_save.h
@@ -34,6 +34,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#ifndef VBO_SAVE_H
#define VBO_SAVE_H
+#include "dlist.h"
#include "vbo.h"
#include "vbo_attrib.h"
@@ -53,6 +54,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
* compiled using the fallback opcode mechanism provided by dlist.c.
*/
struct vbo_save_vertex_list {
+ union gl_dlist_node header;
+
/* Data used in vbo_save_playback_vertex_list */
struct gl_vertex_array_object *VAO[VP_MODE_MAX];
diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c
index dbfe1650888..f0f5b827b47 100644
--- a/src/mesa/vbo/vbo_save_api.c
+++ b/src/mesa/vbo/vbo_save_api.c
@@ -526,7 +526,6 @@ compile_vertex_list(struct gl_context *ctx)
if (!node)
return;
- memset(node, 0, sizeof(struct vbo_save_vertex_list));
node->cold = calloc(1, sizeof(*node->cold));
/* Make sure the pointer is aligned to the size of a pointer */
More information about the mesa-commit
mailing list