haiku: fix Mesa build
authorKen Mays <kmays2000@gmail.com>
Thu, 26 Sep 2019 09:47:06 +0000 (09:47 +0000)
committerJuan Suárez Romero <jasuarez@igalia.com>
Tue, 1 Oct 2019 10:31:02 +0000 (10:31 +0000)
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 <kmays2000@gmail.com>
Tested-by: Ken Mays <kmays2000@gmail.com>
CC: mesa-stable@lists.freedesktop.org
Reviewed-by: Alexander von Gluck IV <kallisti5@unixzen.com>
src/gallium/state_trackers/hgl/hgl.c
src/gallium/state_trackers/hgl/hgl_context.h
src/gallium/targets/haiku-softpipe/GalliumContext.cpp
src/hgl/GLView.cpp

index 57e0e7695c85fbff4de2201c4870380ecbf1f67f..ac659a4f69ad04af72d0411823777df86941d8b1 100644 (file)
@@ -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;
 }
 
index 5acb2f08db18a30dae85135bbb222d2a12e7c0a9..c5995f1cd2b3e14be21a1cbad9c788ff58ca9365 100644 (file)
@@ -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);
index 0356f65417c19bf99b75dae28d4070ef556e8c5c..d9be790463090f0d463c9a462cde2cbbd3a6f70c 100644 (file)
@@ -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;
 }
index 9ae5b5c83ac9cef6db555b5e9e45509954d3d052..9e01dcc2c60c871914f199232343dd9db0c651b8 100644 (file)
@@ -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: