diff options
author | X512 <danger_mail@list.ru> | 2021-01-05 00:12:38 -0600 |
---|---|---|
committer | Alexander von Gluck IV <kallisti5@unixzen.com> | 2021-01-09 20:51:35 -0600 |
commit | 065cf4f91474f65691e2eed6d5011a7c6e43fe99 (patch) | |
tree | 15165c02f5172347ae059e5b09137a8787eee97f /src/hgl | |
parent | bd6ea80d963ded2a1677e74ac448556a8ea44280 (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.cpp | 65 | ||||
-rw-r--r-- | src/hgl/GLDispatcher.h | 105 | ||||
-rw-r--r-- | src/hgl/GLRenderer.cpp | 11 | ||||
-rw-r--r-- | src/hgl/GLRendererRoster.cpp | 73 | ||||
-rw-r--r-- | src/hgl/GLRendererRoster.h | 29 | ||||
-rw-r--r-- | src/hgl/GLView.cpp | 60 | ||||
-rw-r--r-- | src/hgl/meson.build | 2 |
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 : [ |