Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/tests/graw/tex-srgb.c
4565 views
1
/* Test sRGB texturing.
2
*/
3
4
#include "graw_util.h"
5
6
7
static const int WIDTH = 600;
8
static const int HEIGHT = 300;
9
10
static struct graw_info info;
11
12
static struct pipe_resource *texture;
13
static struct pipe_sampler_view *linear_sv, *srgb_sv;
14
15
16
struct vertex {
17
float position[4];
18
float color[4];
19
};
20
21
static struct vertex vertices1[] =
22
{
23
{ { -0.1, -0.9, 0.0, 1.0 },
24
{ 1, 1, 0, 1 } },
25
26
{ { -0.1, 0.9, 0.0, 1.0 },
27
{ 1, 0, 0, 1 } },
28
29
{ {-0.9, 0.9, 0.0, 1.0 },
30
{ 0, 0, 0, 1 } },
31
32
{ {-0.9, -0.9, 0.0, 1.0 },
33
{ 0, 1, 0, 1 } },
34
};
35
36
37
static struct vertex vertices2[] =
38
{
39
{ { 0.9, -0.9, 0.0, 1.0 },
40
{ 1, 1, 0, 1 } },
41
42
{ { 0.9, 0.9, 0.0, 1.0 },
43
{ 1, 0, 0, 1 } },
44
45
{ { 0.1, 0.9, 0.0, 1.0 },
46
{ 0, 0, 0, 1 } },
47
48
{ { 0.1, -0.9, 0.0, 1.0 },
49
{ 0, 1, 0, 1 } },
50
};
51
52
53
54
55
static void
56
set_vertices(struct vertex *verts, unsigned num_verts)
57
{
58
struct pipe_vertex_element ve[2];
59
struct pipe_vertex_buffer vbuf;
60
void *handle;
61
62
memset(ve, 0, sizeof ve);
63
64
ve[0].src_offset = Offset(struct vertex, position);
65
ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
66
ve[1].src_offset = Offset(struct vertex, color);
67
ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
68
69
handle = info.ctx->create_vertex_elements_state(info.ctx, 2, ve);
70
info.ctx->bind_vertex_elements_state(info.ctx, handle);
71
72
memset(&vbuf, 0, sizeof vbuf);
73
74
vbuf.stride = sizeof(struct vertex);
75
vbuf.buffer_offset = 0;
76
vbuf.buffer.resource = pipe_buffer_create_with_data(info.ctx,
77
PIPE_BIND_VERTEX_BUFFER,
78
PIPE_USAGE_DEFAULT,
79
num_verts * sizeof(struct vertex),
80
verts);
81
82
info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, false, &vbuf);
83
}
84
85
static void set_vertex_shader( void )
86
{
87
void *handle;
88
const char *text =
89
"VERT\n"
90
"DCL IN[0]\n"
91
"DCL IN[1]\n"
92
"DCL OUT[0], POSITION\n"
93
"DCL OUT[1], GENERIC[0]\n"
94
" 0: MOV OUT[1], IN[1]\n"
95
" 1: MOV OUT[0], IN[0]\n"
96
" 2: END\n";
97
98
handle = graw_parse_vertex_shader(info.ctx, text);
99
info.ctx->bind_vs_state(info.ctx, handle);
100
}
101
102
static void set_fragment_shader( void )
103
{
104
void *handle;
105
const char *text =
106
"FRAG\n"
107
"DCL IN[0], GENERIC[0], PERSPECTIVE\n"
108
"DCL OUT[0], COLOR\n"
109
"DCL TEMP[0]\n"
110
"DCL SAMP[0]\n"
111
"DCL SVIEW[0], 2D, FLOAT\n"
112
" 0: TXP TEMP[0], IN[0], SAMP[0], 2D\n"
113
" 1: MOV OUT[0], TEMP[0]\n"
114
" 2: END\n";
115
116
handle = graw_parse_fragment_shader(info.ctx, text);
117
info.ctx->bind_fs_state(info.ctx, handle);
118
}
119
120
121
static void draw( void )
122
{
123
union pipe_color_union clear_color;
124
125
clear_color.f[0] = 0.5;
126
clear_color.f[1] = 0.5;
127
clear_color.f[2] = 0.5;
128
clear_color.f[3] = 1.0;
129
130
info.ctx->clear(info.ctx, PIPE_CLEAR_COLOR, NULL, &clear_color, 0, 0);
131
132
info.ctx->set_sampler_views(info.ctx, PIPE_SHADER_FRAGMENT, 0, 1, 0, &linear_sv);
133
set_vertices(vertices1, 4);
134
util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, 4);
135
136
info.ctx->set_sampler_views(info.ctx, PIPE_SHADER_FRAGMENT, 0, 1, 0, &srgb_sv);
137
set_vertices(vertices2, 4);
138
util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, 4);
139
140
info.ctx->flush(info.ctx, NULL, 0);
141
142
graw_util_flush_front(&info);
143
}
144
145
146
static void init_tex( void )
147
{
148
#define SIZE 64
149
ubyte tex2d[SIZE][SIZE][4];
150
int s, t;
151
152
for (s = 0; s < SIZE; s++) {
153
for (t = 0; t < SIZE; t++) {
154
tex2d[t][s][0] = 0;
155
tex2d[t][s][1] = s * 255 / SIZE;
156
tex2d[t][s][2] = t * 255 / SIZE;
157
tex2d[t][s][3] = 255;
158
}
159
}
160
161
texture = graw_util_create_tex2d(&info, SIZE, SIZE,
162
PIPE_FORMAT_B8G8R8A8_UNORM, tex2d);
163
164
{
165
void *sampler;
166
sampler = graw_util_create_simple_sampler(&info,
167
PIPE_TEX_WRAP_REPEAT,
168
PIPE_TEX_FILTER_NEAREST);
169
info.ctx->bind_sampler_states(info.ctx, PIPE_SHADER_FRAGMENT,
170
0, 1, &sampler);
171
}
172
173
/* linear sampler view */
174
{
175
struct pipe_sampler_view sv_temp;
176
memset(&sv_temp, 0, sizeof sv_temp);
177
sv_temp.format = PIPE_FORMAT_B8G8R8A8_UNORM;
178
sv_temp.texture = texture;
179
sv_temp.swizzle_r = PIPE_SWIZZLE_X;
180
sv_temp.swizzle_g = PIPE_SWIZZLE_Y;
181
sv_temp.swizzle_b = PIPE_SWIZZLE_Z;
182
sv_temp.swizzle_a = PIPE_SWIZZLE_W;
183
linear_sv = info.ctx->create_sampler_view(info.ctx, texture, &sv_temp);
184
if (linear_sv == NULL)
185
exit(0);
186
}
187
188
/* srgb sampler view */
189
{
190
struct pipe_sampler_view sv_temp;
191
memset(&sv_temp, 0, sizeof sv_temp);
192
sv_temp.format = PIPE_FORMAT_B8G8R8A8_SRGB;
193
sv_temp.texture = texture;
194
sv_temp.swizzle_r = PIPE_SWIZZLE_X;
195
sv_temp.swizzle_g = PIPE_SWIZZLE_Y;
196
sv_temp.swizzle_b = PIPE_SWIZZLE_Z;
197
sv_temp.swizzle_a = PIPE_SWIZZLE_W;
198
srgb_sv = info.ctx->create_sampler_view(info.ctx, texture, &sv_temp);
199
if (srgb_sv == NULL)
200
exit(0);
201
}
202
#undef SIZE
203
}
204
205
static void init( void )
206
{
207
if (!graw_util_create_window(&info, WIDTH, HEIGHT, 1, FALSE))
208
exit(1);
209
210
graw_util_default_state(&info, FALSE);
211
212
graw_util_viewport(&info, 0, 0, WIDTH, HEIGHT, 30, 10000);
213
214
init_tex();
215
216
set_vertex_shader();
217
set_fragment_shader();
218
}
219
220
221
int main( int argc, char *argv[] )
222
{
223
init();
224
225
graw_set_display_func( draw );
226
graw_main_loop();
227
return 0;
228
}
229
230