Mesa (main): mesa/st: merge framebuffer objects from st to mesa
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Jan 24 21:35:11 UTC 2022
Module: Mesa
Branch: main
Commit: 7645e24045b124ba2b59d481f415f004ba306b25
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7645e24045b124ba2b59d481f415f004ba306b25
Author: Dave Airlie <airlied at redhat.com>
Date: Mon Dec 20 16:56:41 2021 +1000
mesa/st: merge framebuffer objects from st to mesa
Reviewed-by: Kristian H. Kristensen <hoegsberg at google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14675>
---
src/mesa/main/mtypes.h | 12 ++++
src/mesa/state_tracker/st_cb_fbo.h | 6 +-
src/mesa/state_tracker/st_cb_viewport.c | 4 +-
src/mesa/state_tracker/st_context.c | 5 +-
src/mesa/state_tracker/st_context.h | 19 ------
src/mesa/state_tracker/st_manager.c | 109 ++++++++++++++------------------
src/mesa/state_tracker/st_manager.h | 4 --
7 files changed, 69 insertions(+), 90 deletions(-)
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 120227bc9f6..a5adc7facb2 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -60,6 +60,8 @@
#include "pipe/p_state.h"
+#include "frontend/api.h"
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -2731,6 +2733,16 @@ struct gl_framebuffer
/** Delete this framebuffer */
void (*Delete)(struct gl_framebuffer *fb);
+
+ struct st_framebuffer_iface *iface;
+ enum st_attachment_type statts[ST_ATTACHMENT_COUNT];
+ unsigned num_statts;
+ int32_t stamp;
+ int32_t iface_stamp;
+ uint32_t iface_ID;
+
+ /* list of framebuffer objects */
+ struct list_head head;
};
/**
diff --git a/src/mesa/state_tracker/st_cb_fbo.h b/src/mesa/state_tracker/st_cb_fbo.h
index 7415243605d..c4a6c63c912 100644
--- a/src/mesa/state_tracker/st_cb_fbo.h
+++ b/src/mesa/state_tracker/st_cb_fbo.h
@@ -46,18 +46,18 @@ st_get_renderbuffer_resource(struct gl_renderbuffer *rb)
}
/**
- * Cast wrapper to convert a struct gl_framebuffer to an st_framebuffer.
+ * Cast wrapper to convert a struct gl_framebuffer to an gl_framebuffer.
* Return NULL if the struct gl_framebuffer is a user-created framebuffer.
* We'll only return non-null for window system framebuffers.
* Note that this function may fail.
*/
-static inline struct st_framebuffer *
+static inline struct gl_framebuffer *
st_ws_framebuffer(struct gl_framebuffer *fb)
{
/* FBO cannot be casted. See st_new_framebuffer */
if (fb && _mesa_is_winsys_fbo(fb) &&
fb != _mesa_get_incomplete_framebuffer())
- return (struct st_framebuffer *) fb;
+ return fb;
return NULL;
}
diff --git a/src/mesa/state_tracker/st_cb_viewport.c b/src/mesa/state_tracker/st_cb_viewport.c
index b4596ab0fc3..0a53c0e8414 100644
--- a/src/mesa/state_tracker/st_cb_viewport.c
+++ b/src/mesa/state_tracker/st_cb_viewport.c
@@ -37,8 +37,8 @@
void st_viewport(struct gl_context *ctx)
{
struct st_context *st = ctx->st;
- struct st_framebuffer *stdraw;
- struct st_framebuffer *stread;
+ struct gl_framebuffer *stdraw;
+ struct gl_framebuffer *stread;
if (!st->invalidate_on_gl_viewport)
return;
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index c70551a815f..524e1f8028d 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -29,6 +29,7 @@
#include "main/accum.h"
#include "main/context.h"
#include "main/debug_output.h"
+#include "main/framebuffer.h"
#include "main/glthread.h"
#include "main/shaderobj.h"
#include "main/state.h"
@@ -932,7 +933,7 @@ void
st_destroy_context(struct st_context *st)
{
struct gl_context *ctx = st->ctx;
- struct st_framebuffer *stfb, *next;
+ struct gl_framebuffer *stfb, *next;
struct gl_framebuffer *save_drawbuffer;
struct gl_framebuffer *save_readbuffer;
@@ -982,7 +983,7 @@ st_destroy_context(struct st_context *st)
/* release framebuffer in the winsys buffers list */
LIST_FOR_EACH_ENTRY_SAFE_REV(stfb, next, &st->winsys_buffers, head) {
- st_framebuffer_reference(&stfb, NULL);
+ _mesa_reference_framebuffer(&stfb, NULL);
}
_mesa_HashWalk(ctx->Shared->FrameBuffers, destroy_framebuffer_attachment_sampler_cb, st);
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index 91bdc49f4f2..90651108f70 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -431,25 +431,6 @@ const struct nir_shader_compiler_options *
st_get_nir_compiler_options(struct st_context *st, gl_shader_stage stage);
-/**
- * Wrapper for struct gl_framebuffer.
- * This is an opaque type to the outside world.
- */
-struct st_framebuffer
-{
- struct gl_framebuffer Base;
-
- struct st_framebuffer_iface *iface;
- enum st_attachment_type statts[ST_ATTACHMENT_COUNT];
- unsigned num_statts;
- int32_t stamp;
- int32_t iface_stamp;
- uint32_t iface_ID;
-
- /* list of framebuffer objects */
- struct list_head head;
-};
-
void st_invalidate_state(struct gl_context *ctx);
void st_set_background_context(struct gl_context *ctx,
struct util_queue_monitoring *queue_info);
diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
index d49b1c7e377..7a82e2c029f 100644
--- a/src/mesa/state_tracker/st_manager.c
+++ b/src/mesa/state_tracker/st_manager.c
@@ -29,6 +29,7 @@
#include "main/extensions.h"
#include "main/context.h"
#include "main/debug_output.h"
+#include "main/framebuffer.h"
#include "main/glthread.h"
#include "main/texobj.h"
#include "main/teximage.h"
@@ -150,23 +151,23 @@ buffer_index_to_attachment(gl_buffer_index index)
*/
static void
st_context_validate(struct st_context *st,
- struct st_framebuffer *stdraw,
- struct st_framebuffer *stread)
+ struct gl_framebuffer *stdraw,
+ struct gl_framebuffer *stread)
{
if (stdraw && stdraw->stamp != st->draw_stamp) {
st->dirty |= ST_NEW_FRAMEBUFFER;
- _mesa_resize_framebuffer(st->ctx, &stdraw->Base,
- stdraw->Base.Width,
- stdraw->Base.Height);
+ _mesa_resize_framebuffer(st->ctx, stdraw,
+ stdraw->Width,
+ stdraw->Height);
st->draw_stamp = stdraw->stamp;
}
if (stread && stread->stamp != st->read_stamp) {
if (stread != stdraw) {
st->dirty |= ST_NEW_FRAMEBUFFER;
- _mesa_resize_framebuffer(st->ctx, &stread->Base,
- stread->Base.Width,
- stread->Base.Height);
+ _mesa_resize_framebuffer(st->ctx, stread,
+ stread->Width,
+ stread->Height);
}
st->read_stamp = stread->stamp;
}
@@ -202,7 +203,7 @@ st_set_ws_renderbuffer_surface(struct gl_renderbuffer *rb,
* context).
*/
static void
-st_framebuffer_validate(struct st_framebuffer *stfb,
+st_framebuffer_validate(struct gl_framebuffer *stfb,
struct st_context *st)
{
struct pipe_resource *textures[ST_ATTACHMENT_COUNT];
@@ -227,8 +228,8 @@ st_framebuffer_validate(struct st_framebuffer *stfb,
new_stamp = p_atomic_read(&stfb->iface->stamp);
} while(stfb->iface_stamp != new_stamp);
- width = stfb->Base.Width;
- height = stfb->Base.Height;
+ width = stfb->Width;
+ height = stfb->Height;
for (i = 0; i < stfb->num_statts; i++) {
struct gl_renderbuffer *rb;
@@ -244,7 +245,7 @@ st_framebuffer_validate(struct st_framebuffer *stfb,
continue;
}
- rb = stfb->Base.Attachment[idx].Renderbuffer;
+ rb = stfb->Attachment[idx].Renderbuffer;
assert(rb);
if (rb->texture == textures[i]) {
pipe_resource_reference(&textures[i], NULL);
@@ -268,7 +269,7 @@ st_framebuffer_validate(struct st_framebuffer *stfb,
if (changed) {
++stfb->stamp;
- _mesa_resize_framebuffer(st->ctx, &stfb->Base, width, height);
+ _mesa_resize_framebuffer(st->ctx, stfb, width, height);
}
}
@@ -277,7 +278,7 @@ st_framebuffer_validate(struct st_framebuffer *stfb,
* Update the attachments to validate by looping the existing renderbuffers.
*/
static void
-st_framebuffer_update_attachments(struct st_framebuffer *stfb)
+st_framebuffer_update_attachments(struct gl_framebuffer *stfb)
{
gl_buffer_index idx;
@@ -290,7 +291,7 @@ st_framebuffer_update_attachments(struct st_framebuffer *stfb)
struct gl_renderbuffer *rb;
enum st_attachment_type statt;
- rb = stfb->Base.Attachment[idx].Renderbuffer;
+ rb = stfb->Attachment[idx].Renderbuffer;
if (!rb || rb->software)
continue;
@@ -308,14 +309,14 @@ st_framebuffer_update_attachments(struct st_framebuffer *stfb)
* corresponds to a window and is not a user-created FBO.
*/
static bool
-st_framebuffer_add_renderbuffer(struct st_framebuffer *stfb,
+st_framebuffer_add_renderbuffer(struct gl_framebuffer *stfb,
gl_buffer_index idx, bool prefer_srgb)
{
struct gl_renderbuffer *rb;
enum pipe_format format;
bool sw;
- assert(_mesa_is_winsys_fbo(&stfb->Base));
+ assert(_mesa_is_winsys_fbo(stfb));
/* do not distinguish depth/stencil buffers */
if (idx == BUFFER_STENCIL)
@@ -346,21 +347,21 @@ st_framebuffer_add_renderbuffer(struct st_framebuffer *stfb,
return false;
if (idx != BUFFER_DEPTH) {
- _mesa_attach_and_own_rb(&stfb->Base, idx, rb);
+ _mesa_attach_and_own_rb(stfb, idx, rb);
return true;
}
bool rb_ownership_taken = false;
if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 0)) {
- _mesa_attach_and_own_rb(&stfb->Base, BUFFER_DEPTH, rb);
+ _mesa_attach_and_own_rb(stfb, BUFFER_DEPTH, rb);
rb_ownership_taken = true;
}
if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1)) {
if (rb_ownership_taken)
- _mesa_attach_and_reference_rb(&stfb->Base, BUFFER_STENCIL, rb);
+ _mesa_attach_and_reference_rb(stfb, BUFFER_STENCIL, rb);
else
- _mesa_attach_and_own_rb(&stfb->Base, BUFFER_STENCIL, rb);
+ _mesa_attach_and_own_rb(stfb, BUFFER_STENCIL, rb);
}
return true;
@@ -435,11 +436,11 @@ st_visual_to_context_mode(const struct st_visual *visual,
/**
* Create a framebuffer from a manager interface.
*/
-static struct st_framebuffer *
+static struct gl_framebuffer *
st_framebuffer_create(struct st_context *st,
struct st_framebuffer_iface *stfbi)
{
- struct st_framebuffer *stfb;
+ struct gl_framebuffer *stfb;
struct gl_config mode;
gl_buffer_index idx;
bool prefer_srgb = false;
@@ -447,7 +448,7 @@ st_framebuffer_create(struct st_context *st,
if (!stfbi)
return NULL;
- stfb = CALLOC_STRUCT(st_framebuffer);
+ stfb = CALLOC_STRUCT(gl_framebuffer);
if (!stfb)
return NULL;
@@ -493,14 +494,14 @@ st_framebuffer_create(struct st_context *st,
}
}
- _mesa_initialize_window_framebuffer(&stfb->Base, &mode);
+ _mesa_initialize_window_framebuffer(stfb, &mode);
stfb->iface = stfbi;
stfb->iface_ID = stfbi->ID;
stfb->iface_stamp = p_atomic_read(&stfbi->stamp) - 1;
/* add the color buffer */
- idx = stfb->Base._ColorDrawBufferIndexes[0];
+ idx = stfb->_ColorDrawBufferIndexes[0];
if (!st_framebuffer_add_renderbuffer(stfb, idx, prefer_srgb)) {
FREE(stfb);
return NULL;
@@ -516,18 +517,6 @@ st_framebuffer_create(struct st_context *st,
}
-/**
- * Reference a framebuffer.
- */
-void
-st_framebuffer_reference(struct st_framebuffer **ptr,
- struct st_framebuffer *stfb)
-{
- struct gl_framebuffer *fb = stfb ? &stfb->Base : NULL;
- _mesa_reference_framebuffer((struct gl_framebuffer **) ptr, fb);
-}
-
-
static uint32_t
st_framebuffer_iface_hash(const void *key)
{
@@ -627,7 +616,7 @@ st_framebuffers_purge(struct st_context *st)
{
struct st_context_iface *st_iface = &st->iface;
struct st_manager *smapi = st_iface->state_manager;
- struct st_framebuffer *stfb, *next;
+ struct gl_framebuffer *stfb, *next;
assert(smapi);
@@ -644,7 +633,7 @@ st_framebuffers_purge(struct st_context *st)
*/
if (!st_framebuffer_iface_lookup(smapi, stfbi)) {
list_del(&stfb->head);
- st_framebuffer_reference(&stfb, NULL);
+ _mesa_reference_framebuffer(&stfb, NULL);
}
}
}
@@ -1023,12 +1012,12 @@ st_api_get_current(struct st_api *stapi)
}
-static struct st_framebuffer *
+static struct gl_framebuffer *
st_framebuffer_reuse_or_create(struct st_context *st,
struct gl_framebuffer *fb,
struct st_framebuffer_iface *stfbi)
{
- struct st_framebuffer *cur = NULL, *stfb = NULL;
+ struct gl_framebuffer *cur = NULL, *stfb = NULL;
if (!stfbi)
return NULL;
@@ -1038,7 +1027,7 @@ st_framebuffer_reuse_or_create(struct st_context *st,
*/
LIST_FOR_EACH_ENTRY(cur, &st->winsys_buffers, head) {
if (cur->iface_ID == stfbi->ID) {
- st_framebuffer_reference(&stfb, cur);
+ _mesa_reference_framebuffer(&stfb, cur);
break;
}
}
@@ -1052,14 +1041,14 @@ st_framebuffer_reuse_or_create(struct st_context *st,
* the framebuffer interface object hash table.
*/
if (!st_framebuffer_iface_insert(stfbi->state_manager, stfbi)) {
- st_framebuffer_reference(&cur, NULL);
+ _mesa_reference_framebuffer(&cur, NULL);
return NULL;
}
/* add to the context's winsys buffers list */
list_add(&cur->head, &st->winsys_buffers);
- st_framebuffer_reference(&stfb, cur);
+ _mesa_reference_framebuffer(&stfb, cur);
}
}
@@ -1073,7 +1062,7 @@ st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi,
struct st_framebuffer_iface *streadi)
{
struct st_context *st = (struct st_context *) stctxi;
- struct st_framebuffer *stdraw, *stread;
+ struct gl_framebuffer *stdraw, *stread;
bool ret;
if (st) {
@@ -1089,7 +1078,7 @@ st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi,
stread = NULL;
/* reuse the draw fb for the read fb */
if (stdraw)
- st_framebuffer_reference(&stread, stdraw);
+ _mesa_reference_framebuffer(&stread, stdraw);
}
/* If framebuffers were asked for, we'd better have allocated them */
@@ -1101,7 +1090,7 @@ st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi,
if (stread != stdraw)
st_framebuffer_validate(stread, st);
- ret = _mesa_make_current(st->ctx, &stdraw->Base, &stread->Base);
+ ret = _mesa_make_current(st->ctx, stdraw, stread);
st->draw_stamp = stdraw->stamp - 1;
st->read_stamp = stread->stamp - 1;
@@ -1112,8 +1101,8 @@ st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi,
ret = _mesa_make_current(st->ctx, incomplete, incomplete);
}
- st_framebuffer_reference(&stdraw, NULL);
- st_framebuffer_reference(&stread, NULL);
+ _mesa_reference_framebuffer(&stdraw, NULL);
+ _mesa_reference_framebuffer(&stread, NULL);
/* Purge the context's winsys_buffers list in case any
* of the referenced drawables no longer exist.
@@ -1152,7 +1141,7 @@ st_api_destroy(struct st_api *stapi)
void
st_manager_flush_frontbuffer(struct st_context *st)
{
- struct st_framebuffer *stfb = st_ws_framebuffer(st->ctx->DrawBuffer);
+ struct gl_framebuffer *stfb = st_ws_framebuffer(st->ctx->DrawBuffer);
struct gl_renderbuffer *rb = NULL;
if (!stfb)
@@ -1163,16 +1152,16 @@ st_manager_flush_frontbuffer(struct st_context *st)
* flushing.
*/
if (st->ctx->Visual.doubleBufferMode &&
- !stfb->Base.Visual.doubleBufferMode)
+ !stfb->Visual.doubleBufferMode)
return;
/* Check front buffer used at the GL API level. */
enum st_attachment_type statt = ST_ATTACHMENT_FRONT_LEFT;
- rb = stfb->Base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer;
+ rb = stfb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer;
if (!rb) {
/* Check back buffer redirected by EGL_KHR_mutable_render_buffer. */
statt = ST_ATTACHMENT_BACK_LEFT;
- rb = stfb->Base.Attachment[BUFFER_BACK_LEFT].Renderbuffer;
+ rb = stfb->Attachment[BUFFER_BACK_LEFT].Renderbuffer;
}
/* Do we have a front color buffer and has it been drawn to since last
@@ -1194,8 +1183,8 @@ st_manager_flush_frontbuffer(struct st_context *st)
void
st_manager_validate_framebuffers(struct st_context *st)
{
- struct st_framebuffer *stdraw = st_ws_framebuffer(st->ctx->DrawBuffer);
- struct st_framebuffer *stread = st_ws_framebuffer(st->ctx->ReadBuffer);
+ struct gl_framebuffer *stdraw = st_ws_framebuffer(st->ctx->DrawBuffer);
+ struct gl_framebuffer *stread = st_ws_framebuffer(st->ctx->ReadBuffer);
if (stdraw)
st_framebuffer_validate(stdraw, st);
@@ -1214,7 +1203,7 @@ st_manager_flush_swapbuffers(void)
{
GET_CURRENT_CONTEXT(ctx);
struct st_context *st = (ctx) ? ctx->st : NULL;
- struct st_framebuffer *stfb;
+ struct gl_framebuffer *stfb;
if (!st)
return;
@@ -1236,7 +1225,7 @@ st_manager_add_color_renderbuffer(struct st_context *st,
struct gl_framebuffer *fb,
gl_buffer_index idx)
{
- struct st_framebuffer *stfb = st_ws_framebuffer(fb);
+ struct gl_framebuffer *stfb = st_ws_framebuffer(fb);
/* FBO */
if (!stfb)
@@ -1244,7 +1233,7 @@ st_manager_add_color_renderbuffer(struct st_context *st,
assert(_mesa_is_winsys_fbo(fb));
- if (stfb->Base.Attachment[idx].Renderbuffer)
+ if (stfb->Attachment[idx].Renderbuffer)
return true;
switch (idx) {
@@ -1258,7 +1247,7 @@ st_manager_add_color_renderbuffer(struct st_context *st,
}
if (!st_framebuffer_add_renderbuffer(stfb, idx,
- stfb->Base.Visual.sRGBCapable))
+ stfb->Visual.sRGBCapable))
return false;
st_framebuffer_update_attachments(stfb);
diff --git a/src/mesa/state_tracker/st_manager.h b/src/mesa/state_tracker/st_manager.h
index a394d9815c0..fa1a3302c5f 100644
--- a/src/mesa/state_tracker/st_manager.h
+++ b/src/mesa/state_tracker/st_manager.h
@@ -48,10 +48,6 @@ bool
st_manager_add_color_renderbuffer(struct st_context *st, struct gl_framebuffer *fb,
gl_buffer_index idx);
-void
-st_framebuffer_reference(struct st_framebuffer **ptr,
- struct st_framebuffer *stfb);
-
void
st_framebuffer_interface_destroy(struct st_framebuffer_interface *stfbi);
More information about the mesa-commit
mailing list