summaryrefslogtreecommitdiff
path: root/src/hgl
diff options
context:
space:
mode:
authorX512 <danger_mail@list.ru>2021-01-05 00:12:38 -0600
committerAlexander von Gluck IV <kallisti5@unixzen.com>2021-01-09 20:51:35 -0600
commit065cf4f91474f65691e2eed6d5011a7c6e43fe99 (patch)
tree15165c02f5172347ae059e5b09137a8787eee97f /src/hgl
parentbd6ea80d963ded2a1677e74ac448556a8ea44280 (diff)
hgl: Major refactor and cleanup
* Drop old-timey GLDisplatcher * Refactor haiku-softpipe fixing some hacks * Bubble BBitmap up to winsys Reviewed-by: Alexander von Gluck IV <kallisti5@unixzen.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8323>
Diffstat (limited to 'src/hgl')
-rw-r--r--src/hgl/GLDispatcher.cpp65
-rw-r--r--src/hgl/GLDispatcher.h105
-rw-r--r--src/hgl/GLRenderer.cpp11
-rw-r--r--src/hgl/GLRendererRoster.cpp73
-rw-r--r--src/hgl/GLRendererRoster.h29
-rw-r--r--src/hgl/GLView.cpp60
-rw-r--r--src/hgl/meson.build2
7 files changed, 86 insertions, 259 deletions
diff --git a/src/hgl/GLDispatcher.cpp b/src/hgl/GLDispatcher.cpp
deleted file mode 100644
index f9709e444f9..00000000000
--- a/src/hgl/GLDispatcher.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000-2015 Haiku, Inc. All Rights Reserved.
- * Distributed under the terms of the MIT License.
- *
- * Authors:
- * Brian Paul <brian.e.paul@gmail.com>
- * Philippe Houdoin <philippe.houdoin@free.fr>
- * Alexander von Gluck IV <kallisti5@unixzen.com>
- */
-
-
-#include "glapi/glapi.h"
-#include "glapi/glapi_priv.h"
-
-
-extern "C" {
-/*
- * NOTE: this file portion implements C-based dispatch of the OpenGL entrypoints
- * (glAccum, glBegin, etc).
- * This code IS NOT USED if we're compiling on an x86 system and using
- * the glapi_x86.S assembly code.
- */
-#if !(defined(USE_X86_ASM) || defined(USE_SPARC_ASM))
-
-#define KEYWORD1 PUBLIC
-#define KEYWORD2
-#define NAME(func) gl##func
-
-#define DISPATCH(func, args, msg) \
- const struct _glapi_table* dispatch; \
- dispatch = _glapi_Dispatch ? _glapi_Dispatch : _glapi_get_dispatch();\
- (dispatch->func) args
-
-#define RETURN_DISPATCH(func, args, msg) \
- const struct _glapi_table* dispatch; \
- dispatch = _glapi_Dispatch ? _glapi_Dispatch : _glapi_get_dispatch();\
- return (dispatch->func) args
-
-#endif
-}
-
-
-/* NOTE: this file portion implement a thin OpenGL entrypoints dispatching
- C++ wrapper class
- */
-
-#include "GLDispatcher.h"
-
-BGLDispatcher::BGLDispatcher()
-{
-}
-
-
-BGLDispatcher::~BGLDispatcher()
-{
-}
-
-
-status_t
-BGLDispatcher::SetTable(struct _glapi_table* table)
-{
- _glapi_set_dispatch(table);
- return B_OK;
-}
diff --git a/src/hgl/GLDispatcher.h b/src/hgl/GLDispatcher.h
deleted file mode 100644
index 7a4bcd33299..00000000000
--- a/src/hgl/GLDispatcher.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000-2015 Haiku, Inc. All Rights Reserved.
- * Distributed under the terms of the MIT License.
- *
- * Authors:
- * Brian Paul <brian.e.paul@gmail.com>
- * Philippe Houdoin <philippe.houdoin@free.fr>
- */
-#ifndef GLDISPATCHER_H
-#define GLDISPATCHER_H
-
-
-#include <BeBuild.h>
-#include <GL/gl.h>
-#include <SupportDefs.h>
-
-#include "main/glheader.h"
-
-#include "glapi/glapi.h"
-
-
-class BGLDispatcher
-{
- // Private unimplemented copy constructors
- BGLDispatcher(const BGLDispatcher &);
- BGLDispatcher & operator=(const BGLDispatcher &);
-
- public:
- BGLDispatcher();
- ~BGLDispatcher();
-
- void SetCurrentContext(void* context);
- void* CurrentContext();
-
- struct _glapi_table* Table();
- status_t SetTable(struct _glapi_table* dispatch);
- uint32 TableSize();
-
- const _glapi_proc operator[](const char* functionName);
- const char* operator[](uint32 offset);
-
- const _glapi_proc AddressOf(const char* functionName);
- uint32 OffsetOf(const char* functionName);
-};
-
-
-// Inlines methods
-inline void
-BGLDispatcher::SetCurrentContext(void* context)
-{
- _glapi_set_context(context);
-}
-
-
-inline void*
-BGLDispatcher::CurrentContext()
-{
- return _glapi_get_context();
-}
-
-
-inline struct _glapi_table*
-BGLDispatcher::Table()
-{
- return _glapi_get_dispatch();
-}
-
-
-inline uint32
-BGLDispatcher::TableSize()
-{
- return _glapi_get_dispatch_table_size();
-}
-
-
-inline const _glapi_proc
-BGLDispatcher::operator[](const char* functionName)
-{
- return _glapi_get_proc_address(functionName);
-}
-
-
-inline const char*
-BGLDispatcher::operator[](uint32 offset)
-{
- return _glapi_get_proc_name((GLuint) offset);
-}
-
-
-inline const _glapi_proc
-BGLDispatcher::AddressOf(const char* functionName)
-{
- return _glapi_get_proc_address(functionName);
-}
-
-
-inline uint32
-BGLDispatcher::OffsetOf(const char* functionName)
-{
- return (uint32) _glapi_get_proc_offset(functionName);
-}
-
-
-#endif // GLDISPATCHER_H
diff --git a/src/hgl/GLRenderer.cpp b/src/hgl/GLRenderer.cpp
index 4573a64a35c..af89b4e15eb 100644
--- a/src/hgl/GLRenderer.cpp
+++ b/src/hgl/GLRenderer.cpp
@@ -8,23 +8,18 @@
#include "GLRenderer.h"
-#include "GLDispatcher.h"
-
-BGLRenderer::BGLRenderer(BGLView* view, ulong glOptions,
- BGLDispatcher* dispatcher)
+BGLRenderer::BGLRenderer(BGLView* view, ulong glOptions)
:
fRefCount(1),
fView(view),
- fOptions(glOptions),
- fDispatcher(dispatcher)
+ fOptions(glOptions)
{
}
BGLRenderer::~BGLRenderer()
{
- delete fDispatcher;
}
@@ -38,7 +33,7 @@ BGLRenderer::Acquire()
void
BGLRenderer::Release()
{
- if (atomic_add(&fRefCount, -1) < 1)
+ if (atomic_add(&fRefCount, -1) <= 1)
delete this;
}
diff --git a/src/hgl/GLRendererRoster.cpp b/src/hgl/GLRendererRoster.cpp
index 9e5d847a1d7..9bb10498756 100644
--- a/src/hgl/GLRendererRoster.cpp
+++ b/src/hgl/GLRendererRoster.cpp
@@ -12,28 +12,34 @@
#include <image.h>
#include <kernel/image.h>
-#include <system/safemode_defs.h>
+#include <private/system/safemode_defs.h>
#include <Directory.h>
#include <FindDirectory.h>
#include <Path.h>
#include <strings.h>
-#include "GLDispatcher.h"
#include "GLRendererRoster.h"
#include <new>
#include <string.h>
+#include <stdio.h>
extern "C" status_t _kern_get_safemode_option(const char* parameter,
char* buffer, size_t* _bufferSize);
+GLRendererRoster *GLRendererRoster::fInstance = NULL;
-GLRendererRoster::GLRendererRoster(BGLView* view, ulong options)
+GLRendererRoster *GLRendererRoster::Roster()
+{
+ if (fInstance == NULL) {
+ fInstance = new GLRendererRoster();
+ }
+ return fInstance;
+}
+
+GLRendererRoster::GLRendererRoster()
:
- fNextID(0),
- fView(view),
- fOptions(options),
fSafeMode(false),
fABISubDirectory(NULL)
{
@@ -84,14 +90,19 @@ GLRendererRoster::~GLRendererRoster()
BGLRenderer*
-GLRendererRoster::GetRenderer(int32 id)
+GLRendererRoster::GetRenderer(BGLView *view, ulong options)
{
- RendererMap::const_iterator iterator = fRenderers.find(id);
- if (iterator == fRenderers.end())
- return NULL;
-
- struct renderer_item item = iterator->second;
- return item.renderer;
+ for (
+ RendererMap::const_iterator iterator = fRenderers.begin();
+ iterator != fRenderers.end();
+ iterator++
+ ) {
+ renderer_item item = *iterator;
+ BGLRenderer* renderer;
+ renderer = item.entry(view, options);
+ return renderer;
+ }
+ return NULL;
}
@@ -102,6 +113,7 @@ GLRendererRoster::AddDefaultPaths()
const directory_which paths[] = {
B_USER_NONPACKAGED_ADDONS_DIRECTORY,
B_USER_ADDONS_DIRECTORY,
+ B_SYSTEM_NONPACKAGED_ADDONS_DIRECTORY,
B_SYSTEM_ADDONS_DIRECTORY,
};
@@ -162,24 +174,22 @@ GLRendererRoster::AddPath(const char* path)
status_t
-GLRendererRoster::AddRenderer(BGLRenderer* renderer,
+GLRendererRoster::AddRenderer(InstantiateRenderer entry,
image_id image, const entry_ref* ref, ino_t node)
{
renderer_item item;
- item.renderer = renderer;
+ item.entry = entry;
item.image = image;
item.node = node;
if (ref != NULL)
item.ref = *ref;
try {
- fRenderers[fNextID] = item;
+ fRenderers.push_back(item);
} catch (...) {
return B_NO_MEMORY;
}
- renderer->fOwningRoster = this;
- renderer->fID = fNextID++;
return B_OK;
}
@@ -194,30 +204,29 @@ GLRendererRoster::CreateRenderer(const entry_ref& ref)
return status;
BPath path(&ref);
+ printf("OpenGL load add-on: %s\n", path.Path());
+
image_id image = load_add_on(path.Path());
if (image < B_OK)
return image;
- BGLRenderer* (*instantiate_renderer)
- (BGLView* view, ulong options, BGLDispatcher* dispatcher);
+ InstantiateRenderer instantiate_renderer;
- status = get_image_symbol(image, "instantiate_gl_renderer",
- B_SYMBOL_TYPE_TEXT, (void**)&instantiate_renderer);
- if (status == B_OK) {
- BGLRenderer* renderer
- = instantiate_renderer(fView, fOptions, new BGLDispatcher());
- if (!renderer) {
- unload_add_on(image);
- return B_UNSUPPORTED;
- }
+ status = get_image_symbol(
+ image, "instantiate_gl_renderer",
+ B_SYMBOL_TYPE_TEXT, (void**)&instantiate_renderer
+ );
- if (AddRenderer(renderer, image, &ref, nodeRef.node) != B_OK) {
- renderer->Release();
- // this will delete the renderer
+ if (status == B_OK) {
+ if ((status = AddRenderer(instantiate_renderer, image, &ref, nodeRef.node)) != B_OK) {
unload_add_on(image);
+ return status;
}
+ printf("OpenGL add-on registered: %s\n", path.Path());
return B_OK;
}
+
+ printf("OpenGL add-on failed to instantiate: %s\n", path.Path());
unload_add_on(image);
return status;
diff --git a/src/hgl/GLRendererRoster.h b/src/hgl/GLRendererRoster.h
index f0116cc88f9..66abad9d5e2 100644
--- a/src/hgl/GLRendererRoster.h
+++ b/src/hgl/GLRendererRoster.h
@@ -9,42 +9,43 @@
#define _GLRENDERER_ROSTER_H
-#include "GLRenderer.h"
+#include <GLRenderer.h>
-#include <map>
+#include <vector>
+typedef BGLRenderer* (*InstantiateRenderer) (BGLView* view, ulong options);
+
struct renderer_item {
- BGLRenderer* renderer;
+ InstantiateRenderer entry;
entry_ref ref;
ino_t node;
image_id image;
};
-typedef std::map<renderer_id, renderer_item> RendererMap;
+typedef std::vector<renderer_item> RendererMap;
class GLRendererRoster {
public:
- GLRendererRoster(BGLView* view, ulong options);
- virtual ~GLRendererRoster();
-
- BGLRenderer* GetRenderer(int32 id = 0);
+ static GLRendererRoster *Roster();
+ BGLRenderer* GetRenderer(BGLView *view, ulong options);
private:
+ GLRendererRoster();
+ virtual ~GLRendererRoster();
+
void AddDefaultPaths();
status_t AddPath(const char* path);
- status_t AddRenderer(BGLRenderer* renderer,
- image_id image, const entry_ref* ref, ino_t node);
+ status_t AddRenderer(InstantiateRenderer entry, image_id image,
+ const entry_ref* ref, ino_t node);
status_t CreateRenderer(const entry_ref& ref);
- RendererMap fRenderers;
- int32 fNextID;
- BGLView* fView;
- ulong fOptions;
+ static GLRendererRoster* fInstance;
bool fSafeMode;
const char* fABISubDirectory;
+ RendererMap fRenderers;
};
diff --git a/src/hgl/GLView.cpp b/src/hgl/GLView.cpp
index 91850db96cf..3462c885494 100644
--- a/src/hgl/GLView.cpp
+++ b/src/hgl/GLView.cpp
@@ -20,10 +20,10 @@
#include <DirectWindow.h>
#include "GLRenderer.h"
-#include "interface/DirectWindowPrivate.h"
-#include "GLDispatcher.h"
+#include <private/interface/DirectWindowPrivate.h>
#include "GLRendererRoster.h"
+#include "glapi/glapi.h"
struct glview_direct_info {
direct_buffer_info* direct_info;
@@ -39,7 +39,6 @@ BGLView::BGLView(BRect rect, const char* name, ulong resizingMode, ulong mode,
ulong options)
:
BView(rect, name, B_FOLLOW_ALL_SIDES, mode | B_WILL_DRAW | B_FRAME_EVENTS),
- // | B_FULL_UPDATE_ON_RESIZE)
fGc(NULL),
fOptions(options),
fDitherCount(0),
@@ -47,11 +46,9 @@ BGLView::BGLView(BRect rect, const char* name, ulong resizingMode, ulong mode,
fDisplayLock("BGLView display lock"),
fClipInfo(NULL),
fRenderer(NULL),
- fRoster(NULL),
fDitherMap(NULL)
{
- fRoster = new GLRendererRoster(this, options);
- fRenderer = fRoster->GetRenderer();
+ fRenderer = GLRendererRoster::Roster()->GetRenderer(this, options);
}
@@ -77,6 +74,15 @@ BGLView::LockGL()
void
BGLView::UnlockGL()
{
+ thread_id lockerThread = fDisplayLock.LockingThread();
+ thread_id callerThread = find_thread(NULL);
+
+ if (lockerThread != B_ERROR && lockerThread != callerThread) {
+ printf("UnlockGL is called from wrong thread, lockerThread: %d, callerThread: %d\n",
+ (int)lockerThread, (int)callerThread);
+ debugger("[!]");
+ }
+
if (fRenderer != NULL && fDisplayLock.CountLocks() == 1)
fRenderer->UnlockGL();
fDisplayLock.Unlock();
@@ -113,15 +119,7 @@ BGLView::EmbeddedView()
void*
BGLView::GetGLProcAddress(const char* procName)
{
- BGLDispatcher* glDispatcher = NULL;
-
- if (fRenderer)
- glDispatcher = fRenderer->GLDispatcher();
-
- if (glDispatcher)
- return (void*)glDispatcher->AddressOf(procName);
-
- return NULL;
+ return (void*)_glapi_get_proc_address(procName);
}
@@ -170,9 +168,8 @@ void
BGLView::Draw(BRect updateRect)
{
if (fRenderer) {
- _LockDraw();
- fRenderer->Draw(updateRect);
- _UnlockDraw();
+ if (!fClipInfo || !fClipInfo->enable_direct_mode)
+ fRenderer->Draw(updateRect);
return;
}
// TODO: auto-size and center the string
@@ -237,10 +234,6 @@ BGLView::AllAttached()
void
BGLView::DetachedFromWindow()
{
- if (fRenderer)
- fRenderer->Release();
- fRenderer = NULL;
-
BView::DetachedFromWindow();
}
@@ -260,12 +253,9 @@ BGLView::FrameResized(float width, float height)
v->ConvertToParent(&fBounds);
if (fRenderer) {
- LockGL();
- _LockDraw();
- _CallDirectConnected();
+ //_LockDraw();
fRenderer->FrameResized(width, height);
- _UnlockDraw();
- UnlockGL();
+ //_UnlockDraw();
}
BView::FrameResized(width, height);
@@ -342,6 +332,7 @@ BGLView::GetSupportedSuites(BMessage* data)
void
BGLView::DirectConnected(direct_buffer_info* info)
{
+ printf("BGLView::DirectConnected\n");
if (fClipInfo == NULL) {
fClipInfo = new (std::nothrow) glview_direct_info();
if (fClipInfo == NULL)
@@ -350,33 +341,33 @@ BGLView::DirectConnected(direct_buffer_info* info)
direct_buffer_info* localInfo = fClipInfo->direct_info;
+ _LockDraw();
switch (info->buffer_state & B_DIRECT_MODE_MASK) {
case B_DIRECT_START:
fClipInfo->direct_connected = true;
memcpy(localInfo, info, DIRECT_BUFFER_INFO_AREA_SIZE);
- _UnlockDraw();
break;
case B_DIRECT_MODIFY:
- _LockDraw();
memcpy(localInfo, info, DIRECT_BUFFER_INFO_AREA_SIZE);
- _UnlockDraw();
break;
case B_DIRECT_STOP:
fClipInfo->direct_connected = false;
- _LockDraw();
break;
}
if (fRenderer)
_CallDirectConnected();
+
+ _UnlockDraw();
}
void
BGLView::EnableDirectMode(bool enabled)
{
+ printf("BGLView::EnableDirectMode: %d\n", (int)enabled);
if (fRenderer)
fRenderer->EnableDirectMode(enabled);
if (fClipInfo == NULL) {
@@ -412,8 +403,10 @@ BGLView::_UnlockDraw()
void
BGLView::_CallDirectConnected()
{
- if (!fClipInfo)
+ if (!fClipInfo || !fClipInfo->direct_connected) {
+ fRenderer->DirectConnected(NULL);
return;
+ }
direct_buffer_info* localInfo = fClipInfo->direct_info;
direct_buffer_info* info = (direct_buffer_info*)malloc(
@@ -472,10 +465,9 @@ BGLView::BGLView(BRect rect, char* name, ulong resizingMode, ulong mode,
fDisplayLock("BGLView display lock"),
fClipInfo(NULL),
fRenderer(NULL),
- fRoster(NULL),
fDitherMap(NULL)
{
- fRoster = new GLRendererRoster(this, options);
+ fRenderer = GLRendererRoster::Roster()->GetRenderer(this, options);
}
diff --git a/src/hgl/meson.build b/src/hgl/meson.build
index e01c572f2d0..eeecbe03b9a 100644
--- a/src/hgl/meson.build
+++ b/src/hgl/meson.build
@@ -21,7 +21,7 @@
libgl = shared_library(
'GL',
files(
- 'GLView.cpp', 'GLRenderer.cpp', 'GLRendererRoster.cpp', 'GLDispatcher.cpp',
+ 'GLView.cpp', 'GLRenderer.cpp', 'GLRendererRoster.cpp',
),
link_args : [ld_args_bsymbolic, ld_args_gc_sections],
include_directories : [