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_format.h"
31 #include "util/u_inlines.h"
32 #include "util/u_format.h"
33 #include "util/u_math.h"
34 #include "util/u_memory.h"
36 #include "hgl_sw_winsys.h"
40 static INLINE
struct haiku_displaytarget
*
41 hgl_sw_displaytarget(struct sw_displaytarget
* target
)
43 return (struct haiku_displaytarget
*)target
;
48 hgl_winsys_destroy(struct sw_winsys
* winsys
)
55 hgl_winsys_is_displaytarget_format_supported(struct sw_winsys
* winsys
,
56 unsigned textureUsage
, enum pipe_format format
)
63 hgl_winsys_convert_cs(enum pipe_format format
)
65 // TODO: B_RGB24, B_RGB16, B_RGB15?
67 case PIPE_FORMAT_B5G6R5_UNORM
:
69 case PIPE_FORMAT_A8R8G8B8_UNORM
:
70 case PIPE_FORMAT_X8R8G8B8_UNORM
:
76 static struct sw_displaytarget
*
77 hgl_winsys_displaytarget_create(struct sw_winsys
* winsys
,
78 unsigned textureUsage
, enum pipe_format format
, unsigned width
,
79 unsigned height
, unsigned alignment
, unsigned* stride
)
81 struct haiku_displaytarget
* haikuDisplayTarget
82 = CALLOC_STRUCT(haiku_displaytarget
);
83 assert(haikuDisplayTarget
);
85 haikuDisplayTarget
->colorSpace
= hgl_winsys_convert_cs(format
);
86 haikuDisplayTarget
->format
= format
;
87 haikuDisplayTarget
->width
= width
;
88 haikuDisplayTarget
->height
= height
;
90 size_t formatStride
= util_format_get_stride(format
, width
);
91 unsigned blockSize
= util_format_get_nblocksy(format
, height
);
93 haikuDisplayTarget
->stride
= align(formatStride
, alignment
);
94 haikuDisplayTarget
->size
= haikuDisplayTarget
->stride
* blockSize
;
96 haikuDisplayTarget
->data
97 = align_malloc(haikuDisplayTarget
->size
, alignment
);
99 assert(haikuDisplayTarget
->data
);
101 *stride
= haikuDisplayTarget
->stride
;
103 // Cast to ghost sw_displaytarget type
104 return (struct sw_displaytarget
*)haikuDisplayTarget
;
109 hgl_winsys_displaytarget_destroy(struct sw_winsys
* winsys
,
110 struct sw_displaytarget
* displayTarget
)
112 struct haiku_displaytarget
* haikuDisplayTarget
113 = hgl_sw_displaytarget(displayTarget
);
115 if (!haikuDisplayTarget
)
118 if (haikuDisplayTarget
->data
!= NULL
)
119 align_free(haikuDisplayTarget
->data
);
121 FREE(haikuDisplayTarget
);
125 static struct sw_displaytarget
*
126 hgl_winsys_displaytarget_from_handle(struct sw_winsys
* winsys
,
127 const struct pipe_resource
* templat
, struct winsys_handle
* whandle
,
135 hgl_winsys_displaytarget_get_handle(struct sw_winsys
* winsys
,
136 struct sw_displaytarget
* displayTarget
, struct winsys_handle
* whandle
)
143 hgl_winsys_displaytarget_map(struct sw_winsys
* winsys
,
144 struct sw_displaytarget
* displayTarget
, unsigned flags
)
146 struct haiku_displaytarget
* haikuDisplayTarget
147 = hgl_sw_displaytarget(displayTarget
);
149 return haikuDisplayTarget
->data
;
154 hgl_winsys_displaytarget_unmap(struct sw_winsys
* winsys
,
155 struct sw_displaytarget
* disptarget
)
162 hgl_winsys_displaytarget_display(struct sw_winsys
* winsys
,
163 struct sw_displaytarget
* displayTarget
, void* contextPrivate
,
164 struct pipe_box
*box
)
166 assert(contextPrivate
);
168 Bitmap
* bitmap
= (Bitmap
*)contextPrivate
;
170 struct haiku_displaytarget
* haikuDisplayTarget
171 = hgl_sw_displaytarget(displayTarget
);
173 import_bitmap_bits(bitmap
, haikuDisplayTarget
->data
,
174 haikuDisplayTarget
->size
, haikuDisplayTarget
->stride
,
175 haikuDisplayTarget
->colorSpace
);
182 hgl_create_sw_winsys()
184 struct sw_winsys
* winsys
= CALLOC_STRUCT(sw_winsys
);
189 // Attach winsys hooks for Haiku
190 winsys
->destroy
= hgl_winsys_destroy
;
191 winsys
->is_displaytarget_format_supported
192 = hgl_winsys_is_displaytarget_format_supported
;
193 winsys
->displaytarget_create
= hgl_winsys_displaytarget_create
;
194 winsys
->displaytarget_from_handle
= hgl_winsys_displaytarget_from_handle
;
195 winsys
->displaytarget_get_handle
= hgl_winsys_displaytarget_get_handle
;
196 winsys
->displaytarget_map
= hgl_winsys_displaytarget_map
;
197 winsys
->displaytarget_unmap
= hgl_winsys_displaytarget_unmap
;
198 winsys
->displaytarget_display
= hgl_winsys_displaytarget_display
;
199 winsys
->displaytarget_destroy
= hgl_winsys_displaytarget_destroy
;