1*bbecb9d1SAndroid Build Coastguard Worker /**************************************************************************
2*bbecb9d1SAndroid Build Coastguard Worker *
3*bbecb9d1SAndroid Build Coastguard Worker * Copyright (C) 2014 Red Hat Inc.
4*bbecb9d1SAndroid Build Coastguard Worker *
5*bbecb9d1SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
6*bbecb9d1SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
7*bbecb9d1SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
8*bbecb9d1SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*bbecb9d1SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
10*bbecb9d1SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
11*bbecb9d1SAndroid Build Coastguard Worker *
12*bbecb9d1SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
13*bbecb9d1SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
14*bbecb9d1SAndroid Build Coastguard Worker *
15*bbecb9d1SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16*bbecb9d1SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*bbecb9d1SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*bbecb9d1SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19*bbecb9d1SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20*bbecb9d1SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21*bbecb9d1SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE.
22*bbecb9d1SAndroid Build Coastguard Worker *
23*bbecb9d1SAndroid Build Coastguard Worker **************************************************************************/
24*bbecb9d1SAndroid Build Coastguard Worker #include <epoxy/gl.h>
25*bbecb9d1SAndroid Build Coastguard Worker
26*bbecb9d1SAndroid Build Coastguard Worker #include "vrend_renderer.h"
27*bbecb9d1SAndroid Build Coastguard Worker #include "util/u_memory.h"
28*bbecb9d1SAndroid Build Coastguard Worker #include "util/u_format.h"
29*bbecb9d1SAndroid Build Coastguard Worker
30*bbecb9d1SAndroid Build Coastguard Worker #define SWIZZLE_INVALID 0xff
31*bbecb9d1SAndroid Build Coastguard Worker #define NO_SWIZZLE { SWIZZLE_INVALID, SWIZZLE_INVALID, SWIZZLE_INVALID, SWIZZLE_INVALID }
32*bbecb9d1SAndroid Build Coastguard Worker #define RRR1_SWIZZLE { PIPE_SWIZZLE_RED, PIPE_SWIZZLE_RED, PIPE_SWIZZLE_RED, PIPE_SWIZZLE_ONE }
33*bbecb9d1SAndroid Build Coastguard Worker #define RGB1_SWIZZLE { PIPE_SWIZZLE_RED, PIPE_SWIZZLE_GREEN, PIPE_SWIZZLE_BLUE, PIPE_SWIZZLE_ONE }
34*bbecb9d1SAndroid Build Coastguard Worker #define OOOR_SWIZZLE { PIPE_SWIZZLE_ZERO, PIPE_SWIZZLE_ZERO, PIPE_SWIZZLE_ZERO, PIPE_SWIZZLE_RED }
35*bbecb9d1SAndroid Build Coastguard Worker
36*bbecb9d1SAndroid Build Coastguard Worker #define BGR1_SWIZZLE { PIPE_SWIZZLE_BLUE, PIPE_SWIZZLE_GREEN, PIPE_SWIZZLE_RED, PIPE_SWIZZLE_ONE }
37*bbecb9d1SAndroid Build Coastguard Worker #define BGRA_SWIZZLE { PIPE_SWIZZLE_BLUE, PIPE_SWIZZLE_GREEN, PIPE_SWIZZLE_RED, PIPE_SWIZZLE_ALPHA }
38*bbecb9d1SAndroid Build Coastguard Worker
39*bbecb9d1SAndroid Build Coastguard Worker #ifdef __GNUC__
40*bbecb9d1SAndroid Build Coastguard Worker /* The warning missing-field-initializers is misleading: If at least one field
41*bbecb9d1SAndroid Build Coastguard Worker * is initialized, then the un-initialized fields will be filled with zero.
42*bbecb9d1SAndroid Build Coastguard Worker * Silencing the warning by manually adding the zeros that the compiler will add
43*bbecb9d1SAndroid Build Coastguard Worker * anyway doesn't improve the code, and initializing the files by using a named
44*bbecb9d1SAndroid Build Coastguard Worker * notation will make it worse, because then he remaining fields truely be
45*bbecb9d1SAndroid Build Coastguard Worker * un-initialized.
46*bbecb9d1SAndroid Build Coastguard Worker */
47*bbecb9d1SAndroid Build Coastguard Worker #ifdef __clang__
48*bbecb9d1SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wmissing-field-initializers"
49*bbecb9d1SAndroid Build Coastguard Worker #else
50*bbecb9d1SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
51*bbecb9d1SAndroid Build Coastguard Worker #endif
52*bbecb9d1SAndroid Build Coastguard Worker #endif
53*bbecb9d1SAndroid Build Coastguard Worker
54*bbecb9d1SAndroid Build Coastguard Worker /* fill the format table */
55*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table base_rgba_formats[] =
56*bbecb9d1SAndroid Build Coastguard Worker {
57*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8G8B8X8_UNORM, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, RGB1_SWIZZLE },
58*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8G8B8A8_UNORM, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
59*bbecb9d1SAndroid Build Coastguard Worker
60*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_A8R8G8B8_UNORM, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, NO_SWIZZLE },
61*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_X8R8G8B8_UNORM, GL_RGBA8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, NO_SWIZZLE },
62*bbecb9d1SAndroid Build Coastguard Worker
63*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_A8B8G8R8_UNORM, GL_RGBA8, GL_ABGR_EXT, GL_UNSIGNED_BYTE, NO_SWIZZLE },
64*bbecb9d1SAndroid Build Coastguard Worker
65*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B4G4R4X4_UNORM, GL_RGBA4, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, RGB1_SWIZZLE },
66*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_A4B4G4R4_UNORM, GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, NO_SWIZZLE },
67*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B5G5R5X1_UNORM, GL_RGB5_A1, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, RGB1_SWIZZLE },
68*bbecb9d1SAndroid Build Coastguard Worker
69*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B5G6R5_UNORM, GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, NO_SWIZZLE },
70*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B2G3R3_UNORM, GL_R3_G3_B2, GL_RGB, GL_UNSIGNED_BYTE_3_3_2, NO_SWIZZLE },
71*bbecb9d1SAndroid Build Coastguard Worker
72*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16G16B16X16_UNORM, GL_RGBA16, GL_RGBA, GL_UNSIGNED_SHORT, RGB1_SWIZZLE },
73*bbecb9d1SAndroid Build Coastguard Worker
74*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16G16B16A16_UNORM, GL_RGBA16, GL_RGBA, GL_UNSIGNED_SHORT, NO_SWIZZLE },
75*bbecb9d1SAndroid Build Coastguard Worker };
76*bbecb9d1SAndroid Build Coastguard Worker
77*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table gl_base_rgba_formats[] =
78*bbecb9d1SAndroid Build Coastguard Worker {
79*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B4G4R4A4_UNORM, GL_RGBA4, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, NO_SWIZZLE },
80*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B5G5R5A1_UNORM, GL_RGB5_A1, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, NO_SWIZZLE },
81*bbecb9d1SAndroid Build Coastguard Worker };
82*bbecb9d1SAndroid Build Coastguard Worker
83*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table base_depth_formats[] =
84*bbecb9d1SAndroid Build Coastguard Worker {
85*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_Z16_UNORM, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NO_SWIZZLE },
86*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_Z32_UNORM, GL_DEPTH_COMPONENT32, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NO_SWIZZLE },
87*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_S8_UINT_Z24_UNORM, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NO_SWIZZLE },
88*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_Z24X8_UNORM, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NO_SWIZZLE },
89*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_Z32_FLOAT, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT, NO_SWIZZLE },
90*bbecb9d1SAndroid Build Coastguard Worker /* this is probably a separate format */
91*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_Z32_FLOAT_S8X24_UINT, GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, NO_SWIZZLE },
92*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_X24S8_UINT, GL_STENCIL_INDEX8, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, NO_SWIZZLE },
93*bbecb9d1SAndroid Build Coastguard Worker };
94*bbecb9d1SAndroid Build Coastguard Worker
95*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table base_la_formats[] = {
96*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_A8_UNORM, GL_ALPHA8, GL_ALPHA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
97*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L8_UNORM, GL_R8, GL_RED, GL_UNSIGNED_BYTE, RRR1_SWIZZLE },
98*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_A16_UNORM, GL_ALPHA16, GL_ALPHA, GL_UNSIGNED_SHORT, NO_SWIZZLE },
99*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L16_UNORM, GL_R16, GL_RED, GL_UNSIGNED_SHORT, RRR1_SWIZZLE },
100*bbecb9d1SAndroid Build Coastguard Worker };
101*bbecb9d1SAndroid Build Coastguard Worker
102*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table rg_base_formats[] = {
103*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8_UNORM, GL_R8, GL_RED, GL_UNSIGNED_BYTE, NO_SWIZZLE },
104*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8G8_UNORM, GL_RG8, GL_RG, GL_UNSIGNED_BYTE, NO_SWIZZLE },
105*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16_UNORM, GL_R16, GL_RED, GL_UNSIGNED_SHORT, NO_SWIZZLE },
106*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16G16_UNORM, GL_RG16, GL_RG, GL_UNSIGNED_SHORT, NO_SWIZZLE },
107*bbecb9d1SAndroid Build Coastguard Worker };
108*bbecb9d1SAndroid Build Coastguard Worker
109*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table integer_base_formats[] = {
110*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8G8B8A8_UINT, GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, NO_SWIZZLE },
111*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8G8B8A8_SINT, GL_RGBA8I, GL_RGBA_INTEGER, GL_BYTE, NO_SWIZZLE },
112*bbecb9d1SAndroid Build Coastguard Worker
113*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16G16B16A16_UINT, GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, NO_SWIZZLE },
114*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16G16B16A16_SINT, GL_RGBA16I, GL_RGBA_INTEGER, GL_SHORT, NO_SWIZZLE },
115*bbecb9d1SAndroid Build Coastguard Worker
116*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R32G32B32A32_UINT, GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT, NO_SWIZZLE },
117*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R32G32B32A32_SINT, GL_RGBA32I, GL_RGBA_INTEGER, GL_INT, NO_SWIZZLE },
118*bbecb9d1SAndroid Build Coastguard Worker };
119*bbecb9d1SAndroid Build Coastguard Worker
120*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table integer_3comp_formats[] = {
121*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8G8B8X8_UINT, GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, RGB1_SWIZZLE },
122*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8G8B8X8_SINT, GL_RGBA8I, GL_RGBA_INTEGER, GL_BYTE, RGB1_SWIZZLE },
123*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16G16B16X16_UINT, GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, RGB1_SWIZZLE },
124*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16G16B16X16_SINT, GL_RGBA16I, GL_RGBA_INTEGER, GL_SHORT, RGB1_SWIZZLE },
125*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R32G32B32_UINT, GL_RGB32UI, GL_RGB_INTEGER, GL_UNSIGNED_INT, NO_SWIZZLE },
126*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R32G32B32_SINT, GL_RGB32I, GL_RGB_INTEGER, GL_INT, NO_SWIZZLE },
127*bbecb9d1SAndroid Build Coastguard Worker };
128*bbecb9d1SAndroid Build Coastguard Worker
129*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table float_base_formats[] = {
130*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16G16B16A16_FLOAT, GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT, NO_SWIZZLE },
131*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R32G32B32A32_FLOAT, GL_RGBA32F, GL_RGBA, GL_FLOAT, NO_SWIZZLE },
132*bbecb9d1SAndroid Build Coastguard Worker };
133*bbecb9d1SAndroid Build Coastguard Worker
134*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table float_la_formats[] = {
135*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_A16_FLOAT, GL_R16F, GL_RED, GL_HALF_FLOAT, OOOR_SWIZZLE },
136*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L16_FLOAT, GL_R16F, GL_RED, GL_HALF_FLOAT, RRR1_SWIZZLE },
137*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L16A16_FLOAT, GL_LUMINANCE_ALPHA16F_ARB, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT, NO_SWIZZLE },
138*bbecb9d1SAndroid Build Coastguard Worker
139*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_A32_FLOAT, GL_R32F, GL_RED, GL_FLOAT, OOOR_SWIZZLE },
140*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L32_FLOAT, GL_R32F, GL_RED, GL_FLOAT, RRR1_SWIZZLE },
141*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L32A32_FLOAT, GL_LUMINANCE_ALPHA32F_ARB, GL_LUMINANCE_ALPHA, GL_FLOAT, NO_SWIZZLE },
142*bbecb9d1SAndroid Build Coastguard Worker };
143*bbecb9d1SAndroid Build Coastguard Worker
144*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table integer_rg_formats[] = {
145*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8_UINT, GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE, NO_SWIZZLE },
146*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8G8_UINT, GL_RG8UI, GL_RG_INTEGER, GL_UNSIGNED_BYTE, NO_SWIZZLE },
147*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8_SINT, GL_R8I, GL_RED_INTEGER, GL_BYTE, NO_SWIZZLE },
148*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8G8_SINT, GL_RG8I, GL_RG_INTEGER, GL_BYTE, NO_SWIZZLE },
149*bbecb9d1SAndroid Build Coastguard Worker
150*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16_UINT, GL_R16UI, GL_RED_INTEGER, GL_UNSIGNED_SHORT, NO_SWIZZLE },
151*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16G16_UINT, GL_RG16UI, GL_RG_INTEGER, GL_UNSIGNED_SHORT, NO_SWIZZLE },
152*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16_SINT, GL_R16I, GL_RED_INTEGER, GL_SHORT, NO_SWIZZLE },
153*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16G16_SINT, GL_RG16I, GL_RG_INTEGER, GL_SHORT, NO_SWIZZLE },
154*bbecb9d1SAndroid Build Coastguard Worker
155*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R32_UINT, GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT, NO_SWIZZLE },
156*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R32G32_UINT, GL_RG32UI, GL_RG_INTEGER, GL_UNSIGNED_INT, NO_SWIZZLE },
157*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R32_SINT, GL_R32I, GL_RED_INTEGER, GL_INT, NO_SWIZZLE },
158*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R32G32_SINT, GL_RG32I, GL_RG_INTEGER, GL_INT, NO_SWIZZLE },
159*bbecb9d1SAndroid Build Coastguard Worker };
160*bbecb9d1SAndroid Build Coastguard Worker
161*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table float_rg_formats[] = {
162*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16_FLOAT, GL_R16F, GL_RED, GL_HALF_FLOAT, NO_SWIZZLE },
163*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16G16_FLOAT, GL_RG16F, GL_RG, GL_HALF_FLOAT, NO_SWIZZLE },
164*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R32_FLOAT, GL_R32F, GL_RED, GL_FLOAT, NO_SWIZZLE },
165*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R32G32_FLOAT, GL_RG32F, GL_RG, GL_FLOAT, NO_SWIZZLE },
166*bbecb9d1SAndroid Build Coastguard Worker };
167*bbecb9d1SAndroid Build Coastguard Worker
168*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table float_3comp_formats[] = {
169*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16G16B16X16_FLOAT, GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT, RGB1_SWIZZLE },
170*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R32G32B32_FLOAT, GL_RGB32F, GL_RGB, GL_FLOAT, NO_SWIZZLE },
171*bbecb9d1SAndroid Build Coastguard Worker };
172*bbecb9d1SAndroid Build Coastguard Worker
173*bbecb9d1SAndroid Build Coastguard Worker
174*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table integer_la_formats[] = {
175*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_A8_UINT, GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE, OOOR_SWIZZLE },
176*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L8_UINT, GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE, RRR1_SWIZZLE },
177*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L8A8_UINT, GL_LUMINANCE_ALPHA8UI_EXT, GL_LUMINANCE_ALPHA_INTEGER_EXT, GL_UNSIGNED_BYTE, NO_SWIZZLE },
178*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_A8_SINT, GL_R8I, GL_RED_INTEGER, GL_BYTE, OOOR_SWIZZLE },
179*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L8_SINT, GL_R8I, GL_RED_INTEGER, GL_BYTE, RRR1_SWIZZLE },
180*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L8A8_SINT, GL_LUMINANCE_ALPHA8I_EXT, GL_LUMINANCE_ALPHA_INTEGER_EXT, GL_BYTE, NO_SWIZZLE },
181*bbecb9d1SAndroid Build Coastguard Worker
182*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_A16_UINT, GL_R16UI, GL_RED_INTEGER, GL_UNSIGNED_SHORT, OOOR_SWIZZLE },
183*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L16_UINT, GL_R16UI, GL_RED_INTEGER, GL_UNSIGNED_SHORT, RRR1_SWIZZLE },
184*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L16A16_UINT, GL_LUMINANCE_ALPHA16UI_EXT, GL_LUMINANCE_ALPHA_INTEGER_EXT, GL_UNSIGNED_SHORT, NO_SWIZZLE },
185*bbecb9d1SAndroid Build Coastguard Worker
186*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_A16_SINT, GL_R16I, GL_RED_INTEGER, GL_SHORT, OOOR_SWIZZLE },
187*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L16_SINT, GL_R16I, GL_RED_INTEGER, GL_SHORT, RRR1_SWIZZLE },
188*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L16A16_SINT, GL_LUMINANCE_ALPHA16I_EXT, GL_LUMINANCE_ALPHA_INTEGER_EXT, GL_SHORT, NO_SWIZZLE },
189*bbecb9d1SAndroid Build Coastguard Worker
190*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_A32_UINT, GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT, OOOR_SWIZZLE },
191*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L32_UINT, GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT, RRR1_SWIZZLE },
192*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L32A32_UINT, GL_LUMINANCE_ALPHA32UI_EXT, GL_LUMINANCE_ALPHA_INTEGER_EXT, GL_UNSIGNED_INT, NO_SWIZZLE },
193*bbecb9d1SAndroid Build Coastguard Worker
194*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_A32_SINT, GL_R32I, GL_RED_INTEGER, GL_INT, OOOR_SWIZZLE },
195*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L32_SINT, GL_R32I, GL_RED_INTEGER, GL_INT, RRR1_SWIZZLE },
196*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L32A32_SINT, GL_LUMINANCE_ALPHA32I_EXT, GL_LUMINANCE_ALPHA_INTEGER_EXT, GL_INT, NO_SWIZZLE },
197*bbecb9d1SAndroid Build Coastguard Worker
198*bbecb9d1SAndroid Build Coastguard Worker
199*bbecb9d1SAndroid Build Coastguard Worker };
200*bbecb9d1SAndroid Build Coastguard Worker
201*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table snorm_formats[] = {
202*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8_SNORM, GL_R8_SNORM, GL_RED, GL_BYTE, NO_SWIZZLE },
203*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8G8_SNORM, GL_RG8_SNORM, GL_RG, GL_BYTE, NO_SWIZZLE },
204*bbecb9d1SAndroid Build Coastguard Worker
205*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8G8B8A8_SNORM, GL_RGBA8_SNORM, GL_RGBA, GL_BYTE, NO_SWIZZLE },
206*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8G8B8X8_SNORM, GL_RGBA8_SNORM, GL_RGBA, GL_BYTE, RGB1_SWIZZLE },
207*bbecb9d1SAndroid Build Coastguard Worker
208*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16_SNORM, GL_R16_SNORM, GL_RED, GL_SHORT, NO_SWIZZLE },
209*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16G16_SNORM, GL_RG16_SNORM, GL_RG, GL_SHORT, NO_SWIZZLE },
210*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16G16B16A16_SNORM, GL_RGBA16_SNORM, GL_RGBA, GL_SHORT, NO_SWIZZLE },
211*bbecb9d1SAndroid Build Coastguard Worker
212*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R16G16B16X16_SNORM, GL_RGBA16_SNORM, GL_RGBA, GL_SHORT, RGB1_SWIZZLE },
213*bbecb9d1SAndroid Build Coastguard Worker };
214*bbecb9d1SAndroid Build Coastguard Worker
215*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table snorm_la_formats[] = {
216*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_A8_SNORM, GL_ALPHA8_SNORM, GL_ALPHA, GL_BYTE, NO_SWIZZLE },
217*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L8_SNORM, GL_R8_SNORM, GL_RED, GL_BYTE, RRR1_SWIZZLE },
218*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L8A8_SNORM, GL_LUMINANCE8_ALPHA8_SNORM, GL_LUMINANCE_ALPHA, GL_BYTE, NO_SWIZZLE },
219*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_A16_SNORM, GL_ALPHA16_SNORM, GL_ALPHA, GL_SHORT, NO_SWIZZLE },
220*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L16_SNORM, GL_R16_SNORM, GL_RED, GL_SHORT, RRR1_SWIZZLE },
221*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L16A16_SNORM, GL_LUMINANCE16_ALPHA16_SNORM, GL_LUMINANCE_ALPHA, GL_SHORT, NO_SWIZZLE },
222*bbecb9d1SAndroid Build Coastguard Worker };
223*bbecb9d1SAndroid Build Coastguard Worker
224*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table dxtn_formats[] = {
225*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_DXT1_RGB, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_RGB, GL_UNSIGNED_BYTE, NO_SWIZZLE },
226*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_DXT1_RGBA, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
227*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_DXT3_RGBA, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
228*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_DXT5_RGBA, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
229*bbecb9d1SAndroid Build Coastguard Worker };
230*bbecb9d1SAndroid Build Coastguard Worker
231*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table dxtn_srgb_formats[] = {
232*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_DXT1_SRGB, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, GL_RGB, GL_UNSIGNED_BYTE, NO_SWIZZLE },
233*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_DXT1_SRGBA, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
234*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_DXT3_SRGBA, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
235*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_DXT5_SRGBA, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
236*bbecb9d1SAndroid Build Coastguard Worker };
237*bbecb9d1SAndroid Build Coastguard Worker
238*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table etc2_formats[] = {
239*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ETC2_RGB8, GL_COMPRESSED_RGB8_ETC2, GL_RGB, GL_UNSIGNED_BYTE, NO_SWIZZLE },
240*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ETC2_SRGB8, GL_COMPRESSED_SRGB8_ETC2, GL_RGB, GL_BYTE, NO_SWIZZLE },
241*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ETC2_RGB8A1, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
242*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ETC2_SRGB8A1, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_RGBA, GL_BYTE, NO_SWIZZLE },
243*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ETC2_RGBA8, GL_COMPRESSED_RGBA8_ETC2_EAC, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
244*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ETC2_SRGBA8, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_RGBA, GL_BYTE, NO_SWIZZLE },
245*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ETC2_R11_UNORM, GL_COMPRESSED_R11_EAC, GL_RED, GL_UNSIGNED_BYTE, NO_SWIZZLE},
246*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ETC2_R11_SNORM, GL_COMPRESSED_SIGNED_R11_EAC, GL_RED, GL_BYTE, NO_SWIZZLE},
247*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ETC2_RG11_UNORM, GL_COMPRESSED_RG11_EAC, GL_RG, GL_UNSIGNED_BYTE, NO_SWIZZLE},
248*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ETC2_RG11_SNORM, GL_COMPRESSED_SIGNED_RG11_EAC, GL_RG, GL_BYTE, NO_SWIZZLE},
249*bbecb9d1SAndroid Build Coastguard Worker };
250*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table astc_formats[] = {
251*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_4x4, GL_COMPRESSED_RGBA_ASTC_4x4, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
252*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_5x4, GL_COMPRESSED_RGBA_ASTC_5x4, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
253*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_5x5, GL_COMPRESSED_RGBA_ASTC_5x5, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
254*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_6x5, GL_COMPRESSED_RGBA_ASTC_6x5, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
255*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_6x6, GL_COMPRESSED_RGBA_ASTC_6x6, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
256*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_8x5, GL_COMPRESSED_RGBA_ASTC_8x5, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
257*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_8x6, GL_COMPRESSED_RGBA_ASTC_8x6, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
258*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_8x8, GL_COMPRESSED_RGBA_ASTC_8x8, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
259*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_10x5, GL_COMPRESSED_RGBA_ASTC_10x5, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
260*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_10x6, GL_COMPRESSED_RGBA_ASTC_10x6, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
261*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_10x8, GL_COMPRESSED_RGBA_ASTC_10x8, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
262*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_10x10, GL_COMPRESSED_RGBA_ASTC_10x10, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
263*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_12x10, GL_COMPRESSED_RGBA_ASTC_12x10, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
264*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_12x12, GL_COMPRESSED_RGBA_ASTC_12x12, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
265*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_4x4_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4, GL_RGBA, GL_BYTE, NO_SWIZZLE },
266*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_5x4_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4, GL_RGBA, GL_BYTE, NO_SWIZZLE },
267*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_5x5_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5, GL_RGBA, GL_BYTE, NO_SWIZZLE },
268*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_6x5_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5, GL_RGBA, GL_BYTE, NO_SWIZZLE },
269*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_6x6_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6, GL_RGBA, GL_BYTE, NO_SWIZZLE },
270*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_8x5_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5, GL_RGBA, GL_BYTE, NO_SWIZZLE },
271*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_8x6_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6, GL_RGBA, GL_BYTE, NO_SWIZZLE },
272*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_8x8_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8, GL_RGBA, GL_BYTE, NO_SWIZZLE },
273*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_10x5_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5, GL_RGBA, GL_BYTE, NO_SWIZZLE },
274*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_10x6_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6, GL_RGBA, GL_BYTE, NO_SWIZZLE },
275*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_10x8_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8, GL_RGBA, GL_BYTE, NO_SWIZZLE },
276*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_10x10_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10, GL_RGBA, GL_BYTE, NO_SWIZZLE },
277*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_12x10_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10, GL_RGBA, GL_BYTE, NO_SWIZZLE },
278*bbecb9d1SAndroid Build Coastguard Worker {VIRGL_FORMAT_ASTC_12x12_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12, GL_RGBA, GL_BYTE, NO_SWIZZLE },
279*bbecb9d1SAndroid Build Coastguard Worker };
280*bbecb9d1SAndroid Build Coastguard Worker
281*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table rgtc_formats[] = {
282*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_RGTC1_UNORM, GL_COMPRESSED_RED_RGTC1, GL_RED, GL_UNSIGNED_BYTE, NO_SWIZZLE },
283*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_RGTC1_SNORM, GL_COMPRESSED_SIGNED_RED_RGTC1, GL_RED, GL_BYTE, NO_SWIZZLE },
284*bbecb9d1SAndroid Build Coastguard Worker
285*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_RGTC2_UNORM, GL_COMPRESSED_RG_RGTC2, GL_RG, GL_UNSIGNED_BYTE, NO_SWIZZLE },
286*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_RGTC2_SNORM, GL_COMPRESSED_SIGNED_RG_RGTC2, GL_RG, GL_BYTE, NO_SWIZZLE },
287*bbecb9d1SAndroid Build Coastguard Worker };
288*bbecb9d1SAndroid Build Coastguard Worker
289*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table srgb_formats[] = {
290*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8G8B8X8_SRGB, GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE, RGB1_SWIZZLE },
291*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8G8B8A8_SRGB, GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
292*bbecb9d1SAndroid Build Coastguard Worker
293*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_L8_SRGB, GL_SR8_EXT, GL_RED, GL_UNSIGNED_BYTE, RRR1_SWIZZLE },
294*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8_SRGB, GL_SR8_EXT, GL_RED, GL_UNSIGNED_BYTE, NO_SWIZZLE },
295*bbecb9d1SAndroid Build Coastguard Worker
296*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R8G8_SRGB, GL_SRG8_EXT, GL_RG, GL_UNSIGNED_BYTE, NO_SWIZZLE },
297*bbecb9d1SAndroid Build Coastguard Worker };
298*bbecb9d1SAndroid Build Coastguard Worker
299*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table bit10_formats[] = {
300*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B10G10R10X2_UNORM, GL_RGB10_A2, GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, RGB1_SWIZZLE },
301*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B10G10R10A2_UNORM, GL_RGB10_A2, GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, NO_SWIZZLE },
302*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B10G10R10A2_UINT, GL_RGB10_A2UI, GL_BGRA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, NO_SWIZZLE },
303*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R10G10B10X2_UNORM, GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, RGB1_SWIZZLE },
304*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, NO_SWIZZLE },
305*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R10G10B10A2_UINT, GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, NO_SWIZZLE },
306*bbecb9d1SAndroid Build Coastguard Worker };
307*bbecb9d1SAndroid Build Coastguard Worker
308*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table packed_float_formats[] = {
309*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R11G11B10_FLOAT, GL_R11F_G11F_B10F, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, NO_SWIZZLE },
310*bbecb9d1SAndroid Build Coastguard Worker };
311*bbecb9d1SAndroid Build Coastguard Worker
312*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table exponent_float_formats[] = {
313*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_R9G9B9E5_FLOAT, GL_RGB9_E5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, NO_SWIZZLE },
314*bbecb9d1SAndroid Build Coastguard Worker };
315*bbecb9d1SAndroid Build Coastguard Worker
316*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table bptc_formats[] = {
317*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_BPTC_RGBA_UNORM, GL_COMPRESSED_RGBA_BPTC_UNORM, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
318*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_BPTC_SRGBA, GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
319*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_BPTC_RGB_FLOAT, GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT, GL_RGB, GL_UNSIGNED_BYTE, NO_SWIZZLE },
320*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_BPTC_RGB_UFLOAT, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT, GL_RGB, GL_UNSIGNED_BYTE, NO_SWIZZLE },
321*bbecb9d1SAndroid Build Coastguard Worker };
322*bbecb9d1SAndroid Build Coastguard Worker
323*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table gl_bgra_formats[] = {
324*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B8G8R8X8_UNORM, GL_RGBA8, GL_BGRA, GL_UNSIGNED_BYTE, RGB1_SWIZZLE },
325*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B8G8R8A8_UNORM, GL_RGBA8, GL_BGRA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
326*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B8G8R8X8_SRGB, GL_SRGB8_ALPHA8, GL_BGRA, GL_UNSIGNED_BYTE, RGB1_SWIZZLE },
327*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B8G8R8A8_SRGB, GL_SRGB8_ALPHA8, GL_BGRA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
328*bbecb9d1SAndroid Build Coastguard Worker };
329*bbecb9d1SAndroid Build Coastguard Worker
330*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table gles_bgra_formats[] = {
331*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B8G8R8X8_UNORM, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, RGB1_SWIZZLE },
332*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B8G8R8A8_UNORM, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
333*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B8G8R8X8_SRGB, GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE, RGB1_SWIZZLE },
334*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B8G8R8A8_SRGB, GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE, NO_SWIZZLE },
335*bbecb9d1SAndroid Build Coastguard Worker };
336*bbecb9d1SAndroid Build Coastguard Worker
337*bbecb9d1SAndroid Build Coastguard Worker
338*bbecb9d1SAndroid Build Coastguard Worker
339*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table gles_z32_format[] = {
340*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_Z32_UNORM, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NO_SWIZZLE },
341*bbecb9d1SAndroid Build Coastguard Worker };
342*bbecb9d1SAndroid Build Coastguard Worker
343*bbecb9d1SAndroid Build Coastguard Worker static struct vrend_format_table gles_bit10_formats[] = {
344*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B10G10R10X2_UNORM, GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, RGB1_SWIZZLE },
345*bbecb9d1SAndroid Build Coastguard Worker { VIRGL_FORMAT_B10G10R10A2_UNORM, GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, NO_SWIZZLE },
346*bbecb9d1SAndroid Build Coastguard Worker };
347*bbecb9d1SAndroid Build Coastguard Worker
color_format_can_readback(struct vrend_format_table * virgl_format,int gles_ver)348*bbecb9d1SAndroid Build Coastguard Worker static bool color_format_can_readback(struct vrend_format_table *virgl_format, int gles_ver)
349*bbecb9d1SAndroid Build Coastguard Worker {
350*bbecb9d1SAndroid Build Coastguard Worker GLint imp = 0;
351*bbecb9d1SAndroid Build Coastguard Worker
352*bbecb9d1SAndroid Build Coastguard Worker if (virgl_format->format == VIRGL_FORMAT_R8G8B8A8_UNORM)
353*bbecb9d1SAndroid Build Coastguard Worker return true;
354*bbecb9d1SAndroid Build Coastguard Worker
355*bbecb9d1SAndroid Build Coastguard Worker if (gles_ver >= 30 &&
356*bbecb9d1SAndroid Build Coastguard Worker (virgl_format->format == VIRGL_FORMAT_R32G32B32A32_SINT ||
357*bbecb9d1SAndroid Build Coastguard Worker virgl_format->format == VIRGL_FORMAT_R32G32B32A32_UINT))
358*bbecb9d1SAndroid Build Coastguard Worker return true;
359*bbecb9d1SAndroid Build Coastguard Worker
360*bbecb9d1SAndroid Build Coastguard Worker if ((virgl_format->format == VIRGL_FORMAT_R32G32B32A32_FLOAT) &&
361*bbecb9d1SAndroid Build Coastguard Worker (gles_ver >= 32 || epoxy_has_gl_extension("GL_EXT_color_buffer_float")))
362*bbecb9d1SAndroid Build Coastguard Worker return true;
363*bbecb9d1SAndroid Build Coastguard Worker
364*bbecb9d1SAndroid Build Coastguard Worker /* Hotfix for the CI, on GLES these formats are defined like
365*bbecb9d1SAndroid Build Coastguard Worker * VIRGL_FORMAT_R10G10B10.2_UNORM, and seems to be incorrect for direct
366*bbecb9d1SAndroid Build Coastguard Worker * readback but the blit workaround seems to work, so disable the
367*bbecb9d1SAndroid Build Coastguard Worker * direct readback for these two formats. */
368*bbecb9d1SAndroid Build Coastguard Worker if (virgl_format->format == VIRGL_FORMAT_B10G10R10A2_UNORM ||
369*bbecb9d1SAndroid Build Coastguard Worker virgl_format->format == VIRGL_FORMAT_B10G10R10X2_UNORM)
370*bbecb9d1SAndroid Build Coastguard Worker return false;
371*bbecb9d1SAndroid Build Coastguard Worker
372*bbecb9d1SAndroid Build Coastguard Worker
373*bbecb9d1SAndroid Build Coastguard Worker /* Check implementation specific readback formats */
374*bbecb9d1SAndroid Build Coastguard Worker glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &imp);
375*bbecb9d1SAndroid Build Coastguard Worker if (imp == (GLint)virgl_format->gltype) {
376*bbecb9d1SAndroid Build Coastguard Worker glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &imp);
377*bbecb9d1SAndroid Build Coastguard Worker if (imp == (GLint)virgl_format->glformat)
378*bbecb9d1SAndroid Build Coastguard Worker return true;
379*bbecb9d1SAndroid Build Coastguard Worker }
380*bbecb9d1SAndroid Build Coastguard Worker return false;
381*bbecb9d1SAndroid Build Coastguard Worker }
382*bbecb9d1SAndroid Build Coastguard Worker
depth_stencil_formats_can_readback(enum virgl_formats format)383*bbecb9d1SAndroid Build Coastguard Worker static bool depth_stencil_formats_can_readback(enum virgl_formats format)
384*bbecb9d1SAndroid Build Coastguard Worker {
385*bbecb9d1SAndroid Build Coastguard Worker switch (format) {
386*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_Z16_UNORM:
387*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_Z32_UNORM:
388*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_Z32_FLOAT:
389*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_Z24X8_UNORM:
390*bbecb9d1SAndroid Build Coastguard Worker return epoxy_has_gl_extension("GL_NV_read_depth");
391*bbecb9d1SAndroid Build Coastguard Worker
392*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_Z24_UNORM_S8_UINT:
393*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_S8_UINT_Z24_UNORM:
394*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_Z32_FLOAT_S8X24_UINT:
395*bbecb9d1SAndroid Build Coastguard Worker return epoxy_has_gl_extension("GL_NV_read_depth_stencil");
396*bbecb9d1SAndroid Build Coastguard Worker
397*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_X24S8_UINT:
398*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_S8X24_UINT:
399*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_S8_UINT:
400*bbecb9d1SAndroid Build Coastguard Worker return epoxy_has_gl_extension("GL_NV_read_stencil");
401*bbecb9d1SAndroid Build Coastguard Worker
402*bbecb9d1SAndroid Build Coastguard Worker default:
403*bbecb9d1SAndroid Build Coastguard Worker return false;
404*bbecb9d1SAndroid Build Coastguard Worker }
405*bbecb9d1SAndroid Build Coastguard Worker }
406*bbecb9d1SAndroid Build Coastguard Worker
vrend_add_formats(struct vrend_format_table * table,int num_entries)407*bbecb9d1SAndroid Build Coastguard Worker static void vrend_add_formats(struct vrend_format_table *table, int num_entries)
408*bbecb9d1SAndroid Build Coastguard Worker {
409*bbecb9d1SAndroid Build Coastguard Worker int i;
410*bbecb9d1SAndroid Build Coastguard Worker
411*bbecb9d1SAndroid Build Coastguard Worker const bool is_desktop_gl = epoxy_is_desktop_gl();
412*bbecb9d1SAndroid Build Coastguard Worker const int gles_ver = is_desktop_gl ? 0 : epoxy_gl_version();
413*bbecb9d1SAndroid Build Coastguard Worker
414*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < num_entries; i++) {
415*bbecb9d1SAndroid Build Coastguard Worker GLenum status;
416*bbecb9d1SAndroid Build Coastguard Worker bool is_depth = false;
417*bbecb9d1SAndroid Build Coastguard Worker uint32_t flags = 0;
418*bbecb9d1SAndroid Build Coastguard Worker uint32_t binding = 0;
419*bbecb9d1SAndroid Build Coastguard Worker GLuint buffers;
420*bbecb9d1SAndroid Build Coastguard Worker GLuint tex_id, fb_id;
421*bbecb9d1SAndroid Build Coastguard Worker
422*bbecb9d1SAndroid Build Coastguard Worker /**/
423*bbecb9d1SAndroid Build Coastguard Worker glGenTextures(1, &tex_id);
424*bbecb9d1SAndroid Build Coastguard Worker glGenFramebuffers(1, &fb_id);
425*bbecb9d1SAndroid Build Coastguard Worker
426*bbecb9d1SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex_id);
427*bbecb9d1SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fb_id);
428*bbecb9d1SAndroid Build Coastguard Worker
429*bbecb9d1SAndroid Build Coastguard Worker /* The error state should be clear here */
430*bbecb9d1SAndroid Build Coastguard Worker status = glGetError();
431*bbecb9d1SAndroid Build Coastguard Worker assert(status == GL_NO_ERROR);
432*bbecb9d1SAndroid Build Coastguard Worker
433*bbecb9d1SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, table[i].internalformat, 32, 32, 0, table[i].glformat, table[i].gltype, NULL);
434*bbecb9d1SAndroid Build Coastguard Worker status = glGetError();
435*bbecb9d1SAndroid Build Coastguard Worker /* Currently possible errors are:
436*bbecb9d1SAndroid Build Coastguard Worker * * GL_INVALID_VALUE
437*bbecb9d1SAndroid Build Coastguard Worker * * GL_INVALID_ENUM
438*bbecb9d1SAndroid Build Coastguard Worker * * GL_INVALID_OPERATION
439*bbecb9d1SAndroid Build Coastguard Worker * * GL_OUT_OF_MEMORY
440*bbecb9d1SAndroid Build Coastguard Worker */
441*bbecb9d1SAndroid Build Coastguard Worker if (status != GL_NO_ERROR) {
442*bbecb9d1SAndroid Build Coastguard Worker struct vrend_format_table *entry = NULL;
443*bbecb9d1SAndroid Build Coastguard Worker uint8_t swizzle[4];
444*bbecb9d1SAndroid Build Coastguard Worker binding = VIRGL_BIND_SAMPLER_VIEW | VIRGL_BIND_RENDER_TARGET;
445*bbecb9d1SAndroid Build Coastguard Worker
446*bbecb9d1SAndroid Build Coastguard Worker switch (table[i].format) {
447*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_A8_UNORM:
448*bbecb9d1SAndroid Build Coastguard Worker entry = &rg_base_formats[0];
449*bbecb9d1SAndroid Build Coastguard Worker swizzle[0] = swizzle[1] = swizzle[2] = PIPE_SWIZZLE_ZERO;
450*bbecb9d1SAndroid Build Coastguard Worker swizzle[3] = PIPE_SWIZZLE_RED;
451*bbecb9d1SAndroid Build Coastguard Worker flags |= VIRGL_TEXTURE_NEED_SWIZZLE;
452*bbecb9d1SAndroid Build Coastguard Worker break;
453*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_A16_UNORM:
454*bbecb9d1SAndroid Build Coastguard Worker entry = &rg_base_formats[2];
455*bbecb9d1SAndroid Build Coastguard Worker swizzle[0] = swizzle[1] = swizzle[2] = PIPE_SWIZZLE_ZERO;
456*bbecb9d1SAndroid Build Coastguard Worker swizzle[3] = PIPE_SWIZZLE_RED;
457*bbecb9d1SAndroid Build Coastguard Worker flags |= VIRGL_TEXTURE_NEED_SWIZZLE;
458*bbecb9d1SAndroid Build Coastguard Worker break;
459*bbecb9d1SAndroid Build Coastguard Worker default:
460*bbecb9d1SAndroid Build Coastguard Worker break;
461*bbecb9d1SAndroid Build Coastguard Worker }
462*bbecb9d1SAndroid Build Coastguard Worker
463*bbecb9d1SAndroid Build Coastguard Worker if (entry) {
464*bbecb9d1SAndroid Build Coastguard Worker vrend_insert_format_swizzle(table[i].format, entry, binding, swizzle, flags);
465*bbecb9d1SAndroid Build Coastguard Worker }
466*bbecb9d1SAndroid Build Coastguard Worker glDeleteTextures(1, &tex_id);
467*bbecb9d1SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &fb_id);
468*bbecb9d1SAndroid Build Coastguard Worker continue;
469*bbecb9d1SAndroid Build Coastguard Worker }
470*bbecb9d1SAndroid Build Coastguard Worker
471*bbecb9d1SAndroid Build Coastguard Worker if (is_desktop_gl) {
472*bbecb9d1SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, table[i].internalformat, 32, 32, 0, table[i].glformat, table[i].gltype, NULL);
473*bbecb9d1SAndroid Build Coastguard Worker status = glGetError();
474*bbecb9d1SAndroid Build Coastguard Worker if (status == GL_NO_ERROR) {
475*bbecb9d1SAndroid Build Coastguard Worker flags |= VIRGL_TEXTURE_CAN_TARGET_RECTANGLE;
476*bbecb9d1SAndroid Build Coastguard Worker }
477*bbecb9d1SAndroid Build Coastguard Worker }
478*bbecb9d1SAndroid Build Coastguard Worker
479*bbecb9d1SAndroid Build Coastguard Worker if (table[i].format < VIRGL_FORMAT_MAX && util_format_is_depth_or_stencil(table[i].format)) {
480*bbecb9d1SAndroid Build Coastguard Worker GLenum attachment;
481*bbecb9d1SAndroid Build Coastguard Worker
482*bbecb9d1SAndroid Build Coastguard Worker if (table[i].format == VIRGL_FORMAT_Z24X8_UNORM || table[i].format == VIRGL_FORMAT_Z32_UNORM || table[i].format == VIRGL_FORMAT_Z16_UNORM || table[i].format == VIRGL_FORMAT_Z32_FLOAT)
483*bbecb9d1SAndroid Build Coastguard Worker attachment = GL_DEPTH_ATTACHMENT;
484*bbecb9d1SAndroid Build Coastguard Worker else
485*bbecb9d1SAndroid Build Coastguard Worker attachment = GL_DEPTH_STENCIL_ATTACHMENT;
486*bbecb9d1SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, tex_id, 0);
487*bbecb9d1SAndroid Build Coastguard Worker
488*bbecb9d1SAndroid Build Coastguard Worker is_depth = true;
489*bbecb9d1SAndroid Build Coastguard Worker
490*bbecb9d1SAndroid Build Coastguard Worker buffers = GL_NONE;
491*bbecb9d1SAndroid Build Coastguard Worker glDrawBuffers(1, &buffers);
492*bbecb9d1SAndroid Build Coastguard Worker } else {
493*bbecb9d1SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex_id, 0);
494*bbecb9d1SAndroid Build Coastguard Worker
495*bbecb9d1SAndroid Build Coastguard Worker buffers = GL_COLOR_ATTACHMENT0;
496*bbecb9d1SAndroid Build Coastguard Worker glDrawBuffers(1, &buffers);
497*bbecb9d1SAndroid Build Coastguard Worker }
498*bbecb9d1SAndroid Build Coastguard Worker
499*bbecb9d1SAndroid Build Coastguard Worker status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
500*bbecb9d1SAndroid Build Coastguard Worker binding = VIRGL_BIND_SAMPLER_VIEW;
501*bbecb9d1SAndroid Build Coastguard Worker if (status == GL_FRAMEBUFFER_COMPLETE)
502*bbecb9d1SAndroid Build Coastguard Worker binding |= is_depth ? VIRGL_BIND_DEPTH_STENCIL : VIRGL_BIND_RENDER_TARGET;
503*bbecb9d1SAndroid Build Coastguard Worker
504*bbecb9d1SAndroid Build Coastguard Worker /* On OpenGL all textures can be read back using glGetTexImage, but on GLES
505*bbecb9d1SAndroid Build Coastguard Worker we have to be able to bind textures to framebuffers, and use glReadPixels
506*bbecb9d1SAndroid Build Coastguard Worker to get the data. And apart from a few formats where support is required
507*bbecb9d1SAndroid Build Coastguard Worker (by the GLES version), we have to query the driver to identify additional
508*bbecb9d1SAndroid Build Coastguard Worker formats that are supported as destination formats by glReadPixels. */
509*bbecb9d1SAndroid Build Coastguard Worker if (is_desktop_gl ||
510*bbecb9d1SAndroid Build Coastguard Worker (status == GL_FRAMEBUFFER_COMPLETE &&
511*bbecb9d1SAndroid Build Coastguard Worker (is_depth ? depth_stencil_formats_can_readback(table[i].format) :
512*bbecb9d1SAndroid Build Coastguard Worker color_format_can_readback(&table[i], gles_ver))))
513*bbecb9d1SAndroid Build Coastguard Worker flags |= VIRGL_TEXTURE_CAN_READBACK;
514*bbecb9d1SAndroid Build Coastguard Worker
515*bbecb9d1SAndroid Build Coastguard Worker glDeleteTextures(1, &tex_id);
516*bbecb9d1SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &fb_id);
517*bbecb9d1SAndroid Build Coastguard Worker
518*bbecb9d1SAndroid Build Coastguard Worker if (table[i].swizzle[0] != SWIZZLE_INVALID)
519*bbecb9d1SAndroid Build Coastguard Worker vrend_insert_format_swizzle(table[i].format, &table[i], binding, table[i].swizzle, flags);
520*bbecb9d1SAndroid Build Coastguard Worker else
521*bbecb9d1SAndroid Build Coastguard Worker vrend_insert_format(&table[i], binding, flags);
522*bbecb9d1SAndroid Build Coastguard Worker }
523*bbecb9d1SAndroid Build Coastguard Worker }
524*bbecb9d1SAndroid Build Coastguard Worker
vrend_add_compressed_formats(struct vrend_format_table * table,int num_entries)525*bbecb9d1SAndroid Build Coastguard Worker static void vrend_add_compressed_formats(struct vrend_format_table *table, int num_entries)
526*bbecb9d1SAndroid Build Coastguard Worker {
527*bbecb9d1SAndroid Build Coastguard Worker int flags = epoxy_is_desktop_gl() ? VIRGL_TEXTURE_CAN_READBACK : 0;
528*bbecb9d1SAndroid Build Coastguard Worker for (int i = 0; i < num_entries; i++) {
529*bbecb9d1SAndroid Build Coastguard Worker vrend_insert_format(&table[i], VIRGL_BIND_SAMPLER_VIEW, flags);
530*bbecb9d1SAndroid Build Coastguard Worker }
531*bbecb9d1SAndroid Build Coastguard Worker }
532*bbecb9d1SAndroid Build Coastguard Worker
533*bbecb9d1SAndroid Build Coastguard Worker
534*bbecb9d1SAndroid Build Coastguard Worker #define add_formats(x) vrend_add_formats((x), ARRAY_SIZE((x)))
535*bbecb9d1SAndroid Build Coastguard Worker #define add_compressed_formats(x) vrend_add_compressed_formats((x), ARRAY_SIZE((x)))
536*bbecb9d1SAndroid Build Coastguard Worker
vrend_build_format_list_common(void)537*bbecb9d1SAndroid Build Coastguard Worker void vrend_build_format_list_common(void)
538*bbecb9d1SAndroid Build Coastguard Worker {
539*bbecb9d1SAndroid Build Coastguard Worker add_formats(base_rgba_formats);
540*bbecb9d1SAndroid Build Coastguard Worker add_formats(base_depth_formats);
541*bbecb9d1SAndroid Build Coastguard Worker add_formats(base_la_formats);
542*bbecb9d1SAndroid Build Coastguard Worker
543*bbecb9d1SAndroid Build Coastguard Worker /* float support */
544*bbecb9d1SAndroid Build Coastguard Worker add_formats(float_base_formats);
545*bbecb9d1SAndroid Build Coastguard Worker add_formats(float_la_formats);
546*bbecb9d1SAndroid Build Coastguard Worker add_formats(float_3comp_formats);
547*bbecb9d1SAndroid Build Coastguard Worker
548*bbecb9d1SAndroid Build Coastguard Worker /* texture integer support ? */
549*bbecb9d1SAndroid Build Coastguard Worker add_formats(integer_base_formats);
550*bbecb9d1SAndroid Build Coastguard Worker add_formats(integer_la_formats);
551*bbecb9d1SAndroid Build Coastguard Worker add_formats(integer_3comp_formats);
552*bbecb9d1SAndroid Build Coastguard Worker
553*bbecb9d1SAndroid Build Coastguard Worker /* RG support? */
554*bbecb9d1SAndroid Build Coastguard Worker add_formats(rg_base_formats);
555*bbecb9d1SAndroid Build Coastguard Worker /* integer + rg */
556*bbecb9d1SAndroid Build Coastguard Worker add_formats(integer_rg_formats);
557*bbecb9d1SAndroid Build Coastguard Worker /* float + rg */
558*bbecb9d1SAndroid Build Coastguard Worker add_formats(float_rg_formats);
559*bbecb9d1SAndroid Build Coastguard Worker
560*bbecb9d1SAndroid Build Coastguard Worker /* snorm */
561*bbecb9d1SAndroid Build Coastguard Worker add_formats(snorm_formats);
562*bbecb9d1SAndroid Build Coastguard Worker add_formats(snorm_la_formats);
563*bbecb9d1SAndroid Build Coastguard Worker
564*bbecb9d1SAndroid Build Coastguard Worker /* compressed */
565*bbecb9d1SAndroid Build Coastguard Worker if (epoxy_has_gl_extension("GL_S3_s3tc") ||
566*bbecb9d1SAndroid Build Coastguard Worker epoxy_has_gl_extension("GL_EXT_texture_compression_s3tc") ||
567*bbecb9d1SAndroid Build Coastguard Worker epoxy_has_gl_extension("GL_ANGLE_texture_compression_dxt")) {
568*bbecb9d1SAndroid Build Coastguard Worker add_compressed_formats(dxtn_formats);
569*bbecb9d1SAndroid Build Coastguard Worker add_compressed_formats(dxtn_srgb_formats);
570*bbecb9d1SAndroid Build Coastguard Worker }
571*bbecb9d1SAndroid Build Coastguard Worker
572*bbecb9d1SAndroid Build Coastguard Worker if (epoxy_has_gl_extension("GL_ARB_texture_compression_rgtc") ||
573*bbecb9d1SAndroid Build Coastguard Worker epoxy_has_gl_extension("GL_EXT_texture_compression_rgtc") )
574*bbecb9d1SAndroid Build Coastguard Worker add_compressed_formats(rgtc_formats);
575*bbecb9d1SAndroid Build Coastguard Worker
576*bbecb9d1SAndroid Build Coastguard Worker if (epoxy_has_gl_extension("GL_ARB_texture_compression_bptc") ||
577*bbecb9d1SAndroid Build Coastguard Worker epoxy_has_gl_extension("GL_EXT_texture_compression_bptc"))
578*bbecb9d1SAndroid Build Coastguard Worker add_compressed_formats(bptc_formats);
579*bbecb9d1SAndroid Build Coastguard Worker
580*bbecb9d1SAndroid Build Coastguard Worker add_formats(srgb_formats);
581*bbecb9d1SAndroid Build Coastguard Worker
582*bbecb9d1SAndroid Build Coastguard Worker add_formats(bit10_formats);
583*bbecb9d1SAndroid Build Coastguard Worker
584*bbecb9d1SAndroid Build Coastguard Worker add_formats(packed_float_formats);
585*bbecb9d1SAndroid Build Coastguard Worker add_formats(exponent_float_formats);
586*bbecb9d1SAndroid Build Coastguard Worker }
587*bbecb9d1SAndroid Build Coastguard Worker
588*bbecb9d1SAndroid Build Coastguard Worker
vrend_build_format_list_gl(void)589*bbecb9d1SAndroid Build Coastguard Worker void vrend_build_format_list_gl(void)
590*bbecb9d1SAndroid Build Coastguard Worker {
591*bbecb9d1SAndroid Build Coastguard Worker /* GL_BGRA formats aren't as well supported in GLES as in GL, specially in
592*bbecb9d1SAndroid Build Coastguard Worker * transfer operations. So we only register support for it in GL.
593*bbecb9d1SAndroid Build Coastguard Worker */
594*bbecb9d1SAndroid Build Coastguard Worker add_formats(gl_base_rgba_formats);
595*bbecb9d1SAndroid Build Coastguard Worker add_formats(gl_bgra_formats);
596*bbecb9d1SAndroid Build Coastguard Worker }
597*bbecb9d1SAndroid Build Coastguard Worker
vrend_build_format_list_gles(void)598*bbecb9d1SAndroid Build Coastguard Worker void vrend_build_format_list_gles(void)
599*bbecb9d1SAndroid Build Coastguard Worker {
600*bbecb9d1SAndroid Build Coastguard Worker /* The BGR[A|X] formats is required but OpenGL ES does not
601*bbecb9d1SAndroid Build Coastguard Worker * support it as nicely as OpenGL. We could try to use BGRA_EXT from
602*bbecb9d1SAndroid Build Coastguard Worker * EXT_texture_format_BGRA8888, but it becomes error prone when mixed
603*bbecb9d1SAndroid Build Coastguard Worker * with BGR*_SRGB formats and framebuffer multisampling. Instead, on
604*bbecb9d1SAndroid Build Coastguard Worker * GLES hosts, we always emulate BGR* as GL_RGB* with a swizzle on
605*bbecb9d1SAndroid Build Coastguard Worker * transfers to/from the host.
606*bbecb9d1SAndroid Build Coastguard Worker */
607*bbecb9d1SAndroid Build Coastguard Worker add_formats(gles_bgra_formats);
608*bbecb9d1SAndroid Build Coastguard Worker
609*bbecb9d1SAndroid Build Coastguard Worker /* The Z32 format is required, but OpenGL ES does not support
610*bbecb9d1SAndroid Build Coastguard Worker * using it as a depth buffer. We just fake support with Z24
611*bbecb9d1SAndroid Build Coastguard Worker * and hope nobody notices.
612*bbecb9d1SAndroid Build Coastguard Worker */
613*bbecb9d1SAndroid Build Coastguard Worker add_formats(gles_z32_format);
614*bbecb9d1SAndroid Build Coastguard Worker add_formats(gles_bit10_formats);
615*bbecb9d1SAndroid Build Coastguard Worker
616*bbecb9d1SAndroid Build Coastguard Worker if (epoxy_has_gl_extension("GL_KHR_texture_compression_astc_ldr"))
617*bbecb9d1SAndroid Build Coastguard Worker add_compressed_formats(astc_formats);
618*bbecb9d1SAndroid Build Coastguard Worker
619*bbecb9d1SAndroid Build Coastguard Worker if (epoxy_gl_version() >= 30) {
620*bbecb9d1SAndroid Build Coastguard Worker add_compressed_formats(etc2_formats);
621*bbecb9d1SAndroid Build Coastguard Worker }
622*bbecb9d1SAndroid Build Coastguard Worker
623*bbecb9d1SAndroid Build Coastguard Worker }
624*bbecb9d1SAndroid Build Coastguard Worker
625*bbecb9d1SAndroid Build Coastguard Worker /* glTexStorage may not support all that is supported by glTexImage,
626*bbecb9d1SAndroid Build Coastguard Worker * so add a flag to indicate when it can be used.
627*bbecb9d1SAndroid Build Coastguard Worker */
vrend_check_texture_storage(struct vrend_format_table * table)628*bbecb9d1SAndroid Build Coastguard Worker void vrend_check_texture_storage(struct vrend_format_table *table)
629*bbecb9d1SAndroid Build Coastguard Worker {
630*bbecb9d1SAndroid Build Coastguard Worker int i;
631*bbecb9d1SAndroid Build Coastguard Worker GLuint tex_id;
632*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < VIRGL_FORMAT_MAX_EXTENDED; i++) {
633*bbecb9d1SAndroid Build Coastguard Worker
634*bbecb9d1SAndroid Build Coastguard Worker if (table[i].internalformat != 0 &&
635*bbecb9d1SAndroid Build Coastguard Worker !(table[i].flags & VIRGL_TEXTURE_CAN_TEXTURE_STORAGE)) {
636*bbecb9d1SAndroid Build Coastguard Worker glGenTextures(1, &tex_id);
637*bbecb9d1SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex_id);
638*bbecb9d1SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, table[i].internalformat, 32, 32);
639*bbecb9d1SAndroid Build Coastguard Worker if (glGetError() == GL_NO_ERROR)
640*bbecb9d1SAndroid Build Coastguard Worker table[i].flags |= VIRGL_TEXTURE_CAN_TEXTURE_STORAGE;
641*bbecb9d1SAndroid Build Coastguard Worker glDeleteTextures(1, &tex_id);
642*bbecb9d1SAndroid Build Coastguard Worker }
643*bbecb9d1SAndroid Build Coastguard Worker }
644*bbecb9d1SAndroid Build Coastguard Worker }
645*bbecb9d1SAndroid Build Coastguard Worker
vrend_check_texture_multisample(struct vrend_format_table * table,bool enable_storage)646*bbecb9d1SAndroid Build Coastguard Worker void vrend_check_texture_multisample(struct vrend_format_table *table,
647*bbecb9d1SAndroid Build Coastguard Worker bool enable_storage)
648*bbecb9d1SAndroid Build Coastguard Worker {
649*bbecb9d1SAndroid Build Coastguard Worker bool is_desktop_gl = epoxy_is_desktop_gl();
650*bbecb9d1SAndroid Build Coastguard Worker for (int i = 0; i < VIRGL_FORMAT_MAX_EXTENDED; i++) {
651*bbecb9d1SAndroid Build Coastguard Worker bool function_available =
652*bbecb9d1SAndroid Build Coastguard Worker (table[i].flags & VIRGL_TEXTURE_CAN_TEXTURE_STORAGE) ? enable_storage : is_desktop_gl;
653*bbecb9d1SAndroid Build Coastguard Worker
654*bbecb9d1SAndroid Build Coastguard Worker if (table[i].internalformat != 0 &&
655*bbecb9d1SAndroid Build Coastguard Worker !(table[i].flags & VIRGL_TEXTURE_CAN_MULTISAMPLE) &&
656*bbecb9d1SAndroid Build Coastguard Worker function_available) {
657*bbecb9d1SAndroid Build Coastguard Worker GLuint tex_id;
658*bbecb9d1SAndroid Build Coastguard Worker glGenTextures(1, &tex_id);
659*bbecb9d1SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex_id);
660*bbecb9d1SAndroid Build Coastguard Worker if (table[i].flags & VIRGL_TEXTURE_CAN_TEXTURE_STORAGE) {
661*bbecb9d1SAndroid Build Coastguard Worker glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2,
662*bbecb9d1SAndroid Build Coastguard Worker table[i].internalformat, 32, 32, GL_TRUE);
663*bbecb9d1SAndroid Build Coastguard Worker } else {
664*bbecb9d1SAndroid Build Coastguard Worker glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2,
665*bbecb9d1SAndroid Build Coastguard Worker table[i].internalformat, 32, 32, GL_TRUE);
666*bbecb9d1SAndroid Build Coastguard Worker }
667*bbecb9d1SAndroid Build Coastguard Worker if (glGetError() == GL_NO_ERROR)
668*bbecb9d1SAndroid Build Coastguard Worker table[i].flags |= VIRGL_TEXTURE_CAN_MULTISAMPLE;
669*bbecb9d1SAndroid Build Coastguard Worker glDeleteTextures(1, &tex_id);
670*bbecb9d1SAndroid Build Coastguard Worker }
671*bbecb9d1SAndroid Build Coastguard Worker }
672*bbecb9d1SAndroid Build Coastguard Worker }
673*bbecb9d1SAndroid Build Coastguard Worker
vrend_check_framebuffer_mixed_color_attachements(void)674*bbecb9d1SAndroid Build Coastguard Worker bool vrend_check_framebuffer_mixed_color_attachements(void)
675*bbecb9d1SAndroid Build Coastguard Worker {
676*bbecb9d1SAndroid Build Coastguard Worker GLuint tex_id[2];
677*bbecb9d1SAndroid Build Coastguard Worker GLuint fb_id;
678*bbecb9d1SAndroid Build Coastguard Worker bool retval = false;
679*bbecb9d1SAndroid Build Coastguard Worker
680*bbecb9d1SAndroid Build Coastguard Worker glGenTextures(2, tex_id);
681*bbecb9d1SAndroid Build Coastguard Worker glGenFramebuffers(1, &fb_id);
682*bbecb9d1SAndroid Build Coastguard Worker
683*bbecb9d1SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex_id[0]);
684*bbecb9d1SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
685*bbecb9d1SAndroid Build Coastguard Worker
686*bbecb9d1SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fb_id);
687*bbecb9d1SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex_id[0], 0);
688*bbecb9d1SAndroid Build Coastguard Worker
689*bbecb9d1SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex_id[1]);
690*bbecb9d1SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 32, 32, 0, GL_RED, GL_UNSIGNED_BYTE, NULL);
691*bbecb9d1SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, tex_id[1], 0);
692*bbecb9d1SAndroid Build Coastguard Worker
693*bbecb9d1SAndroid Build Coastguard Worker
694*bbecb9d1SAndroid Build Coastguard Worker retval = glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE;
695*bbecb9d1SAndroid Build Coastguard Worker
696*bbecb9d1SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &fb_id);
697*bbecb9d1SAndroid Build Coastguard Worker glDeleteTextures(2, tex_id);
698*bbecb9d1SAndroid Build Coastguard Worker
699*bbecb9d1SAndroid Build Coastguard Worker return retval;
700*bbecb9d1SAndroid Build Coastguard Worker }
701*bbecb9d1SAndroid Build Coastguard Worker
702*bbecb9d1SAndroid Build Coastguard Worker
vrend_renderer_query_multisample_caps(unsigned max_samples,struct virgl_caps_v2 * caps)703*bbecb9d1SAndroid Build Coastguard Worker unsigned vrend_renderer_query_multisample_caps(unsigned max_samples, struct virgl_caps_v2 *caps)
704*bbecb9d1SAndroid Build Coastguard Worker {
705*bbecb9d1SAndroid Build Coastguard Worker GLuint tex;
706*bbecb9d1SAndroid Build Coastguard Worker GLuint fbo;
707*bbecb9d1SAndroid Build Coastguard Worker GLenum status;
708*bbecb9d1SAndroid Build Coastguard Worker
709*bbecb9d1SAndroid Build Coastguard Worker uint max_samples_confirmed = 1;
710*bbecb9d1SAndroid Build Coastguard Worker uint test_num_samples[4] = {2,4,8,16};
711*bbecb9d1SAndroid Build Coastguard Worker int out_buf_offsets[4] = {0,1,2,4};
712*bbecb9d1SAndroid Build Coastguard Worker int lowest_working_ms_count_idx = -1;
713*bbecb9d1SAndroid Build Coastguard Worker
714*bbecb9d1SAndroid Build Coastguard Worker assert(glGetError() == GL_NO_ERROR &&
715*bbecb9d1SAndroid Build Coastguard Worker "Stale error state detected, please check for failures in initialization");
716*bbecb9d1SAndroid Build Coastguard Worker
717*bbecb9d1SAndroid Build Coastguard Worker glGenFramebuffers( 1, &fbo );
718*bbecb9d1SAndroid Build Coastguard Worker memset(caps->sample_locations, 0, 8 * sizeof(uint32_t));
719*bbecb9d1SAndroid Build Coastguard Worker
720*bbecb9d1SAndroid Build Coastguard Worker for (int i = 3; i >= 0; i--) {
721*bbecb9d1SAndroid Build Coastguard Worker if (test_num_samples[i] > max_samples)
722*bbecb9d1SAndroid Build Coastguard Worker continue;
723*bbecb9d1SAndroid Build Coastguard Worker glGenTextures(1, &tex);
724*bbecb9d1SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex);
725*bbecb9d1SAndroid Build Coastguard Worker glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, test_num_samples[i], GL_RGBA32F, 64, 64, GL_TRUE);
726*bbecb9d1SAndroid Build Coastguard Worker status = glGetError();
727*bbecb9d1SAndroid Build Coastguard Worker if (status == GL_NO_ERROR) {
728*bbecb9d1SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
729*bbecb9d1SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, tex, 0);
730*bbecb9d1SAndroid Build Coastguard Worker status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
731*bbecb9d1SAndroid Build Coastguard Worker if (status == GL_FRAMEBUFFER_COMPLETE) {
732*bbecb9d1SAndroid Build Coastguard Worker if (max_samples_confirmed < test_num_samples[i])
733*bbecb9d1SAndroid Build Coastguard Worker max_samples_confirmed = test_num_samples[i];
734*bbecb9d1SAndroid Build Coastguard Worker
735*bbecb9d1SAndroid Build Coastguard Worker for (uint k = 0; k < test_num_samples[i]; ++k) {
736*bbecb9d1SAndroid Build Coastguard Worker float msp[2];
737*bbecb9d1SAndroid Build Coastguard Worker uint32_t compressed;
738*bbecb9d1SAndroid Build Coastguard Worker glGetMultisamplefv(GL_SAMPLE_POSITION, k, msp);
739*bbecb9d1SAndroid Build Coastguard Worker compressed = ((unsigned)(floor(msp[0] * 16.0f)) & 0xf) << 4;
740*bbecb9d1SAndroid Build Coastguard Worker compressed |= ((unsigned)(floor(msp[1] * 16.0f)) & 0xf);
741*bbecb9d1SAndroid Build Coastguard Worker caps->sample_locations[out_buf_offsets[i] + (k >> 2)] |= compressed << (8 * (k & 3));
742*bbecb9d1SAndroid Build Coastguard Worker }
743*bbecb9d1SAndroid Build Coastguard Worker lowest_working_ms_count_idx = i;
744*bbecb9d1SAndroid Build Coastguard Worker } else {
745*bbecb9d1SAndroid Build Coastguard Worker /* If a framebuffer doesn't support low sample counts,
746*bbecb9d1SAndroid Build Coastguard Worker * use the sample position from the last working larger count. */
747*bbecb9d1SAndroid Build Coastguard Worker if (lowest_working_ms_count_idx > 0) {
748*bbecb9d1SAndroid Build Coastguard Worker for (uint k = 0; k < test_num_samples[i]; ++k) {
749*bbecb9d1SAndroid Build Coastguard Worker caps->sample_locations[out_buf_offsets[i] + (k >> 2)] =
750*bbecb9d1SAndroid Build Coastguard Worker caps->sample_locations[out_buf_offsets[lowest_working_ms_count_idx] + (k >> 2)];
751*bbecb9d1SAndroid Build Coastguard Worker }
752*bbecb9d1SAndroid Build Coastguard Worker }
753*bbecb9d1SAndroid Build Coastguard Worker }
754*bbecb9d1SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
755*bbecb9d1SAndroid Build Coastguard Worker }
756*bbecb9d1SAndroid Build Coastguard Worker glDeleteTextures(1, &tex);
757*bbecb9d1SAndroid Build Coastguard Worker }
758*bbecb9d1SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &fbo);
759*bbecb9d1SAndroid Build Coastguard Worker return max_samples_confirmed;
760*bbecb9d1SAndroid Build Coastguard Worker }
761*bbecb9d1SAndroid Build Coastguard Worker
762*bbecb9d1SAndroid Build Coastguard Worker /* returns: 1 = compatible, -1 = not compatible, 0 = undecided */
format_uncompressed_compressed_copy_compatible(enum virgl_formats src,enum virgl_formats dst)763*bbecb9d1SAndroid Build Coastguard Worker static int format_uncompressed_compressed_copy_compatible(enum virgl_formats src,
764*bbecb9d1SAndroid Build Coastguard Worker enum virgl_formats dst)
765*bbecb9d1SAndroid Build Coastguard Worker {
766*bbecb9d1SAndroid Build Coastguard Worker
767*bbecb9d1SAndroid Build Coastguard Worker switch (src) {
768*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_R32G32B32A32_UINT:
769*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_R32G32B32A32_SINT:
770*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_R32G32B32A32_FLOAT:
771*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_R32G32B32A32_SNORM:
772*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_R32G32B32A32_UNORM:
773*bbecb9d1SAndroid Build Coastguard Worker switch (dst) {
774*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_DXT3_RGBA:
775*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_DXT3_SRGBA:
776*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_DXT5_RGBA:
777*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_DXT5_SRGBA:
778*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_RGTC2_UNORM:
779*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_RGTC2_SNORM:
780*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_BPTC_RGBA_UNORM:
781*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_BPTC_SRGBA:
782*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_BPTC_RGB_FLOAT:
783*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_BPTC_RGB_UFLOAT:
784*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ETC2_RGBA8:
785*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ETC2_SRGBA8:
786*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ETC2_RG11_UNORM:
787*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ETC2_RG11_SNORM:
788*bbecb9d1SAndroid Build Coastguard Worker return 1;
789*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_4x4:
790*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_5x4:
791*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_5x5:
792*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_6x5:
793*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_6x6:
794*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_8x5:
795*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_8x6:
796*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_8x8:
797*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_10x5:
798*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_10x6:
799*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_10x8:
800*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_10x10:
801*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_12x10:
802*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_12x12:
803*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_4x4_SRGB:
804*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_5x4_SRGB:
805*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_5x5_SRGB:
806*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_6x5_SRGB:
807*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_6x6_SRGB:
808*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_8x5_SRGB:
809*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_8x6_SRGB:
810*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_8x8_SRGB:
811*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_10x5_SRGB:
812*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_10x6_SRGB:
813*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_10x8_SRGB:
814*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_10x10_SRGB:
815*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_12x10_SRGB:
816*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ASTC_12x12_SRGB:
817*bbecb9d1SAndroid Build Coastguard Worker return epoxy_is_desktop_gl() ? -1 : 1;
818*bbecb9d1SAndroid Build Coastguard Worker default:
819*bbecb9d1SAndroid Build Coastguard Worker return -1;
820*bbecb9d1SAndroid Build Coastguard Worker }
821*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_R16G16B16A16_UINT:
822*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_R16G16B16A16_SINT:
823*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_R16G16B16A16_FLOAT:
824*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_R16G16B16A16_SNORM:
825*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_R16G16B16A16_UNORM:
826*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_R32G32_UINT:
827*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_R32G32_SINT:
828*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_R32G32_FLOAT:
829*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_R32G32_UNORM:
830*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_R32G32_SNORM:
831*bbecb9d1SAndroid Build Coastguard Worker switch (dst) {
832*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_DXT1_RGBA:
833*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_DXT1_SRGBA:
834*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_DXT1_RGB:
835*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_DXT1_SRGB:
836*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_RGTC1_UNORM:
837*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_RGTC1_SNORM:
838*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ETC2_RGB8:
839*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ETC2_SRGB8:
840*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ETC2_RGB8A1:
841*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ETC2_SRGB8A1:
842*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ETC2_R11_UNORM:
843*bbecb9d1SAndroid Build Coastguard Worker case VIRGL_FORMAT_ETC2_R11_SNORM:
844*bbecb9d1SAndroid Build Coastguard Worker return 1;
845*bbecb9d1SAndroid Build Coastguard Worker default:
846*bbecb9d1SAndroid Build Coastguard Worker return -1;
847*bbecb9d1SAndroid Build Coastguard Worker }
848*bbecb9d1SAndroid Build Coastguard Worker default:
849*bbecb9d1SAndroid Build Coastguard Worker return 0;
850*bbecb9d1SAndroid Build Coastguard Worker }
851*bbecb9d1SAndroid Build Coastguard Worker }
852*bbecb9d1SAndroid Build Coastguard Worker
format_compressed_compressed_copy_compatible(enum virgl_formats src,enum virgl_formats dst)853*bbecb9d1SAndroid Build Coastguard Worker static boolean format_compressed_compressed_copy_compatible(enum virgl_formats src, enum virgl_formats dst)
854*bbecb9d1SAndroid Build Coastguard Worker {
855*bbecb9d1SAndroid Build Coastguard Worker const bool is_desktop_gl = epoxy_is_desktop_gl();
856*bbecb9d1SAndroid Build Coastguard Worker
857*bbecb9d1SAndroid Build Coastguard Worker if(!is_desktop_gl) {
858*bbecb9d1SAndroid Build Coastguard Worker if((src == VIRGL_FORMAT_ASTC_4x4 && dst == VIRGL_FORMAT_ASTC_4x4_SRGB) ||
859*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ASTC_5x4 && dst == VIRGL_FORMAT_ASTC_5x4_SRGB) ||
860*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ASTC_5x5 && dst == VIRGL_FORMAT_ASTC_5x5_SRGB) ||
861*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ASTC_6x5 && dst == VIRGL_FORMAT_ASTC_6x5_SRGB) ||
862*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ASTC_6x6 && dst == VIRGL_FORMAT_ASTC_6x6_SRGB) ||
863*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ASTC_8x5 && dst == VIRGL_FORMAT_ASTC_8x5_SRGB) ||
864*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ASTC_8x6 && dst == VIRGL_FORMAT_ASTC_8x6_SRGB) ||
865*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ASTC_8x8 && dst == VIRGL_FORMAT_ASTC_8x8_SRGB) ||
866*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ASTC_10x5 && dst == VIRGL_FORMAT_ASTC_10x5_SRGB) ||
867*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ASTC_10x6 && dst == VIRGL_FORMAT_ASTC_10x6_SRGB) ||
868*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ASTC_10x8 && dst == VIRGL_FORMAT_ASTC_10x8_SRGB) ||
869*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ASTC_10x10 && dst == VIRGL_FORMAT_ASTC_10x10_SRGB) ||
870*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ASTC_12x10 && dst == VIRGL_FORMAT_ASTC_12x10_SRGB) ||
871*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ASTC_12x12 && dst == VIRGL_FORMAT_ASTC_12x12_SRGB) ||
872*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ETC2_R11_UNORM && dst == VIRGL_FORMAT_ETC2_R11_SNORM) ||
873*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ETC2_RG11_UNORM && dst == VIRGL_FORMAT_ETC2_RG11_SNORM) ||
874*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ETC2_RGBA8 && dst == VIRGL_FORMAT_ETC2_SRGBA8) ||
875*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ETC2_RGB8A1 && dst == VIRGL_FORMAT_ETC2_SRGB8A1) ||
876*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_ETC2_RGB8 && dst == VIRGL_FORMAT_ETC2_SRGB8))
877*bbecb9d1SAndroid Build Coastguard Worker return true;
878*bbecb9d1SAndroid Build Coastguard Worker }
879*bbecb9d1SAndroid Build Coastguard Worker
880*bbecb9d1SAndroid Build Coastguard Worker if ((src == VIRGL_FORMAT_RGTC1_UNORM && dst == VIRGL_FORMAT_RGTC1_SNORM) ||
881*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_RGTC2_UNORM && dst == VIRGL_FORMAT_RGTC2_SNORM) ||
882*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_BPTC_RGBA_UNORM && dst == VIRGL_FORMAT_BPTC_SRGBA) ||
883*bbecb9d1SAndroid Build Coastguard Worker (src == VIRGL_FORMAT_BPTC_RGB_FLOAT && dst == VIRGL_FORMAT_BPTC_RGB_UFLOAT))
884*bbecb9d1SAndroid Build Coastguard Worker return true;
885*bbecb9d1SAndroid Build Coastguard Worker
886*bbecb9d1SAndroid Build Coastguard Worker return false;
887*bbecb9d1SAndroid Build Coastguard Worker }
888*bbecb9d1SAndroid Build Coastguard Worker
format_is_copy_compatible(enum virgl_formats src,enum virgl_formats dst,unsigned int flags)889*bbecb9d1SAndroid Build Coastguard Worker boolean format_is_copy_compatible(enum virgl_formats src, enum virgl_formats dst,
890*bbecb9d1SAndroid Build Coastguard Worker unsigned int flags)
891*bbecb9d1SAndroid Build Coastguard Worker {
892*bbecb9d1SAndroid Build Coastguard Worker int r;
893*bbecb9d1SAndroid Build Coastguard Worker
894*bbecb9d1SAndroid Build Coastguard Worker if (src == dst) {
895*bbecb9d1SAndroid Build Coastguard Worker /* When Mesa imports dma_buf VIRGL_FORMAT_B8G8R8X8_UNORM/DRM|GBM_FORMAT_XRGB8888
896*bbecb9d1SAndroid Build Coastguard Worker * it uses internal format GL_RGB8.
897*bbecb9d1SAndroid Build Coastguard Worker * But when virglrenderer creates VIRGL_FORMAT_B8G8R8X8_UNORM texture, it
898*bbecb9d1SAndroid Build Coastguard Worker * uses internal format GL_RGBA8.
899*bbecb9d1SAndroid Build Coastguard Worker * So the formats do not match when Mesa checks them internally.
900*bbecb9d1SAndroid Build Coastguard Worker */
901*bbecb9d1SAndroid Build Coastguard Worker if (flags & VREND_COPY_COMPAT_FLAG_ONE_IS_EGL_IMAGE &&
902*bbecb9d1SAndroid Build Coastguard Worker src == VIRGL_FORMAT_B8G8R8X8_UNORM)
903*bbecb9d1SAndroid Build Coastguard Worker return false;
904*bbecb9d1SAndroid Build Coastguard Worker return true;
905*bbecb9d1SAndroid Build Coastguard Worker }
906*bbecb9d1SAndroid Build Coastguard Worker
907*bbecb9d1SAndroid Build Coastguard Worker if (util_format_is_plain(src) && util_format_is_plain(dst)) {
908*bbecb9d1SAndroid Build Coastguard Worker const struct util_format_description *src_desc = util_format_description(src);
909*bbecb9d1SAndroid Build Coastguard Worker const struct util_format_description *dst_desc = util_format_description(dst);
910*bbecb9d1SAndroid Build Coastguard Worker return util_is_format_compatible(src_desc, dst_desc);
911*bbecb9d1SAndroid Build Coastguard Worker }
912*bbecb9d1SAndroid Build Coastguard Worker
913*bbecb9d1SAndroid Build Coastguard Worker if (!(flags & VREND_COPY_COMPAT_FLAG_ALLOW_COMPRESSED))
914*bbecb9d1SAndroid Build Coastguard Worker return false;
915*bbecb9d1SAndroid Build Coastguard Worker
916*bbecb9d1SAndroid Build Coastguard Worker /* compressed-uncompressed */
917*bbecb9d1SAndroid Build Coastguard Worker r = format_uncompressed_compressed_copy_compatible(src, dst);
918*bbecb9d1SAndroid Build Coastguard Worker if (r)
919*bbecb9d1SAndroid Build Coastguard Worker return r > 0;
920*bbecb9d1SAndroid Build Coastguard Worker
921*bbecb9d1SAndroid Build Coastguard Worker r = format_uncompressed_compressed_copy_compatible(dst, src);
922*bbecb9d1SAndroid Build Coastguard Worker if (r)
923*bbecb9d1SAndroid Build Coastguard Worker return r > 0;
924*bbecb9d1SAndroid Build Coastguard Worker
925*bbecb9d1SAndroid Build Coastguard Worker return format_compressed_compressed_copy_compatible(dst, src) ||
926*bbecb9d1SAndroid Build Coastguard Worker format_compressed_compressed_copy_compatible(src, dst);
927*bbecb9d1SAndroid Build Coastguard Worker }
928