1 /**************************************************************************
3 * Copyright 2009 Artur Wyszynski <harakash@gmail.com>
4 * Copyright 2013 Alexander von Gluck IV <kallisti5@unixzen.com>
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20 * USE OR OTHER DEALINGS IN THE SOFTWARE.
22 * The above copyright notice and this permission notice (including the
23 * next paragraph) shall be included in all copies or substantial portions
26 **************************************************************************/
29 #include "pipe/p_compiler.h"
30 #include "pipe/p_defines.h"
31 #include "pipe/p_format.h"
32 #include "util/u_inlines.h"
33 #include "util/u_format.h"
34 #include "util/u_math.h"
35 #include "util/u_memory.h"
36 #include "state_tracker/st_api.h"
37 #include "state_tracker/sw_winsys.h"
39 #include "bitmap_wrapper.h"
40 #include "hgl_sw_winsys.h"
43 struct haiku_displaytarget
45 enum pipe_format format
;
46 color_space colorSpace
;
59 static INLINE
struct haiku_displaytarget
*
60 hgl_sw_displaytarget(struct sw_displaytarget
* target
)
62 return (struct haiku_displaytarget
*)target
;
67 hgl_winsys_destroy(struct sw_winsys
* winsys
)
74 hgl_winsys_is_displaytarget_format_supported(struct sw_winsys
* winsys
,
75 unsigned textureUsage
, enum pipe_format format
)
82 hgl_winsys_convert_cs(enum pipe_format format
)
84 // TODO: B_RGB24, B_RGB16, B_RGB15?
86 case PIPE_FORMAT_B5G6R5_UNORM
:
88 case PIPE_FORMAT_A8R8G8B8_UNORM
:
89 case PIPE_FORMAT_X8R8G8B8_UNORM
:
95 static struct sw_displaytarget
*
96 hgl_winsys_displaytarget_create(struct sw_winsys
* winsys
,
97 unsigned textureUsage
, enum pipe_format format
, unsigned width
,
98 unsigned height
, unsigned alignment
, unsigned* stride
)
100 struct haiku_displaytarget
* haikuDisplayTarget
101 = CALLOC_STRUCT(haiku_displaytarget
);
102 assert(haikuDisplayTarget
);
104 haikuDisplayTarget
->colorSpace
= hgl_winsys_convert_cs(format
);
105 haikuDisplayTarget
->format
= format
;
106 haikuDisplayTarget
->width
= width
;
107 haikuDisplayTarget
->height
= height
;
109 size_t formatStride
= util_format_get_stride(format
, width
);
110 unsigned blockSize
= util_format_get_nblocksy(format
, height
);
112 haikuDisplayTarget
->stride
= align(formatStride
, alignment
);
113 haikuDisplayTarget
->size
= haikuDisplayTarget
->stride
* blockSize
;
115 haikuDisplayTarget
->data
116 = align_malloc(haikuDisplayTarget
->size
, alignment
);
118 assert(haikuDisplayTarget
->data
);
120 *stride
= haikuDisplayTarget
->stride
;
122 // Cast to ghost sw_displaytarget type
123 return (struct sw_displaytarget
*)haikuDisplayTarget
;
128 hgl_winsys_displaytarget_destroy(struct sw_winsys
* winsys
,
129 struct sw_displaytarget
* displayTarget
)
131 struct haiku_displaytarget
* haikuDisplayTarget
132 = hgl_sw_displaytarget(displayTarget
);
134 if (!haikuDisplayTarget
)
137 if (haikuDisplayTarget
->data
!= NULL
)
138 align_free(haikuDisplayTarget
->data
);
140 FREE(haikuDisplayTarget
);
144 static struct sw_displaytarget
*
145 hgl_winsys_displaytarget_from_handle(struct sw_winsys
* winsys
,
146 const struct pipe_resource
* templat
, struct winsys_handle
* whandle
,
154 hgl_winsys_displaytarget_get_handle(struct sw_winsys
* winsys
,
155 struct sw_displaytarget
* displayTarget
, struct winsys_handle
* whandle
)
162 hgl_winsys_displaytarget_map(struct sw_winsys
* winsys
,
163 struct sw_displaytarget
* displayTarget
, unsigned flags
)
165 struct haiku_displaytarget
* haikuDisplayTarget
166 = hgl_sw_displaytarget(displayTarget
);
168 return haikuDisplayTarget
->data
;
173 hgl_winsys_displaytarget_unmap(struct sw_winsys
* winsys
,
174 struct sw_displaytarget
* disptarget
)
181 hgl_winsys_displaytarget_display(struct sw_winsys
* winsys
,
182 struct sw_displaytarget
* displayTarget
, void* contextPrivate
,
183 struct pipe_box
*box
)
185 assert(contextPrivate
);
187 Bitmap
* bitmap
= (Bitmap
*)contextPrivate
;
189 struct haiku_displaytarget
* haikuDisplayTarget
190 = hgl_sw_displaytarget(displayTarget
);
192 import_bitmap_bits(bitmap
, haikuDisplayTarget
->data
,
193 haikuDisplayTarget
->size
, haikuDisplayTarget
->stride
,
194 haikuDisplayTarget
->colorSpace
);
201 hgl_create_sw_winsys()
203 struct sw_winsys
* winsys
= CALLOC_STRUCT(sw_winsys
);
208 // Attach winsys hooks for Haiku
209 winsys
->destroy
= hgl_winsys_destroy
;
210 winsys
->is_displaytarget_format_supported
211 = hgl_winsys_is_displaytarget_format_supported
;
212 winsys
->displaytarget_create
= hgl_winsys_displaytarget_create
;
213 winsys
->displaytarget_from_handle
= hgl_winsys_displaytarget_from_handle
;
214 winsys
->displaytarget_get_handle
= hgl_winsys_displaytarget_get_handle
;
215 winsys
->displaytarget_map
= hgl_winsys_displaytarget_map
;
216 winsys
->displaytarget_unmap
= hgl_winsys_displaytarget_unmap
;
217 winsys
->displaytarget_display
= hgl_winsys_displaytarget_display
;
218 winsys
->displaytarget_destroy
= hgl_winsys_displaytarget_destroy
;