1d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson/**************************************************************************
2d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson *
3d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * Copyright 2009 VMware, Inc.
47d551eb03df0a732e9e55dd960afffc6a1525377Corbin Simpson * 2010 Corbin Simpson <MostAwesomeDude@gmail.com>
5d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * All Rights Reserved.
6d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson *
7d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * Permission is hereby granted, free of charge, to any person obtaining a
8d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * copy of this software and associated documentation files (the
9d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * "Software"), to deal in the Software without restriction, including
10d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * without limitation the rights to use, copy, modify, merge, publish,
11d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * distribute, sub license, and/or sell copies of the Software, and to
12d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * permit persons to whom the Software is furnished to do so, subject to
13d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * the following conditions:
14d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson *
15d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * The above copyright notice and this permission notice (including the
16d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * next paragraph) shall be included in all copies or substantial portions
17d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * of the Software.
18d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson *
19d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
23d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson *
27d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson **************************************************************************/
28d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
29d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
30d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson#include "pipe/p_screen.h"
31d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson#include "pipe/p_state.h"
32d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson#include "util/u_memory.h"
33ccd08643577988d416b339b84fe7bfda6fb77ef6Luca Barbieri#include "util/u_math.h"
348b1f1900d191b01a6a58090228a8056f3c0cad1cJosé Fonseca#include "util/u_format.h"
35d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
36d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson#include "glhd_public.h"
37d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson#include "glhd_screen.h"
38d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson#include "glhd_context.h"
39d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson#include "glhd_objects.h"
40d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
41d12c4c5a62dbf5e32f989c8ef53a5a878cc5c0a2Jakob BornecrantzDEBUG_GET_ONCE_BOOL_OPTION(galahad, "GALLIUM_GALAHAD", FALSE)
42d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
43d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsonstatic void
44d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_destroy(struct pipe_screen *_screen)
45d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
46d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_screen *glhd_screen = galahad_screen(_screen);
47d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_screen *screen = glhd_screen->screen;
48d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
49d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   screen->destroy(screen);
50d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
51d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   FREE(glhd_screen);
52d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
53d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
54d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsonstatic const char *
55d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_get_name(struct pipe_screen *_screen)
56d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
57d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_screen *glhd_screen = galahad_screen(_screen);
58d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_screen *screen = glhd_screen->screen;
59d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
60d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   return screen->get_name(screen);
61d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
62d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
63d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsonstatic const char *
64d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_get_vendor(struct pipe_screen *_screen)
65d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
66d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_screen *glhd_screen = galahad_screen(_screen);
67d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_screen *screen = glhd_screen->screen;
68d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
69d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   return screen->get_vendor(screen);
70d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
71d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
72d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsonstatic int
73d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_get_param(struct pipe_screen *_screen,
74d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                          enum pipe_cap param)
75d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
76d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_screen *glhd_screen = galahad_screen(_screen);
77d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_screen *screen = glhd_screen->screen;
78d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
79d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   return screen->get_param(screen,
80d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                            param);
81d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
82d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
83a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieristatic int
84a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbierigalahad_screen_get_shader_param(struct pipe_screen *_screen,
85a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri                          unsigned shader, enum pipe_shader_cap param)
86a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri{
87a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   struct galahad_screen *glhd_screen = galahad_screen(_screen);
88a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   struct pipe_screen *screen = glhd_screen->screen;
89a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri
90a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   return screen->get_shader_param(screen, shader,
91a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri                            param);
92a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri}
93a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri
94d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsonstatic float
95d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_get_paramf(struct pipe_screen *_screen,
96bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák                           enum pipe_capf param)
97d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
98d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_screen *glhd_screen = galahad_screen(_screen);
99d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_screen *screen = glhd_screen->screen;
100d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
101d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   return screen->get_paramf(screen,
102d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                             param);
103d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
104d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
105d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsonstatic boolean
106d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_is_format_supported(struct pipe_screen *_screen,
107d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                    enum pipe_format format,
108d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                    enum pipe_texture_target target,
109d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                    unsigned sample_count,
110e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                    unsigned tex_usage)
111d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
112d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_screen *glhd_screen = galahad_screen(_screen);
113d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_screen *screen = glhd_screen->screen;
114d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
115de7b181e99a64cb517a021f00f714c6af9b337eeCorbin Simpson   if (target >= PIPE_MAX_TEXTURE_TYPES) {
116de7b181e99a64cb517a021f00f714c6af9b337eeCorbin Simpson      glhd_warn("Received bogus texture target %d", target);
117de7b181e99a64cb517a021f00f714c6af9b337eeCorbin Simpson   }
118de7b181e99a64cb517a021f00f714c6af9b337eeCorbin Simpson
119d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   return screen->is_format_supported(screen,
120d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                      format,
121d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                      target,
122d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                      sample_count,
123e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                      tex_usage);
124d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
125d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
126d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsonstatic struct pipe_context *
127d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_context_create(struct pipe_screen *_screen,
128d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                               void *priv)
129d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
130d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_screen *glhd_screen = galahad_screen(_screen);
131d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_screen *screen = glhd_screen->screen;
132d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_context *result;
133d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
134d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   result = screen->context_create(screen, priv);
135d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   if (result)
136d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson      return galahad_context_create(_screen, result);
137d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   return NULL;
138d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
139d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
140d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsonstatic struct pipe_resource *
141d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_resource_create(struct pipe_screen *_screen,
142d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                const struct pipe_resource *templat)
143d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
144d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_screen *glhd_screen = galahad_screen(_screen);
145d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_screen *screen = glhd_screen->screen;
146d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_resource *result;
147d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
148ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca   glhd_check("%u", templat->width0, >= 1);
149ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca   glhd_check("%u", templat->height0, >= 1);
150ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca   glhd_check("%u", templat->depth0, >= 1);
151ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca   glhd_check("%u", templat->array_size, >= 1);
152ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca
153ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca   if (templat->target == PIPE_BUFFER) {
154ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->last_level, == 0);
155ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->height0, == 1);
156ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->depth0,  == 1);
157ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->array_size, == 1);
158ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca   } else if (templat->target == PIPE_TEXTURE_1D) {
159ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      unsigned max_texture_2d_levels = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
160ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->last_level, < max_texture_2d_levels);
161ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->width0,  <= (1 << (max_texture_2d_levels - 1)));
162ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->height0, == 1);
163ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->depth0,  == 1);
164ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->array_size, == 1);
165ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca   } else if (templat->target == PIPE_TEXTURE_2D) {
166ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      unsigned max_texture_2d_levels = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
167ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->last_level, < max_texture_2d_levels);
168ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->width0,  <= (1 << (max_texture_2d_levels - 1)));
169ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->height0, <= (1 << (max_texture_2d_levels - 1)));
170ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->depth0,  == 1);
171ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->array_size, == 1);
172ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca   } else if (templat->target == PIPE_TEXTURE_CUBE) {
173ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      unsigned max_texture_cube_levels = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS);
174ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->last_level, < max_texture_cube_levels);
175ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->width0,  <= (1 << (max_texture_cube_levels - 1)));
176ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->height0, == templat->width0);
177ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->depth0,  == 1);
178ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->array_size, == 6);
179ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca   } else if (templat->target == PIPE_TEXTURE_RECT) {
180ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      unsigned max_texture_2d_levels = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
181ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->last_level, == 0);
182ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->width0,  <= (1 << (max_texture_2d_levels - 1)));
183ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->height0, <= (1 << (max_texture_2d_levels - 1)));
184ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->depth0,  == 1);
185ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->array_size, == 1);
186ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca   } else if (templat->target == PIPE_TEXTURE_3D) {
187ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      unsigned max_texture_3d_levels = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS);
188ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->last_level, < max_texture_3d_levels);
189ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->width0,  <= (1 << (max_texture_3d_levels - 1)));
190ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->height0, <= (1 << (max_texture_3d_levels - 1)));
191ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->depth0,  <= (1 << (max_texture_3d_levels - 1)));
192ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->array_size, == 1);
193ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca   } else if (templat->target == PIPE_TEXTURE_1D_ARRAY) {
194ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      unsigned max_texture_2d_levels = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
195ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->last_level, < max_texture_2d_levels);
196ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->width0,  <= (1 << (max_texture_2d_levels - 1)));
197ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->height0, == 1);
198ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->depth0,  == 1);
199ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->array_size, <= screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS));
200ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca   } else if (templat->target == PIPE_TEXTURE_2D_ARRAY) {
201ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      unsigned max_texture_2d_levels = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
202ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->last_level, < max_texture_2d_levels);
203ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->width0,  <= (1 << (max_texture_2d_levels - 1)));
204ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->height0, <= (1 << (max_texture_2d_levels - 1)));
205ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->depth0,  == 1);
206ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca      glhd_check("%u", templat->array_size, <= screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS));
207ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca   } else {
208ccd08643577988d416b339b84fe7bfda6fb77ef6Luca Barbieri      glhd_warn("Received bogus resource target %d", templat->target);
209ff8ddf399adb58d7c33863ec9c6eeaa7aed71599José Fonseca   }
210ccd08643577988d416b339b84fe7bfda6fb77ef6Luca Barbieri
211ccd08643577988d416b339b84fe7bfda6fb77ef6Luca Barbieri   if(templat->target != PIPE_TEXTURE_RECT && templat->target != PIPE_BUFFER && !screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES))
212ccd08643577988d416b339b84fe7bfda6fb77ef6Luca Barbieri   {
21389b2897220acfacdc431f138377fbcec9f0ea812Marek Olšák      if(!util_is_power_of_two(templat->width0) || !util_is_power_of_two(templat->height0))
214ccd08643577988d416b339b84fe7bfda6fb77ef6Luca Barbieri         glhd_warn("Requested NPOT (%ux%u) non-rectangle texture without NPOT support", templat->width0, templat->height0);
215ccd08643577988d416b339b84fe7bfda6fb77ef6Luca Barbieri   }
216ccd08643577988d416b339b84fe7bfda6fb77ef6Luca Barbieri
2178b1f1900d191b01a6a58090228a8056f3c0cad1cJosé Fonseca   if (templat->target != PIPE_BUFFER &&
2188b1f1900d191b01a6a58090228a8056f3c0cad1cJosé Fonseca       !screen->is_format_supported(screen, templat->format, templat->target, templat->nr_samples, templat->bind)) {
2198b1f1900d191b01a6a58090228a8056f3c0cad1cJosé Fonseca      glhd_warn("Requested format=%s target=%u samples=%u bind=0x%x unsupported",
2208b1f1900d191b01a6a58090228a8056f3c0cad1cJosé Fonseca         util_format_name(templat->format), templat->target, templat->nr_samples, templat->bind);
2218b1f1900d191b01a6a58090228a8056f3c0cad1cJosé Fonseca   }
2228b1f1900d191b01a6a58090228a8056f3c0cad1cJosé Fonseca
223d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   result = screen->resource_create(screen,
224d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                    templat);
225d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
226d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   if (result)
227d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson      return galahad_resource_create(glhd_screen, result);
228d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   return NULL;
229d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
230d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
231d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsonstatic struct pipe_resource *
232d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_resource_from_handle(struct pipe_screen *_screen,
233d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                     const struct pipe_resource *templ,
234d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                     struct winsys_handle *handle)
235d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
236d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_screen *glhd_screen = galahad_screen(_screen);
237d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_screen *screen = glhd_screen->screen;
238d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_resource *result;
239d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
240d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   /* TODO trace call */
241d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
242d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   result = screen->resource_from_handle(screen, templ, handle);
243d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
244d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   result = galahad_resource_create(galahad_screen(_screen), result);
245d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
246d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   return result;
247d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
248d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
249d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsonstatic boolean
250d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_resource_get_handle(struct pipe_screen *_screen,
251d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                    struct pipe_resource *_resource,
252d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                    struct winsys_handle *handle)
253d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
254d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_screen *glhd_screen = galahad_screen(_screen);
255d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_resource *glhd_resource = galahad_resource(_resource);
256d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_screen *screen = glhd_screen->screen;
257d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_resource *resource = glhd_resource->resource;
258d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
259d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   /* TODO trace call */
260d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
261d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   return screen->resource_get_handle(screen, resource, handle);
262d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
263d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
264d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
265d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
266d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsonstatic void
267d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_resource_destroy(struct pipe_screen *screen,
268d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                 struct pipe_resource *_resource)
269d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
270d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   galahad_resource_destroy(galahad_resource(_resource));
271d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
272d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
273d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
274d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsonstatic void
275d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_flush_frontbuffer(struct pipe_screen *_screen,
2764c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                  struct pipe_resource *_resource,
2774c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                  unsigned level, unsigned layer,
278d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                  void *context_private)
279d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
280d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_screen *glhd_screen = galahad_screen(_screen);
2814c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   struct galahad_resource *glhd_resource = galahad_resource(_resource);
282d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_screen *screen = glhd_screen->screen;
2834c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   struct pipe_resource *resource = glhd_resource->resource;
284d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
285d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   screen->flush_frontbuffer(screen,
2864c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                             resource,
2874c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                             level, layer,
288d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                             context_private);
289d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
290d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
291d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsonstatic void
292d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_fence_reference(struct pipe_screen *_screen,
293d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                struct pipe_fence_handle **ptr,
294d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                                struct pipe_fence_handle *fence)
295d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
296d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_screen *glhd_screen = galahad_screen(_screen);
297d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_screen *screen = glhd_screen->screen;
298d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
299d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   screen->fence_reference(screen,
300d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                           ptr,
301d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                           fence);
302d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
303d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
304bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšákstatic boolean
305d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_fence_signalled(struct pipe_screen *_screen,
306bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšák                                struct pipe_fence_handle *fence)
307d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
308d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_screen *glhd_screen = galahad_screen(_screen);
309d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_screen *screen = glhd_screen->screen;
310d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
311d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   return screen->fence_signalled(screen,
312bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšák                                  fence);
313d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
314d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
315bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšákstatic boolean
316d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_fence_finish(struct pipe_screen *_screen,
317d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                             struct pipe_fence_handle *fence,
318b39bccbd4ed71e9585da4cf5acf7b887b2e90899Marek Olšák                             uint64_t timeout)
319d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
320d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_screen *glhd_screen = galahad_screen(_screen);
321d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct pipe_screen *screen = glhd_screen->screen;
322d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
323d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   return screen->fence_finish(screen,
324d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson                               fence,
325b39bccbd4ed71e9585da4cf5acf7b887b2e90899Marek Olšák                               timeout);
326d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
327d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
328a471d268ec2a6d22a02f3e9d109b792659dbe7efMarek Olšákstatic uint64_t
329a471d268ec2a6d22a02f3e9d109b792659dbe7efMarek Olšákgalahad_screen_get_timestamp(struct pipe_screen *_screen)
330a471d268ec2a6d22a02f3e9d109b792659dbe7efMarek Olšák{
331a471d268ec2a6d22a02f3e9d109b792659dbe7efMarek Olšák   struct galahad_screen *glhd_screen = galahad_screen(_screen);
332a471d268ec2a6d22a02f3e9d109b792659dbe7efMarek Olšák   struct pipe_screen *screen = glhd_screen->screen;
333a471d268ec2a6d22a02f3e9d109b792659dbe7efMarek Olšák
334a471d268ec2a6d22a02f3e9d109b792659dbe7efMarek Olšák   return screen->get_timestamp(screen);
335a471d268ec2a6d22a02f3e9d109b792659dbe7efMarek Olšák}
336a471d268ec2a6d22a02f3e9d109b792659dbe7efMarek Olšák
337d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsonstruct pipe_screen *
338d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpsongalahad_screen_create(struct pipe_screen *screen)
339d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson{
340d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   struct galahad_screen *glhd_screen;
341d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
342d12c4c5a62dbf5e32f989c8ef53a5a878cc5c0a2Jakob Bornecrantz   if (!debug_get_option_galahad())
343d12c4c5a62dbf5e32f989c8ef53a5a878cc5c0a2Jakob Bornecrantz      return screen;
344d12c4c5a62dbf5e32f989c8ef53a5a878cc5c0a2Jakob Bornecrantz
345d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   glhd_screen = CALLOC_STRUCT(galahad_screen);
346d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   if (!glhd_screen) {
347d12c4c5a62dbf5e32f989c8ef53a5a878cc5c0a2Jakob Bornecrantz      return screen;
348d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   }
349d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
3507bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca#define GLHD_SCREEN_INIT(_member) \
3517bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   glhd_screen->base . _member = screen -> _member ? galahad_screen_ ## _member : NULL
3527bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca
3537bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(destroy);
3547bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(get_name);
3557bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(get_vendor);
3567bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(get_param);
3577bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(get_shader_param);
3587bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   //GLHD_SCREEN_INIT(get_video_param);
3597bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   //GLHD_SCREEN_INIT(get_compute_param);
3607bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(get_paramf);
3617bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(is_format_supported);
3627bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   //GLHD_SCREEN_INIT(is_video_format_supported);
3637bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(context_create);
3647bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(resource_create);
3657bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(resource_from_handle);
3667bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(resource_get_handle);
3677bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(resource_destroy);
3687bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(flush_frontbuffer);
3697bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(fence_reference);
3707bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(fence_signalled);
3717bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca   GLHD_SCREEN_INIT(fence_finish);
372a471d268ec2a6d22a02f3e9d109b792659dbe7efMarek Olšák   GLHD_SCREEN_INIT(get_timestamp);
3737bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca
3747bd926af8935f66e3a0e5c7d662c4ea6f30a54c6José Fonseca#undef GLHD_SCREEN_INIT
375d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
376d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   glhd_screen->screen = screen;
377d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson
378d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson   return &glhd_screen->base;
379d3ad6fa579d89d8c3ee27882d5baf8f8d2ecb3eaCorbin Simpson}
380