From 4943c89d6d3f522b3100be9187ff045f84f032b1 Mon Sep 17 00:00:00 2001 From: Ken Mays Date: Thu, 26 Sep 2019 09:47:06 +0000 Subject: [PATCH] haiku: fix Mesa build 1. The hgl.c file is a read-only file versus read-write. Ref: src/gallium/state_trackers/hgl/hgl.c 2. I've included the Haiku-specific patches I used to get a successful build of Mesa 19.1.7 on Haiku using the meson/ninja build procedure. Shows "[764/764] linking target ... libswpipe.so" at build completion. v2: Remove autotools files (Eric) v3: Update the patch Reported-by: Ken Mays Tested-by: Ken Mays CC: mesa-stable@lists.freedesktop.org Reviewed-by: Alexander von Gluck IV --- src/gallium/state_trackers/hgl/hgl.c | 10 ++++-- src/gallium/state_trackers/hgl/hgl_context.h | 4 +++ .../targets/haiku-softpipe/GalliumContext.cpp | 32 ++++--------------- src/hgl/GLView.cpp | 6 ++-- 4 files changed, 21 insertions(+), 31 deletions(-) diff --git a/src/gallium/state_trackers/hgl/hgl.c b/src/gallium/state_trackers/hgl/hgl.c index 57e0e7695c8..ac659a4f69a 100644 --- a/src/gallium/state_trackers/hgl/hgl.c +++ b/src/gallium/state_trackers/hgl/hgl.c @@ -44,7 +44,8 @@ hgl_st_context(struct st_context_iface *stctxi) // Perform a safe void to hgl_buffer cast -static inline struct hgl_buffer* +//static inline struct hgl_buffer* +struct hgl_buffer* hgl_st_framebuffer(struct st_framebuffer_iface *stfbi) { struct hgl_buffer* buffer; @@ -62,7 +63,9 @@ hgl_st_framebuffer_flush_front(struct st_context_iface *stctxi, CALLED(); //struct hgl_context* context = hgl_st_context(stctxi); - //struct hgl_buffer* buffer = hgl_st_context(stfbi); + // struct hgl_buffer* buffer = hgl_st_context(stfbi); + struct hgl_buffer* buffer = hgl_st_framebuffer(stfbi); + //buffer->surface #if 0 struct stw_st_framebuffer *stwfb = stw_st_framebuffer(stfb); @@ -281,7 +284,8 @@ hgl_create_st_manager(struct hgl_context* context) //manager->display = dpy; manager->screen = context->screen; manager->get_param = hgl_st_manager_get_param; - + manager->st_manager_private = (void *)context; + return manager; } diff --git a/src/gallium/state_trackers/hgl/hgl_context.h b/src/gallium/state_trackers/hgl/hgl_context.h index 5acb2f08db1..c5995f1cd2b 100644 --- a/src/gallium/state_trackers/hgl/hgl_context.h +++ b/src/gallium/state_trackers/hgl/hgl_context.h @@ -39,6 +39,8 @@ struct hgl_buffer unsigned mask; struct pipe_screen* screen; + struct pipe_surface* surface; + enum pipe_texture_target target; struct pipe_resource* textures[ST_ATTACHMENT_COUNT]; @@ -80,6 +82,8 @@ struct hgl_context struct hgl_buffer* read; }; +// hgl_buffer from statetracker interface +struct hgl_buffer* hgl_st_framebuffer(struct st_framebuffer_iface *stfbi); // hgl state_tracker api struct st_api* hgl_create_st_api(void); diff --git a/src/gallium/targets/haiku-softpipe/GalliumContext.cpp b/src/gallium/targets/haiku-softpipe/GalliumContext.cpp index 0356f65417c..d9be7904630 100644 --- a/src/gallium/targets/haiku-softpipe/GalliumContext.cpp +++ b/src/gallium/targets/haiku-softpipe/GalliumContext.cpp @@ -26,6 +26,7 @@ #include "sw/hgl/hgl_sw_winsys.h" #include "util/u_atomic.h" #include "util/u_memory.h" +#include "util/u_framebuffer.h" #include "target-helpers/inline_sw_helper.h" #include "target-helpers/inline_debug_helper.h" @@ -332,36 +333,17 @@ GalliumContext::SwapBuffers(context_id contextID) ERROR("%s: context not found\n", __func__); return B_ERROR; } - - // TODO: Where did st_notify_swapbuffers go? - //st_notify_swapbuffers(context->draw->stfbi); - context->st->flush(context->st, ST_FLUSH_FRONT, NULL); - struct st_context *stContext = (struct st_context*)context->st; - - unsigned nColorBuffers = stContext->state.framebuffer.nr_cbufs; - for (unsigned i = 0; i < nColorBuffers; i++) { - pipe_surface* surface = stContext->state.framebuffer.cbufs[i]; - if (!surface) { - ERROR("%s: Color buffer %d invalid!\n", __func__, i); - continue; - } - - TRACE("%s: Flushing color buffer #%d\n", __func__, i); - - // We pass our destination bitmap to flush_fronbuffer which passes it - // to the private winsys display call. - fScreen->flush_frontbuffer(fScreen, surface->texture, 0, 0, - context->bitmap, NULL); + struct hgl_buffer* buffer = hgl_st_framebuffer(context->draw->stfbi); + pipe_surface* surface = buffer->surface; + if (!surface) { + ERROR("%s: Invalid drawable surface!\n", __func__); + return B_ERROR; } - #if 0 - // TODO... should we flush the z stencil buffer? - pipe_surface* zSurface = stContext->state.framebuffer.zsbuf; - fScreen->flush_frontbuffer(fScreen, zSurface->texture, 0, 0, + fScreen->flush_frontbuffer(fScreen, surface->texture, 0, 0, context->bitmap, NULL); - #endif return B_OK; } diff --git a/src/hgl/GLView.cpp b/src/hgl/GLView.cpp index 9ae5b5c83ac..9e01dcc2c60 100644 --- a/src/hgl/GLView.cpp +++ b/src/hgl/GLView.cpp @@ -51,6 +51,7 @@ BGLView::BGLView(BRect rect, const char* name, ulong resizingMode, ulong mode, fDitherMap(NULL) { fRoster = new GLRendererRoster(this, options); + fRenderer = fRoster->GetRenderer(); } @@ -68,7 +69,7 @@ BGLView::LockGL() // TODO: acquire the OpenGL API lock it on this glview fDisplayLock.Lock(); - if (fRenderer) + if (fRenderer != NULL && fDisplayLock.CountLocks() == 1) fRenderer->LockGL(); } @@ -76,7 +77,7 @@ BGLView::LockGL() void BGLView::UnlockGL() { - if (fRenderer) + if (fRenderer != NULL && fDisplayLock.CountLocks() == 1) fRenderer->UnlockGL(); fDisplayLock.Unlock(); @@ -189,7 +190,6 @@ BGLView::AttachedToWindow() for (BView* view = this; view != NULL; view = view->Parent()) view->ConvertToParent(&fBounds); - fRenderer = fRoster->GetRenderer(); if (fRenderer != NULL) { // Jackburton: The following code was commented because it doesn't look // good in "direct" mode: -- 2.30.2