mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 02:40:11 +01:00
gallium/targets: Break haiku state_tracker out to own directory
Ack'ed by Emil Velikov <emil.l.velikov@gmail.com>
This commit is contained in:
parent
86d1aa8531
commit
311b59495c
12 changed files with 162 additions and 143 deletions
|
|
@ -85,6 +85,7 @@ if not env['embedded']:
|
|||
|
||||
if env['platform'] == 'haiku':
|
||||
SConscript([
|
||||
'state_trackers/hgl/SConscript',
|
||||
'targets/haiku-softpipe/SConscript',
|
||||
])
|
||||
|
||||
|
|
|
|||
23
src/gallium/state_trackers/hgl/SConscript
Normal file
23
src/gallium/state_trackers/hgl/SConscript
Normal file
|
|
@ -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;
|
||||
|
||||
struct hgl_buffer *buffer = CALLOC_STRUCT(hgl_buffer);
|
||||
|
||||
assert(context);
|
||||
assert(context->stVisual);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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?
|
||||
}
|
||||
fBuffer->visual = visual;
|
||||
fBuffer->flush_front = hgl_framebuffer_flush_front;
|
||||
fBuffer->validate = hgl_framebuffer_validate;
|
||||
fBuffer->st_manager_private = privateContext;
|
||||
|
||||
pipe_mutex_init(fMutex);
|
||||
}
|
||||
|
||||
|
||||
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();
|
||||
|
||||
pipe_mutex_destroy(fMutex);
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
GalliumFramebuffer::Lock()
|
||||
{
|
||||
CALLED();
|
||||
pipe_mutex_lock(fMutex);
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
GalliumFramebuffer::Unlock()
|
||||
{
|
||||
CALLED();
|
||||
pipe_mutex_unlock(fMutex);
|
||||
return B_OK;
|
||||
return buffer;
|
||||
}
|
||||
79
src/gallium/state_trackers/hgl/hgl_context.h
Normal file
79
src/gallium/state_trackers/hgl/hgl_context.h
Normal file
|
|
@ -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 */
|
||||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -13,45 +13,17 @@
|
|||
#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;
|
||||
|
||||
GalliumFramebuffer* draw;
|
||||
GalliumFramebuffer* read;
|
||||
};
|
||||
|
||||
|
||||
class GalliumContext {
|
||||
public:
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
@ -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'
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue