gallium/targets: Break haiku state_tracker out to own directory
authorAlexander von Gluck IV <kallisti5@unixzen.com>
Mon, 25 Aug 2014 21:26:15 +0000 (21:26 +0000)
committerAlexander von Gluck IV <kallisti5@unixzen.com>
Fri, 29 Aug 2014 01:27:29 +0000 (21:27 -0400)
Ack'ed by Emil Velikov <emil.l.velikov@gmail.com>

12 files changed:
src/gallium/SConscript
src/gallium/state_trackers/hgl/SConscript [new file with mode: 0644]
src/gallium/state_trackers/hgl/bitmap_wrapper.cpp [moved from src/gallium/winsys/sw/hgl/bitmap_wrapper.cpp with 100% similarity]
src/gallium/state_trackers/hgl/bitmap_wrapper.h [moved from src/gallium/winsys/sw/hgl/bitmap_wrapper.h with 100% similarity]
src/gallium/state_trackers/hgl/hgl.c [moved from src/gallium/targets/haiku-softpipe/GalliumFramebuffer.cpp with 61% similarity]
src/gallium/state_trackers/hgl/hgl_context.h [new file with mode: 0644]
src/gallium/targets/haiku-softpipe/GalliumContext.cpp
src/gallium/targets/haiku-softpipe/GalliumContext.h
src/gallium/targets/haiku-softpipe/GalliumFramebuffer.h [deleted file]
src/gallium/targets/haiku-softpipe/SConscript
src/gallium/winsys/sw/hgl/SConscript
src/hgl/GLRendererRoster.cpp

index 98d017e..977e3fb 100644 (file)
@@ -85,6 +85,7 @@ if not env['embedded']:
 
     if env['platform'] == 'haiku':
         SConscript([
+            'state_trackers/hgl/SConscript',
             'targets/haiku-softpipe/SConscript',
         ])
 
diff --git a/src/gallium/state_trackers/hgl/SConscript b/src/gallium/state_trackers/hgl/SConscript
new file mode 100644 (file)
index 0000000..05b8214
--- /dev/null
@@ -0,0 +1,23 @@
+#######################################################################
+# SConscript for Haiku state_tracker
+
+Import('*')
+
+env = env.Clone()
+
+env.Append(CPPPATH = [
+    '#/src',
+    '#/src/mapi',
+    '#/src/mesa',
+])
+
+sources = [
+    'hgl.c',
+       'bitmap_wrapper.cpp',
+]
+
+st_haiku = env.ConvenienceLibrary(
+    target = 'st_haiku',
+    source = sources
+)
+Export('st_haiku')
@@ -8,37 +8,33 @@
  */
 
 
-#include "GalliumFramebuffer.h"
-
-extern "C" {
 #include "main/context.h"
 #include "main/framebuffer.h"
 #include "main/renderbuffer.h"
 #include "pipe/p_format.h"
-#include "state_tracker/st_manager.h"
+#include "util/u_atomic.h"
 #include "util/u_memory.h"
-}
 
-#include "GalliumContext.h"
+#include "hgl_context.h"
 
 
 #ifdef DEBUG
-#   define TRACE(x...) printf("GalliumFramebuffer: " x)
+#   define TRACE(x...) printf("hgl:state_tracker: " x)
 #   define CALLED() TRACE("CALLED: %s\n", __PRETTY_FUNCTION__)
 #else
 #   define TRACE(x...)
 #   define CALLED()
 #endif
-#define ERROR(x...) printf("GalliumFramebuffer: " x)
+#define ERROR(x...) printf("hgl:state_tracker: " x)
 
 
 static boolean
-hgl_framebuffer_flush_front(struct st_context_iface *stctx,
+hgl_st_framebuffer_flush_front(struct st_context_iface *stctx,
        struct st_framebuffer_iface* stfb, enum st_attachment_type statt)
 {
        CALLED();
 
-       hgl_context* context = (hgl_context*)stfb->st_manager_private;
+       struct hgl_context* context = (struct hgl_context*)stfb->st_manager_private;
 
        if (!context) {
                ERROR("%s: Couldn't obtain valid hgl_context!\n", __func__);
@@ -58,20 +54,23 @@ hgl_framebuffer_flush_front(struct st_context_iface *stctx,
 }
 
 
+/**
+ * Called by the st manager to validate the framebuffer (allocate
+ * its resources).
+ */
 static boolean
-hgl_framebuffer_validate(struct st_context_iface* stctx,
-       struct st_framebuffer_iface* stfb,
-       const enum st_attachment_type* statts, unsigned count,
-       struct pipe_resource** out)
+hgl_st_framebuffer_validate(struct st_context_iface *stctx,
+       struct st_framebuffer_iface *stfbi, const enum st_attachment_type *statts,
+       unsigned count, struct pipe_resource **out)
 {
        CALLED();
 
-       if (!stfb) {
+       if (!stfbi) {
                ERROR("%s: Invalid st framebuffer interface!\n", __func__);
                return FALSE;
        }
 
-       hgl_context* context = (hgl_context*)stfb->st_manager_private;
+       struct hgl_context* context = (struct hgl_context*)stfbi->st_manager_private;
 
        if (!context) {
                ERROR("%s: Couldn't obtain valid hgl_context!\n", __func__);
@@ -93,8 +92,7 @@ hgl_framebuffer_validate(struct st_context_iface* stctx,
 
        if (context->stVisual && context->manager && context->manager->screen) {
                TRACE("%s: Updating resources\n", __func__);
-               unsigned i;
-               for (i = 0; i < count; i++) {
+               for (unsigned i = 0; i < count; i++) {
                        enum pipe_format format = PIPE_FORMAT_NONE;
                        unsigned bind = 0;
        
@@ -133,56 +131,39 @@ hgl_framebuffer_validate(struct st_context_iface* stctx,
 }
 
 
-GalliumFramebuffer::GalliumFramebuffer(struct st_visual* visual,
-       void* privateContext)
-       :
-       fBuffer(NULL)
+/**
+ * Create new framebuffer
+ */
+struct hgl_buffer *
+hgl_create_st_framebuffer(struct hgl_context* context)
 {
        CALLED();
-       fBuffer = CALLOC_STRUCT(st_framebuffer_iface);
-       if (!fBuffer) {
-               ERROR("%s: Couldn't calloc framebuffer!\n", __func__);
-               return;
-       }
-       fBuffer->visual = visual;
-       fBuffer->flush_front = hgl_framebuffer_flush_front;
-       fBuffer->validate = hgl_framebuffer_validate;
-       fBuffer->st_manager_private = privateContext;
-
-       pipe_mutex_init(fMutex);
-}
 
+       struct hgl_buffer *buffer = CALLOC_STRUCT(hgl_buffer);
 
-GalliumFramebuffer::~GalliumFramebuffer()
-{
-       CALLED();
-       // We lock and unlock to try and make sure we wait for anything
-       // using the framebuffer to finish
-       Lock();
-       if (!fBuffer) {
-               ERROR("%s: Strange, no Gallium Framebuffer to free?\n", __func__);
-               return;
-       }
-       FREE(fBuffer);
-       Unlock();
+       assert(context);
+       assert(context->stVisual);
 
-       pipe_mutex_destroy(fMutex);
-}
+       if (buffer) {
+               // Copy context visual into framebuffer
+               memcpy(&buffer->visual, context->stVisual, sizeof(struct st_visual));
 
+               // calloc our st_framebuffer interface
+               buffer->stfbi = CALLOC_STRUCT(st_framebuffer_iface);
+               if (!buffer->stfbi) {
+                       ERROR("%s: Couldn't calloc framebuffer!\n", __func__);
+                       return NULL;
+               }
 
-status_t
-GalliumFramebuffer::Lock()
-{
-       CALLED();
-       pipe_mutex_lock(fMutex);
-       return B_OK;
-}
+               struct st_framebuffer_iface* stfbi = buffer->stfbi;
+               p_atomic_set(&stfbi->stamp, 1);
+               stfbi->flush_front = hgl_st_framebuffer_flush_front;
+               stfbi->validate = hgl_st_framebuffer_validate;
+               stfbi->st_manager_private = (void*)context;
+               stfbi->visual = &buffer->visual;
 
+               // TODO: Do we need linked list?
+       }
 
-status_t
-GalliumFramebuffer::Unlock()
-{
-       CALLED();
-       pipe_mutex_unlock(fMutex);
-       return B_OK;
+   return buffer;
 }
diff --git a/src/gallium/state_trackers/hgl/hgl_context.h b/src/gallium/state_trackers/hgl/hgl_context.h
new file mode 100644 (file)
index 0000000..f1f43fa
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2009-2014, Haiku, Inc. All Rights Reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *             Alexander von Gluck IV, kallisti5@unixzen.com
+ */
+#ifndef HGL_CONTEXT_H
+#define HGL_CONTEXT_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "state_tracker/st_api.h"
+#include "state_tracker/st_manager.h"
+#include "pipe/p_compiler.h"
+#include "pipe/p_screen.h"
+#include "postprocess/filters.h"
+#include "os/os_thread.h"
+
+#include "bitmap_wrapper.h"
+#ifdef __cplusplus
+}
+#endif
+
+
+#define CONTEXT_MAX 32
+
+typedef int64 context_id;
+
+
+struct hgl_buffer
+{
+       struct st_framebuffer_iface *stfbi;
+       struct st_visual* visual;
+
+       unsigned width;
+       unsigned height;
+
+       struct pipe_resource* textures[ST_ATTACHMENT_COUNT];
+
+       void *map;
+
+       //struct hgl_buffer *next;  /**< next in linked list */
+};
+
+
+struct hgl_context
+{
+       struct st_api* api;
+               // State Tracker API
+       struct st_manager* manager;
+               // State Tracker Manager
+       struct st_context_iface* st;
+               // State Tracker Interface Object
+       struct st_visual* stVisual;
+               // State Tracker Visual
+
+       struct pipe_resource* textures[ST_ATTACHMENT_COUNT];
+
+       // Post processing
+       struct pp_queue_t* postProcess;
+       unsigned int postProcessEnable[PP_FILTERS];
+
+       Bitmap* bitmap;
+       color_space colorSpace;
+
+       pipe_mutex fbMutex;
+
+       struct hgl_buffer* draw;
+       struct hgl_buffer* read;
+};
+
+
+struct hgl_buffer* hgl_create_st_framebuffer(struct hgl_context* context);
+
+
+#endif /* HGL_CONTEXT_H */
index 7b13260..c740458 100644 (file)
@@ -278,8 +278,8 @@ GalliumContext::CreateContext(Bitmap *bitmap)
                return -1;
        }
 
-       context->draw = new GalliumFramebuffer(context->stVisual, (void*)this);
-       context->read = new GalliumFramebuffer(context->stVisual, (void*)this);
+       context->draw = hgl_create_st_framebuffer(context);
+       context->read = hgl_create_st_framebuffer(context);
 
        if (!context->draw || !context->read) {
                ERROR("%s: Problem allocating framebuffer!\n", __func__);
@@ -448,12 +448,8 @@ GalliumContext::SetCurrentContext(Bitmap *bitmap, context_id contextID)
        }
 
        // We need to lock and unlock framebuffers before accessing them
-       context->draw->Lock();
-       context->read->Lock();
-       api->make_current(context->api, context->st, context->draw->fBuffer,
-               context->read->fBuffer);
-       context->draw->Unlock();
-       context->read->Unlock();
+       api->make_current(context->api, context->st, context->draw->stfbi,
+               context->read->stfbi);
 
        if (context->textures[ST_ATTACHMENT_BACK_LEFT]
                && context->textures[ST_ATTACHMENT_DEPTH_STENCIL]
@@ -486,7 +482,7 @@ GalliumContext::SwapBuffers(context_id contextID)
        }
 
        // TODO: Where did st_notify_swapbuffers go?
-       //st_notify_swapbuffers(context->draw->stfb);
+       //st_notify_swapbuffers(context->draw->stfbi);
 
        context->st->flush(context->st, ST_FLUSH_FRONT, NULL);
 
index 6c11c0f..cf8895e 100644 (file)
 #include <kernel/image.h>
 
 extern "C" {
-#include "state_tracker/st_api.h"
+//#include "state_tracker/st_api.h"
 #include "pipe/p_compiler.h"
 #include "pipe/p_screen.h"
 #include "postprocess/filters.h"
 #include "os/os_thread.h"
+#include "hgl_context.h"
 }
-#include "bitmap_wrapper.h"
-#include "GalliumFramebuffer.h"
-
-
-#define CONTEXT_MAX 32
-
-
-typedef int64 context_id;
 
-struct hgl_context
-{
-       struct st_api* api;
-               // State Tracker API
-       struct st_manager* manager;
-               // State Tracker Manager
-       struct st_context_iface* st;
-               // State Tracker Interface Object
-       struct st_visual* stVisual;
-               // State Tracker Visual
-
-       struct pipe_resource* textures[ST_ATTACHMENT_COUNT];
-
-       // Post processing
-       struct pp_queue_t* postProcess;
-       unsigned int postProcessEnable[PP_FILTERS];
-
-       Bitmap* bitmap;
-       color_space colorSpace;
+#include "bitmap_wrapper.h"
 
-       GalliumFramebuffer* draw;
-       GalliumFramebuffer* read;
-};
 
 
 class GalliumContext {
diff --git a/src/gallium/targets/haiku-softpipe/GalliumFramebuffer.h b/src/gallium/targets/haiku-softpipe/GalliumFramebuffer.h
deleted file mode 100644 (file)
index 11e6b73..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2012, Haiku, Inc. All Rights Reserved.
- * Distributed under the terms of the MIT License.
- *
- * Authors:
- *      Alexander von Gluck IV, kallisti5@unixzen.com
- */
-#ifndef GALLIUMFRAMEBUFFER_H
-#define GALLIUMFRAMEBUFFER_H
-
-
-extern "C" {
-#include "os/os_thread.h"
-#include "pipe/p_screen.h"
-#include "state_tracker/st_api.h"
-}
-
-
-class GalliumFramebuffer {
-public:
-                                                       GalliumFramebuffer(struct st_visual* visual,
-                                                               void* privateContext);
-                                                       ~GalliumFramebuffer();
-               status_t                        Lock();
-               status_t                        Unlock();
-
-               struct st_framebuffer_iface* fBuffer;
-
-private:
-               pipe_mutex                      fMutex;
-};
-
-
-#endif /* GALLIUMFRAMEBUFFER_H */
index c730fde..d89a2af 100644 (file)
@@ -2,6 +2,7 @@ Import('*')
 
 env.Prepend(LIBS = [
     ws_haiku,
+       st_haiku,
     trace,
     rbug,
     mesautil,
@@ -26,6 +27,7 @@ env.Append(CPPPATH = [
     '#/src/mesa/main',
     '#/include/HaikuGL',
     '#/src/gallium/winsys/sw/hgl',
+    '#/src/gallium/state_trackers/hgl',
     '/boot/system/develop/headers/private',
 ])
 
@@ -35,7 +37,6 @@ if env['llvm']:
 
 softpipe_sources = [
     'GalliumContext.cpp',
-    'GalliumFramebuffer.cpp',
     'SoftwareRenderer.cpp'
 ]
 
index 44080a6..7755b00 100644 (file)
@@ -12,13 +12,13 @@ if env['platform'] in ('haiku'):
         '#/src/gallium/include',
         '#/src/gallium/auxiliary',
         '#/src/gallium/drivers',
+        '#/src/gallium/state_trackers/hgl',
     ])
 
     ws_haiku = env.ConvenienceLibrary(
         target = 'ws_haiku',
         source = [
            'hgl_sw_winsys.c',
-           'bitmap_wrapper.cpp',
         ]
     )
     Export('ws_haiku')
index 1712a87..d29f7ec 100644 (file)
@@ -17,7 +17,7 @@
 #include <Directory.h>
 #include <FindDirectory.h>
 #include <Path.h>
-#include <String.h>
+#include <strings.h>
 #include "GLDispatcher.h"
 #include "GLRendererRoster.h"