Mesa (master): dlist: remove ListExt feature
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Apr 1 19:35:11 UTC 2021
Module: Mesa
Branch: master
Commit: bb108bdec7396a04670d8ef240b783b691a4e4c4
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=bb108bdec7396a04670d8ef240b783b691a4e4c4
Author: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Date: Tue Oct 20 21:08:37 2020 +0200
dlist: remove ListExt feature
This is only used by vbo_save_api so let's simplify the code and add a normal
opcode for this one.
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9533>
---
src/mesa/main/context.c | 3 -
src/mesa/main/dlist.c | 232 ++++++++++++++++----------------------------
src/mesa/main/dlist.h | 10 +-
src/mesa/main/mtypes.h | 2 -
src/mesa/vbo/vbo.h | 2 -
src/mesa/vbo/vbo_save_api.c | 60 +-----------
6 files changed, 87 insertions(+), 222 deletions(-)
diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
index 5c790a28e48..1189e50810d 100644
--- a/src/mesa/main/context.c
+++ b/src/mesa/main/context.c
@@ -1381,9 +1381,6 @@ _mesa_free_context_data(struct gl_context *ctx, bool destroy_debug_output)
/* Shared context state (display lists, textures, etc) */
_mesa_reference_shared_state(ctx, &ctx->Shared, NULL);
- /* needs to be after freeing shared state */
- _mesa_free_display_list_data(ctx);
-
if (destroy_debug_output)
_mesa_destroy_debug_output(ctx);
diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c
index aa63abba454..db504cd1346 100644
--- a/src/mesa/main/dlist.c
+++ b/src/mesa/main/dlist.c
@@ -71,40 +71,13 @@
#include "vbo/vbo.h"
#include "vbo/vbo_util.h"
+#include "vbo/vbo_save.h"
#include "util/format_r11g11b10f.h"
#include "util/u_memory.h"
#define USE_BITMAP_ATLAS 1
-
-
-/**
- * Other parts of Mesa (such as the VBO module) can plug into the display
- * list system. This structure describes new display list instructions.
- */
-struct gl_list_instruction
-{
- GLuint Size;
- void (*Execute)( struct gl_context *ctx, void *data );
- void (*Destroy)( struct gl_context *ctx, void *data );
- void (*Print)( struct gl_context *ctx, void *data, FILE *f );
-};
-
-
-#define MAX_DLIST_EXT_OPCODES 16
-
-/**
- * Used by device drivers to hook new commands into display lists.
- */
-struct gl_list_extensions
-{
- struct gl_list_instruction Opcode[MAX_DLIST_EXT_OPCODES];
- GLuint NumOpcodes;
-};
-
-
-
/**
* Flush vertices.
*
@@ -656,6 +629,8 @@ typedef enum
OPCODE_NAMED_PROGRAM_STRING,
OPCODE_NAMED_PROGRAM_LOCAL_PARAMETER,
+ OPCODE_VERTEX_LIST,
+
/* The following three are meta instructions */
OPCODE_ERROR, /* raise compiled-in error */
OPCODE_CONTINUE,
@@ -815,6 +790,53 @@ static GLuint InstSize[OPCODE_END_OF_LIST + 1];
void mesa_print_display_list(GLuint list);
+/**
+ * Called by display list code when a display list is being deleted.
+ */
+static void
+vbo_destroy_vertex_list(struct gl_context *ctx, struct vbo_save_vertex_list *node)
+{
+ for (gl_vertex_processing_mode vpm = VP_MODE_FF; vpm < VP_MODE_MAX; ++vpm)
+ _mesa_reference_vao(ctx, &node->VAO[vpm], NULL);
+
+ if (--node->prim_store->refcount == 0) {
+ free(node->prim_store->prims);
+ free(node->prim_store);
+ }
+
+ free(node->merged.prims);
+
+ _mesa_reference_buffer_object(ctx, &node->merged.ib.obj, NULL);
+ free(node->current_data);
+ node->current_data = NULL;
+}
+
+static void
+vbo_print_vertex_list(struct gl_context *ctx, struct vbo_save_vertex_list *node, FILE *f)
+{
+ GLuint i;
+ struct gl_buffer_object *buffer = node->VAO[0]->BufferBinding[0].BufferObj;
+ const GLuint vertex_size = _vbo_save_get_stride(node)/sizeof(GLfloat);
+ (void) ctx;
+
+ fprintf(f, "VBO-VERTEX-LIST, %u vertices, %d primitives, %d vertsize, "
+ "buffer %p\n",
+ node->vertex_count, node->prim_count, vertex_size,
+ buffer);
+
+ for (i = 0; i < node->prim_count; i++) {
+ struct _mesa_prim *prim = &node->prims[i];
+ fprintf(f, " prim %d: %s %d..%d %s %s\n",
+ i,
+ _mesa_lookup_prim_by_nr(prim->mode),
+ prim->start,
+ prim->start + prim->count,
+ (prim->begin) ? "BEGIN" : "(wrap)",
+ (prim->end) ? "END" : "(wrap)");
+ }
+}
+
+
/**
* Does the given display list only contain a single glBitmap call?
*/
@@ -1105,50 +1127,6 @@ _mesa_lookup_list(struct gl_context *ctx, GLuint list)
}
-/** Is the given opcode an extension code? */
-static inline GLboolean
-is_ext_opcode(OpCode opcode)
-{
- return (opcode >= OPCODE_EXT_0);
-}
-
-
-/** Destroy an extended opcode instruction */
-static GLint
-ext_opcode_destroy(struct gl_context *ctx, Node *node)
-{
- const GLint i = node[0].opcode - OPCODE_EXT_0;
- GLint step;
- ctx->ListExt->Opcode[i].Destroy(ctx, &node[1]);
- step = ctx->ListExt->Opcode[i].Size;
- return step;
-}
-
-
-/** Execute an extended opcode instruction */
-static GLint
-ext_opcode_execute(struct gl_context *ctx, Node *node)
-{
- const GLint i = node[0].opcode - OPCODE_EXT_0;
- GLint step;
- ctx->ListExt->Opcode[i].Execute(ctx, &node[1]);
- step = ctx->ListExt->Opcode[i].Size;
- return step;
-}
-
-
-/** Print an extended opcode instruction */
-static GLint
-ext_opcode_print(struct gl_context *ctx, Node *node, FILE *f)
-{
- const GLint i = node[0].opcode - OPCODE_EXT_0;
- GLint step;
- ctx->ListExt->Opcode[i].Print(ctx, &node[1], f);
- step = ctx->ListExt->Opcode[i].Size;
- return step;
-}
-
-
/**
* Delete the named display list, but don't remove from hash table.
* \param dlist - display list pointer
@@ -1169,12 +1147,7 @@ _mesa_delete_list(struct gl_context *ctx, struct gl_display_list *dlist)
while (1) {
const OpCode opcode = n[0].opcode;
- /* check for extension opcodes first */
- if (is_ext_opcode(opcode)) {
- n += ext_opcode_destroy(ctx, n);
- }
- else {
- switch (opcode) {
+ switch (opcode) {
/* for some commands, we need to free malloc'd memory */
case OPCODE_MAP1:
free(get_pointer(&n[6]));
@@ -1380,6 +1353,9 @@ _mesa_delete_list(struct gl_context *ctx, struct gl_display_list *dlist)
case OPCODE_NAMED_PROGRAM_STRING:
free(get_pointer(&n[5]));
break;
+ case OPCODE_VERTEX_LIST:
+ vbo_destroy_vertex_list(ctx, (struct vbo_save_vertex_list *) &n[1]);
+ break;
case OPCODE_CONTINUE:
n = (Node *) get_pointer(&n[1]);
free(block);
@@ -1393,11 +1369,10 @@ _mesa_delete_list(struct gl_context *ctx, struct gl_display_list *dlist)
default:
/* just increment 'n' pointer, below */
;
- }
-
- assert(InstSize[opcode] > 0);
- n += InstSize[opcode];
}
+
+ assert(InstSize[opcode] > 0);
+ n += InstSize[opcode];
}
}
@@ -1659,33 +1634,11 @@ _mesa_dlist_alloc_aligned(struct gl_context *ctx, GLuint opcode, GLuint bytes)
}
-/**
- * This function allows modules and drivers to get their own opcodes
- * for extending display list functionality.
- * \param ctx the rendering context
- * \param size number of bytes for storing the new display list command
- * \param execute function to execute the new display list command
- * \param destroy function to destroy the new display list command
- * \param print function to print the new display list command
- * \return the new opcode number or -1 if error
- */
-GLint
-_mesa_dlist_alloc_opcode(struct gl_context *ctx,
- GLuint size,
- void (*execute) (struct gl_context *, void *),
- void (*destroy) (struct gl_context *, void *),
- void (*print) (struct gl_context *, void *, FILE *))
+void *
+_mesa_dlist_alloc_vertex_list(struct gl_context *ctx)
{
- if (ctx->ListExt->NumOpcodes < MAX_DLIST_EXT_OPCODES) {
- const GLuint i = ctx->ListExt->NumOpcodes++;
- ctx->ListExt->Opcode[i].Size =
- 1 + (size + sizeof(Node) - 1) / sizeof(Node);
- ctx->ListExt->Opcode[i].Execute = execute;
- ctx->ListExt->Opcode[i].Destroy = destroy;
- ctx->ListExt->Opcode[i].Print = print;
- return i + OPCODE_EXT_0;
- }
- return -1;
+ return _mesa_dlist_alloc_aligned(ctx, OPCODE_VERTEX_LIST,
+ sizeof(struct vbo_save_vertex_list));
}
@@ -11283,11 +11236,7 @@ execute_list(struct gl_context *ctx, GLuint list)
while (1) {
const OpCode opcode = n[0].opcode;
- if (is_ext_opcode(opcode)) {
- n += ext_opcode_execute(ctx, n);
- }
- else {
- switch (opcode) {
+ switch (opcode) {
case OPCODE_ERROR:
_mesa_error(ctx, n[1].e, "%s", (const char *) get_pointer(&n[2]));
break;
@@ -13455,6 +13404,10 @@ execute_list(struct gl_context *ctx, GLuint list)
n[5].f, n[6].f, n[7].f));
break;
+ case OPCODE_VERTEX_LIST:
+ vbo_save_playback_vertex_list(ctx, &n[1]);
+ break;
+
case OPCODE_CONTINUE:
n = (Node *) get_pointer(&n[1]);
continue;
@@ -13473,12 +13426,11 @@ execute_list(struct gl_context *ctx, GLuint list)
vbo_save_EndCallList(ctx);
ctx->ListState.CallDepth--;
return;
- }
-
- /* increment n to point to next compiled command */
- assert(InstSize[opcode] > 0);
- n += InstSize[opcode];
}
+
+ /* increment n to point to next compiled command */
+ assert(InstSize[opcode] > 0);
+ n += InstSize[opcode];
}
}
@@ -14632,11 +14584,7 @@ print_list(struct gl_context *ctx, GLuint list, const char *fname)
while (1) {
const OpCode opcode = n[0].opcode;
- if (is_ext_opcode(opcode)) {
- n += ext_opcode_print(ctx, n, f);
- }
- else {
- switch (opcode) {
+ switch (opcode) {
case OPCODE_ACCUM:
fprintf(f, "Accum %s %g\n", enum_string(n[1].e), n[2].f);
break;
@@ -14880,6 +14828,9 @@ print_list(struct gl_context *ctx, GLuint list, const char *fname)
case OPCODE_NOP:
fprintf(f, "NOP\n");
break;
+ case OPCODE_VERTEX_LIST:
+ vbo_print_vertex_list(ctx, (struct vbo_save_vertex_list *) &n[1], f);
+ break;
default:
if (opcode < 0 || opcode > OPCODE_END_OF_LIST) {
printf
@@ -14897,12 +14848,11 @@ print_list(struct gl_context *ctx, GLuint list, const char *fname)
if (fname)
fclose(f);
return;
- }
-
- /* increment n to point to next compiled command */
- assert(InstSize[opcode] > 0);
- n += InstSize[opcode];
}
+
+ /* increment n to point to next compiled command */
+ assert(InstSize[opcode] > 0);
+ n += InstSize[opcode];
}
}
@@ -14924,10 +14874,7 @@ _mesa_glthread_execute_list(struct gl_context *ctx, GLuint list)
while (1) {
const OpCode opcode = n[0].opcode;
- if (is_ext_opcode(opcode)) {
- n += ctx->ListExt->Opcode[n[0].opcode - OPCODE_EXT_0].Size;
- } else {
- switch (opcode) {
+ switch (opcode) {
case OPCODE_CALL_LIST:
/* Generated by glCallList(), don't add ListBase */
if (ctx->GLThread.ListCallDepth < MAX_LIST_NESTING)
@@ -14979,12 +14926,11 @@ _mesa_glthread_execute_list(struct gl_context *ctx, GLuint list)
default:
/* ignore */
break;
- }
-
- /* increment n to point to next compiled command */
- assert(InstSize[opcode] > 0);
- n += InstSize[opcode];
}
+
+ /* increment n to point to next compiled command */
+ assert(InstSize[opcode] > 0);
+ n += InstSize[opcode];
}
}
@@ -15030,9 +14976,6 @@ _mesa_init_display_list(struct gl_context *ctx)
tableInitialized = GL_TRUE;
}
- /* extension info */
- ctx->ListExt = CALLOC_STRUCT(gl_list_extensions);
-
/* Display list */
ctx->ListState.CallDepth = 0;
ctx->ExecuteFlag = GL_TRUE;
@@ -15044,6 +14987,7 @@ _mesa_init_display_list(struct gl_context *ctx)
ctx->List.ListBase = 0;
InstSize[OPCODE_NOP] = 1;
+ InstSize[OPCODE_VERTEX_LIST] = 1 + align(sizeof(struct vbo_save_vertex_list), sizeof(Node)) / sizeof(Node);
#define NAME_AE(x) _ae_##x
#define NAME_CALLLIST(x) save_##x
@@ -15052,11 +14996,3 @@ _mesa_init_display_list(struct gl_context *ctx)
#include "vbo/vbo_init_tmp.h"
}
-
-
-void
-_mesa_free_display_list_data(struct gl_context *ctx)
-{
- free(ctx->ListExt);
- ctx->ListExt = NULL;
-}
diff --git a/src/mesa/main/dlist.h b/src/mesa/main/dlist.h
index 8fa09a7aec2..52aa9a3da7a 100644
--- a/src/mesa/main/dlist.h
+++ b/src/mesa/main/dlist.h
@@ -111,11 +111,8 @@ _mesa_dlist_alloc(struct gl_context *ctx, GLuint opcode, GLuint sz);
void *
_mesa_dlist_alloc_aligned(struct gl_context *ctx, GLuint opcode, GLuint bytes);
-GLint
-_mesa_dlist_alloc_opcode(struct gl_context *ctx, GLuint sz,
- void (*execute)(struct gl_context *, void *),
- void (*destroy)(struct gl_context *, void *),
- void (*print)(struct gl_context *, void *, FILE *));
+void *
+_mesa_dlist_alloc_vertex_list(struct gl_context *ctx);
void
_mesa_delete_list(struct gl_context *ctx, struct gl_display_list *dlist);
@@ -130,9 +127,6 @@ _mesa_install_dlist_vtxfmt(struct _glapi_table *disp,
void
_mesa_init_display_list(struct gl_context * ctx);
-void
-_mesa_free_display_list_data(struct gl_context *ctx);
-
bool
_mesa_get_list(struct gl_context *ctx, GLuint list,
struct gl_display_list **dlist);
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 38f2acfcc9b..5478b9220c7 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -5461,8 +5461,6 @@ struct gl_context
GLuint TextureStateTimestamp; /**< detect changes to shared state */
- struct gl_list_extensions *ListExt; /**< driver dlist extensions */
-
/** \name For debugging/development only */
/*@{*/
GLboolean FirstTimeCurrent;
diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h
index e946fd5356a..9ac0d5e3c84 100644
--- a/src/mesa/vbo/vbo.h
+++ b/src/mesa/vbo/vbo.h
@@ -189,8 +189,6 @@ struct vbo_save_context {
GLuint max_vert;
GLboolean dangling_attr_ref;
- GLuint opcode_vertex_list;
-
struct vbo_save_copied_vtx copied;
fi_type *current[VBO_ATTRIB_MAX]; /* points into ctx->ListState */
diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c
index b5d7d670f91..854daefe90a 100644
--- a/src/mesa/vbo/vbo_save_api.c
+++ b/src/mesa/vbo/vbo_save_api.c
@@ -529,7 +529,7 @@ compile_vertex_list(struct gl_context *ctx)
* being compiled.
*/
node = (struct vbo_save_vertex_list *)
- _mesa_dlist_alloc_aligned(ctx, save->opcode_vertex_list, sizeof(*node));
+ _mesa_dlist_alloc_vertex_list(ctx);
if (!node)
return;
@@ -1922,57 +1922,6 @@ vbo_save_EndCallList(struct gl_context *ctx)
}
-/**
- * Called by display list code when a display list is being deleted.
- */
-static void
-vbo_destroy_vertex_list(struct gl_context *ctx, void *data)
-{
- struct vbo_save_vertex_list *node = (struct vbo_save_vertex_list *) data;
-
- for (gl_vertex_processing_mode vpm = VP_MODE_FF; vpm < VP_MODE_MAX; ++vpm)
- _mesa_reference_vao(ctx, &node->VAO[vpm], NULL);
-
- if (--node->prim_store->refcount == 0) {
- free(node->prim_store->prims);
- free(node->prim_store);
- }
-
- free(node->merged.prims);
-
- _mesa_reference_buffer_object(ctx, &node->merged.ib.obj, NULL);
- free(node->current_data);
- node->current_data = NULL;
-}
-
-
-static void
-vbo_print_vertex_list(struct gl_context *ctx, void *data, FILE *f)
-{
- struct vbo_save_vertex_list *node = (struct vbo_save_vertex_list *) data;
- GLuint i;
- struct gl_buffer_object *buffer = node->VAO[0]->BufferBinding[0].BufferObj;
- const GLuint vertex_size = _vbo_save_get_stride(node)/sizeof(GLfloat);
- (void) ctx;
-
- fprintf(f, "VBO-VERTEX-LIST, %u vertices, %d primitives, %d vertsize, "
- "buffer %p\n",
- node->vertex_count, node->prim_count, vertex_size,
- buffer);
-
- for (i = 0; i < node->prim_count; i++) {
- struct _mesa_prim *prim = &node->prims[i];
- fprintf(f, " prim %d: %s %d..%d %s %s\n",
- i,
- _mesa_lookup_prim_by_nr(prim->mode),
- prim->start,
- prim->start + prim->count,
- (prim->begin) ? "BEGIN" : "(wrap)",
- (prim->end) ? "END" : "(wrap)");
- }
-}
-
-
/**
* Called during context creation/init.
*/
@@ -2006,13 +1955,6 @@ vbo_save_api_init(struct vbo_save_context *save)
{
struct gl_context *ctx = gl_context_from_vbo_save(save);
- save->opcode_vertex_list =
- _mesa_dlist_alloc_opcode(ctx,
- sizeof(struct vbo_save_vertex_list),
- vbo_save_playback_vertex_list,
- vbo_destroy_vertex_list,
- vbo_print_vertex_list);
-
vtxfmt_init(ctx);
current_init(ctx);
_mesa_noop_vtxfmt_init(ctx, &save->vtxfmt_noop);
More information about the mesa-commit
mailing list