diff options
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r-- | src/gallium/state_trackers/hgl/SConscript | 23 | ||||
-rw-r--r-- | src/gallium/state_trackers/hgl/bitmap_wrapper.cpp | 146 | ||||
-rw-r--r-- | src/gallium/state_trackers/hgl/bitmap_wrapper.h | 62 | ||||
-rw-r--r-- | src/gallium/state_trackers/hgl/hgl.c | 169 | ||||
-rw-r--r-- | src/gallium/state_trackers/hgl/hgl_context.h | 79 |
5 files changed, 479 insertions, 0 deletions
diff --git a/src/gallium/state_trackers/hgl/SConscript b/src/gallium/state_trackers/hgl/SConscript new file mode 100644 index 00000000000..05b8214c34a --- /dev/null +++ b/src/gallium/state_trackers/hgl/SConscript @@ -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') diff --git a/src/gallium/state_trackers/hgl/bitmap_wrapper.cpp b/src/gallium/state_trackers/hgl/bitmap_wrapper.cpp new file mode 100644 index 00000000000..ef81edc8a57 --- /dev/null +++ b/src/gallium/state_trackers/hgl/bitmap_wrapper.cpp @@ -0,0 +1,146 @@ +/************************************************************************** + * + * Copyright 2009 Artur Wyszynski <[email protected]> + * Copyright 2013 Alexander von Gluck IV <[email protected]> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + **************************************************************************/ + + +#include <stdio.h> +#include <interface/Bitmap.h> +#include <storage/File.h> +#include <support/String.h> +#include <translation/BitmapStream.h> +#include <translation/TranslatorRoster.h> + +#include "bitmap_wrapper.h" + + +extern "C" { +static int frameNo = 0; + + +Bitmap* +create_bitmap(int32 width, int32 height, color_space colorSpace) +{ + BBitmap *bb = new BBitmap(BRect(0, 0, width, height), colorSpace); + if (bb) + return (Bitmap*)bb; + return NULL; +} + + +void +get_bitmap_size(const Bitmap* bitmap, int32* width, int32* height) +{ + BBitmap *bb = (BBitmap*)bitmap; + if (bb && width && height) { + uint32 w = bb->Bounds().IntegerWidth() + 1; + uint32 h = bb->Bounds().IntegerHeight() + 1; + *width = w; + *height = h; + } +} + + +color_space +get_bitmap_color_space(const Bitmap* bitmap) +{ + BBitmap *bb = (BBitmap*)bitmap; + if (bb) + return bb->ColorSpace(); + return B_NO_COLOR_SPACE; +} + + +void +copy_bitmap_bits(const Bitmap* bitmap, void* data, int32 length) +{ + BBitmap *bb = (BBitmap*)bitmap; + + // We assume the data is 1:1 the format of the bitmap + if (bb) + bb->ImportBits(data, length, bb->BytesPerRow(), 0, bb->ColorSpace()); +} + + +void +import_bitmap_bits(const Bitmap* bitmap, void* data, int32 length, + unsigned srcStride, color_space srcColorSpace) +{ + BBitmap *bb = (BBitmap*)bitmap; + + // Import image and adjust image format from source to dest + if (bb) + bb->ImportBits(data, length, srcStride, 0, srcColorSpace); +} + + +void +delete_bitmap(Bitmap* bitmap) +{ + BBitmap *bb = (BBitmap*)bitmap; + delete bb; +} + + +int32 +get_bitmap_bytes_per_row(const Bitmap* bitmap) +{ + BBitmap *bb = (BBitmap*)bitmap; + if (bb) + return bb->BytesPerRow(); + return 0; +} + + +int32 +get_bitmap_bits_length(const Bitmap* bitmap) +{ + BBitmap *bb = (BBitmap*)bitmap; + if (bb) + return bb->BitsLength(); + return 0; +} + + +void +dump_bitmap(const Bitmap* bitmap) +{ + BBitmap *bb = (BBitmap*)bitmap; + if (!bb) + return; + + BString filename("/boot/home/frame_"); + filename << (int32)frameNo << ".png"; + + BTranslatorRoster *roster = BTranslatorRoster::Default(); + BBitmapStream stream(bb); + BFile dump(filename, B_CREATE_FILE | B_WRITE_ONLY); + + roster->Translate(&stream, NULL, NULL, &dump, 0); + + frameNo++; +} + +} diff --git a/src/gallium/state_trackers/hgl/bitmap_wrapper.h b/src/gallium/state_trackers/hgl/bitmap_wrapper.h new file mode 100644 index 00000000000..65ba14044d8 --- /dev/null +++ b/src/gallium/state_trackers/hgl/bitmap_wrapper.h @@ -0,0 +1,62 @@ +/************************************************************************** + * + * Copyright 2009 Artur Wyszynski <[email protected]> + * Copyright 2013 Alexander von Gluck IV <[email protected]> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + **************************************************************************/ +#ifndef __BBITMAP_WRAPPER_H__ +#define __BBITMAP_WRAPPER_H__ + + +#include <interface/GraphicsDefs.h> +#include <support/SupportDefs.h> + + +typedef void Bitmap; + +#ifdef __cplusplus +extern "C" { +#endif + + +Bitmap* create_bitmap(int32 width, int32 height, color_space colorSpace); +void delete_bitmap(Bitmap* bitmap); + +void copy_bitmap_bits(const Bitmap* bitmap, void* data, int32 length); +void import_bitmap_bits(const Bitmap* bitmap, void* data, int32 length, + unsigned srcStride, color_space srcColorSpace); + +void get_bitmap_size(const Bitmap* bitmap, int32* width, int32* height); +color_space get_bitmap_color_space(const Bitmap* bitmap); +int32 get_bitmap_bytes_per_row(const Bitmap* bitmap); +int32 get_bitmap_bits_length(const Bitmap* bitmap); + +void dump_bitmap(const Bitmap* bitmap); + + +#ifdef __cplusplus +} +#endif + + +#endif /* __BBITMAP_WRAPPER_H__ */ diff --git a/src/gallium/state_trackers/hgl/hgl.c b/src/gallium/state_trackers/hgl/hgl.c new file mode 100644 index 00000000000..1d6fa73f23f --- /dev/null +++ b/src/gallium/state_trackers/hgl/hgl.c @@ -0,0 +1,169 @@ +/* + * Copyright 2012-2013, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Artur Wyszynski, [email protected] + * Alexander von Gluck IV, [email protected] + */ + + +#include "main/context.h" +#include "main/framebuffer.h" +#include "main/renderbuffer.h" +#include "pipe/p_format.h" +#include "util/u_atomic.h" +#include "util/u_memory.h" + +#include "hgl_context.h" + + +#ifdef DEBUG +# 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("hgl:state_tracker: " x) + + +static boolean +hgl_st_framebuffer_flush_front(struct st_context_iface *stctx, + struct st_framebuffer_iface* stfb, enum st_attachment_type statt) +{ + CALLED(); + + struct hgl_context* context = (struct hgl_context*)stfb->st_manager_private; + + if (!context) { + ERROR("%s: Couldn't obtain valid hgl_context!\n", __func__); + return FALSE; + } + + #if 0 + struct stw_st_framebuffer *stwfb = stw_st_framebuffer(stfb); + pipe_mutex_lock(stwfb->fb->mutex); + + struct pipe_resource* resource = textures[statt]; + if (resource) + stw_framebuffer_present_locked(...); + #endif + + return TRUE; +} + + +/** + * Called by the st manager to validate the framebuffer (allocate + * its resources). + */ +static boolean +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 (!stfbi) { + ERROR("%s: Invalid st framebuffer interface!\n", __func__); + return FALSE; + } + + struct hgl_context* context = (struct hgl_context*)stfbi->st_manager_private; + + if (!context) { + ERROR("%s: Couldn't obtain valid hgl_context!\n", __func__); + return FALSE; + } + + int32 width = 0; + int32 height = 0; + get_bitmap_size(context->bitmap, &width, &height); + + struct pipe_resource templat; + memset(&templat, 0, sizeof(templat)); + templat.target = PIPE_TEXTURE_RECT; + templat.width0 = width; + templat.height0 = height; + templat.depth0 = 1; + templat.array_size = 1; + templat.usage = PIPE_USAGE_DEFAULT; + + if (context->stVisual && context->manager && context->manager->screen) { + TRACE("%s: Updating resources\n", __func__); + for (unsigned i = 0; i < count; i++) { + enum pipe_format format = PIPE_FORMAT_NONE; + unsigned bind = 0; + + switch(statts[i]) { + case ST_ATTACHMENT_FRONT_LEFT: + case ST_ATTACHMENT_BACK_LEFT: + format = context->stVisual->color_format; + bind = PIPE_BIND_DISPLAY_TARGET + | PIPE_BIND_RENDER_TARGET; + break; + case ST_ATTACHMENT_DEPTH_STENCIL: + format = context->stVisual->depth_stencil_format; + bind = PIPE_BIND_DEPTH_STENCIL; + break; + case ST_ATTACHMENT_ACCUM: + format = context->stVisual->accum_format; + bind = PIPE_BIND_RENDER_TARGET; + break; + default: + format = PIPE_FORMAT_NONE; + break; + } + + if (format != PIPE_FORMAT_NONE) { + templat.format = format; + templat.bind = bind; + + struct pipe_screen* screen = context->manager->screen; + context->textures[i] = screen->resource_create(screen, &templat); + out[i] = context->textures[i]; + } + } + } + + return TRUE; +} + + +/** + * Create new framebuffer + */ +struct hgl_buffer * +hgl_create_st_framebuffer(struct hgl_context* context) +{ + CALLED(); + + 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? + } + + 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 index 00000000000..f1f43fa113b --- /dev/null +++ b/src/gallium/state_trackers/hgl/hgl_context.h @@ -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, [email protected] + */ +#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 */ |