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@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9533>
This commit is contained in:

committed by
Marge Bot

parent
89b6d70c1c
commit
bb108bdec7
@@ -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);
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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 */
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user