xref: /aosp_15_r20/external/virglrenderer/tests/test_virgl_cmd.c (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
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 <check.h>
25*bbecb9d1SAndroid Build Coastguard Worker #include <stdlib.h>
26*bbecb9d1SAndroid Build Coastguard Worker #include <time.h>
27*bbecb9d1SAndroid Build Coastguard Worker #include <errno.h>
28*bbecb9d1SAndroid Build Coastguard Worker #include <sys/uio.h>
29*bbecb9d1SAndroid Build Coastguard Worker #include <virglrenderer.h>
30*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_hw.h"
31*bbecb9d1SAndroid Build Coastguard Worker #include "pipe/p_format.h"
32*bbecb9d1SAndroid Build Coastguard Worker #include "testvirgl_encode.h"
33*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_protocol.h"
34*bbecb9d1SAndroid Build Coastguard Worker #include "util/u_memory.h"
35*bbecb9d1SAndroid Build Coastguard Worker 
36*bbecb9d1SAndroid Build Coastguard Worker #include "large_shader.h"
37*bbecb9d1SAndroid Build Coastguard Worker /* test creating objects with same ID causes context err */
START_TEST(virgl_test_overlap_obj_id)38*bbecb9d1SAndroid Build Coastguard Worker START_TEST(virgl_test_overlap_obj_id)
39*bbecb9d1SAndroid Build Coastguard Worker {
40*bbecb9d1SAndroid Build Coastguard Worker     int ret;
41*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_context ctx;
42*bbecb9d1SAndroid Build Coastguard Worker     int ctx_handle = 1;
43*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_init_ctx_cmdbuf(&ctx);
44*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
45*bbecb9d1SAndroid Build Coastguard Worker 
46*bbecb9d1SAndroid Build Coastguard Worker     /* set blend state */
47*bbecb9d1SAndroid Build Coastguard Worker     {
48*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_blend_state blend;
49*bbecb9d1SAndroid Build Coastguard Worker 	int blend_handle = ctx_handle;
50*bbecb9d1SAndroid Build Coastguard Worker 	memset(&blend, 0, sizeof(blend));
51*bbecb9d1SAndroid Build Coastguard Worker 	blend.rt[0].colormask = PIPE_MASK_RGBA;
52*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_blend_state(&ctx, blend_handle, &blend);
53*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_bind_object(&ctx, blend_handle, VIRGL_OBJECT_BLEND);
54*bbecb9d1SAndroid Build Coastguard Worker     }
55*bbecb9d1SAndroid Build Coastguard Worker 
56*bbecb9d1SAndroid Build Coastguard Worker     /* set depth stencil alpha state */
57*bbecb9d1SAndroid Build Coastguard Worker     {
58*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_depth_stencil_alpha_state dsa;
59*bbecb9d1SAndroid Build Coastguard Worker 	int dsa_handle = ctx_handle;
60*bbecb9d1SAndroid Build Coastguard Worker 	memset(&dsa, 0, sizeof(dsa));
61*bbecb9d1SAndroid Build Coastguard Worker 	dsa.depth.writemask = 1;
62*bbecb9d1SAndroid Build Coastguard Worker 	dsa.depth.func = PIPE_FUNC_LESS;
63*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_dsa_state(&ctx, dsa_handle, &dsa);
64*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_bind_object(&ctx, dsa_handle, VIRGL_OBJECT_DSA);
65*bbecb9d1SAndroid Build Coastguard Worker     }
66*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_fini_ctx_cmdbuf(&ctx);
67*bbecb9d1SAndroid Build Coastguard Worker }
68*bbecb9d1SAndroid Build Coastguard Worker END_TEST
69*bbecb9d1SAndroid Build Coastguard Worker 
70*bbecb9d1SAndroid Build Coastguard Worker #if UTIL_ARCH_LITTLE_ENDIAN
71*bbecb9d1SAndroid Build Coastguard Worker static const uint32_t test_green = 0xff00ff00;
72*bbecb9d1SAndroid Build Coastguard Worker #else
73*bbecb9d1SAndroid Build Coastguard Worker static const uint32_t test_green = 0x00ff00ff;
74*bbecb9d1SAndroid Build Coastguard Worker #endif
75*bbecb9d1SAndroid Build Coastguard Worker 
76*bbecb9d1SAndroid Build Coastguard Worker /* create a resource - clear it to a color, do a transfer */
START_TEST(virgl_test_clear)77*bbecb9d1SAndroid Build Coastguard Worker START_TEST(virgl_test_clear)
78*bbecb9d1SAndroid Build Coastguard Worker {
79*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_context ctx;
80*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_resource res;
81*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_surface surf;
82*bbecb9d1SAndroid Build Coastguard Worker     struct pipe_framebuffer_state fb_state;
83*bbecb9d1SAndroid Build Coastguard Worker     union pipe_color_union color;
84*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_box box;
85*bbecb9d1SAndroid Build Coastguard Worker     int ret;
86*bbecb9d1SAndroid Build Coastguard Worker     int i;
87*bbecb9d1SAndroid Build Coastguard Worker 
88*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_init_ctx_cmdbuf(&ctx);
89*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
90*bbecb9d1SAndroid Build Coastguard Worker 
91*bbecb9d1SAndroid Build Coastguard Worker     /* init and create simple 2D resource */
92*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_create_backed_simple_2d_res(&res, 1, 50, 50);
93*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
94*bbecb9d1SAndroid Build Coastguard Worker 
95*bbecb9d1SAndroid Build Coastguard Worker     /* attach resource to context */
96*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_attach_resource(ctx.ctx_id, res.handle);
97*bbecb9d1SAndroid Build Coastguard Worker 
98*bbecb9d1SAndroid Build Coastguard Worker     /* create a surface for the resource */
99*bbecb9d1SAndroid Build Coastguard Worker     memset(&surf, 0, sizeof(surf));
100*bbecb9d1SAndroid Build Coastguard Worker     surf.base.format = PIPE_FORMAT_B8G8R8X8_UNORM;
101*bbecb9d1SAndroid Build Coastguard Worker     surf.handle = 1;
102*bbecb9d1SAndroid Build Coastguard Worker     surf.base.texture = &res.base;
103*bbecb9d1SAndroid Build Coastguard Worker 
104*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_create_surface(&ctx, surf.handle, &res, &surf.base);
105*bbecb9d1SAndroid Build Coastguard Worker 
106*bbecb9d1SAndroid Build Coastguard Worker     /* set the framebuffer state */
107*bbecb9d1SAndroid Build Coastguard Worker     fb_state.nr_cbufs = 1;
108*bbecb9d1SAndroid Build Coastguard Worker     fb_state.zsbuf = NULL;
109*bbecb9d1SAndroid Build Coastguard Worker     fb_state.cbufs[0] = &surf.base;
110*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_set_framebuffer_state(&ctx, &fb_state);
111*bbecb9d1SAndroid Build Coastguard Worker 
112*bbecb9d1SAndroid Build Coastguard Worker     /* clear the resource */
113*bbecb9d1SAndroid Build Coastguard Worker     /* clear buffer to green */
114*bbecb9d1SAndroid Build Coastguard Worker     color.f[0] = 0.0;
115*bbecb9d1SAndroid Build Coastguard Worker     color.f[1] = 1.0;
116*bbecb9d1SAndroid Build Coastguard Worker     color.f[2] = 0.0;
117*bbecb9d1SAndroid Build Coastguard Worker     color.f[3] = 1.0;
118*bbecb9d1SAndroid Build Coastguard Worker     virgl_encode_clear(&ctx, PIPE_CLEAR_COLOR0, &color, 0.0, 0);
119*bbecb9d1SAndroid Build Coastguard Worker 
120*bbecb9d1SAndroid Build Coastguard Worker     /* submit the cmd stream */
121*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_submit_cmd(ctx.cbuf->buf, ctx.ctx_id, ctx.cbuf->cdw);
122*bbecb9d1SAndroid Build Coastguard Worker 
123*bbecb9d1SAndroid Build Coastguard Worker     /* read back the cleared values in the resource */
124*bbecb9d1SAndroid Build Coastguard Worker     box.x = 0;
125*bbecb9d1SAndroid Build Coastguard Worker     box.y = 0;
126*bbecb9d1SAndroid Build Coastguard Worker     box.z = 0;
127*bbecb9d1SAndroid Build Coastguard Worker     box.w = 5;
128*bbecb9d1SAndroid Build Coastguard Worker     box.h = 1;
129*bbecb9d1SAndroid Build Coastguard Worker     box.d = 1;
130*bbecb9d1SAndroid Build Coastguard Worker     ret = virgl_renderer_transfer_read_iov(res.handle, ctx.ctx_id, 0, 50, 0, &box, 0, NULL, 0);
131*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
132*bbecb9d1SAndroid Build Coastguard Worker 
133*bbecb9d1SAndroid Build Coastguard Worker     /* check the returned values */
134*bbecb9d1SAndroid Build Coastguard Worker     for (i = 0; i < 5; i++) {
135*bbecb9d1SAndroid Build Coastguard Worker 	uint32_t *ptr = res.iovs[0].iov_base;
136*bbecb9d1SAndroid Build Coastguard Worker 	ck_assert_int_eq(ptr[i], test_green);
137*bbecb9d1SAndroid Build Coastguard Worker     }
138*bbecb9d1SAndroid Build Coastguard Worker 
139*bbecb9d1SAndroid Build Coastguard Worker     /* cleanup */
140*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_detach_resource(ctx.ctx_id, res.handle);
141*bbecb9d1SAndroid Build Coastguard Worker 
142*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_destroy_backed_res(&res);
143*bbecb9d1SAndroid Build Coastguard Worker 
144*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_fini_ctx_cmdbuf(&ctx);
145*bbecb9d1SAndroid Build Coastguard Worker }
146*bbecb9d1SAndroid Build Coastguard Worker END_TEST
147*bbecb9d1SAndroid Build Coastguard Worker 
START_TEST(virgl_test_blit_simple)148*bbecb9d1SAndroid Build Coastguard Worker START_TEST(virgl_test_blit_simple)
149*bbecb9d1SAndroid Build Coastguard Worker {
150*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_context ctx;
151*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_resource res, res2;
152*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_surface surf;
153*bbecb9d1SAndroid Build Coastguard Worker     struct pipe_framebuffer_state fb_state;
154*bbecb9d1SAndroid Build Coastguard Worker     union pipe_color_union color;
155*bbecb9d1SAndroid Build Coastguard Worker     struct pipe_blit_info blit;
156*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_box box;
157*bbecb9d1SAndroid Build Coastguard Worker     int ret;
158*bbecb9d1SAndroid Build Coastguard Worker     int i;
159*bbecb9d1SAndroid Build Coastguard Worker 
160*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_init_ctx_cmdbuf(&ctx);
161*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
162*bbecb9d1SAndroid Build Coastguard Worker 
163*bbecb9d1SAndroid Build Coastguard Worker     /* init and create simple 2D resource */
164*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_create_backed_simple_2d_res(&res, 1, 50, 50);
165*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
166*bbecb9d1SAndroid Build Coastguard Worker 
167*bbecb9d1SAndroid Build Coastguard Worker     /* init and create simple 2D resource */
168*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_create_backed_simple_2d_res(&res2, 2, 50, 50);
169*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
170*bbecb9d1SAndroid Build Coastguard Worker 
171*bbecb9d1SAndroid Build Coastguard Worker     /* attach resource to context */
172*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_attach_resource(ctx.ctx_id, res.handle);
173*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_attach_resource(ctx.ctx_id, res2.handle);
174*bbecb9d1SAndroid Build Coastguard Worker 
175*bbecb9d1SAndroid Build Coastguard Worker         /* create a surface for the resource */
176*bbecb9d1SAndroid Build Coastguard Worker     memset(&surf, 0, sizeof(surf));
177*bbecb9d1SAndroid Build Coastguard Worker     surf.base.format = PIPE_FORMAT_B8G8R8X8_UNORM;
178*bbecb9d1SAndroid Build Coastguard Worker     surf.handle = 1;
179*bbecb9d1SAndroid Build Coastguard Worker     surf.base.texture = &res.base;
180*bbecb9d1SAndroid Build Coastguard Worker 
181*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_create_surface(&ctx, surf.handle, &res, &surf.base);
182*bbecb9d1SAndroid Build Coastguard Worker 
183*bbecb9d1SAndroid Build Coastguard Worker     /* set the framebuffer state */
184*bbecb9d1SAndroid Build Coastguard Worker     fb_state.nr_cbufs = 1;
185*bbecb9d1SAndroid Build Coastguard Worker     fb_state.zsbuf = NULL;
186*bbecb9d1SAndroid Build Coastguard Worker     fb_state.cbufs[0] = &surf.base;
187*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_set_framebuffer_state(&ctx, &fb_state);
188*bbecb9d1SAndroid Build Coastguard Worker 
189*bbecb9d1SAndroid Build Coastguard Worker     /* clear the resource */
190*bbecb9d1SAndroid Build Coastguard Worker     /* clear buffer to green */
191*bbecb9d1SAndroid Build Coastguard Worker     color.f[0] = 0.0;
192*bbecb9d1SAndroid Build Coastguard Worker     color.f[1] = 1.0;
193*bbecb9d1SAndroid Build Coastguard Worker     color.f[2] = 0.0;
194*bbecb9d1SAndroid Build Coastguard Worker     color.f[3] = 1.0;
195*bbecb9d1SAndroid Build Coastguard Worker     virgl_encode_clear(&ctx, PIPE_CLEAR_COLOR0, &color, 0.0, 0);
196*bbecb9d1SAndroid Build Coastguard Worker 
197*bbecb9d1SAndroid Build Coastguard Worker     memset(&blit, 0, sizeof(blit));
198*bbecb9d1SAndroid Build Coastguard Worker     blit.mask = PIPE_MASK_RGBA;
199*bbecb9d1SAndroid Build Coastguard Worker     blit.dst.format = res2.base.format;
200*bbecb9d1SAndroid Build Coastguard Worker     blit.dst.box.width = 10;
201*bbecb9d1SAndroid Build Coastguard Worker     blit.dst.box.height = 1;
202*bbecb9d1SAndroid Build Coastguard Worker     blit.dst.box.depth = 1;
203*bbecb9d1SAndroid Build Coastguard Worker     blit.src.format = res.base.format;
204*bbecb9d1SAndroid Build Coastguard Worker     blit.src.box.width = 10;
205*bbecb9d1SAndroid Build Coastguard Worker     blit.src.box.height = 1;
206*bbecb9d1SAndroid Build Coastguard Worker     blit.src.box.depth = 1;
207*bbecb9d1SAndroid Build Coastguard Worker     virgl_encode_blit(&ctx, &res2, &res, &blit);
208*bbecb9d1SAndroid Build Coastguard Worker 
209*bbecb9d1SAndroid Build Coastguard Worker     /* submit the cmd stream */
210*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_submit_cmd(ctx.cbuf->buf, ctx.ctx_id, ctx.cbuf->cdw);
211*bbecb9d1SAndroid Build Coastguard Worker 
212*bbecb9d1SAndroid Build Coastguard Worker     /* read back the cleared values in the resource */
213*bbecb9d1SAndroid Build Coastguard Worker     box.x = 0;
214*bbecb9d1SAndroid Build Coastguard Worker     box.y = 0;
215*bbecb9d1SAndroid Build Coastguard Worker     box.z = 0;
216*bbecb9d1SAndroid Build Coastguard Worker     box.w = 5;
217*bbecb9d1SAndroid Build Coastguard Worker     box.h = 1;
218*bbecb9d1SAndroid Build Coastguard Worker     box.d = 1;
219*bbecb9d1SAndroid Build Coastguard Worker     ret = virgl_renderer_transfer_read_iov(res2.handle, ctx.ctx_id, 0, 50, 0, &box, 0, NULL, 0);
220*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
221*bbecb9d1SAndroid Build Coastguard Worker 
222*bbecb9d1SAndroid Build Coastguard Worker     /* check the returned values */
223*bbecb9d1SAndroid Build Coastguard Worker     for (i = 0; i < 5; i++) {
224*bbecb9d1SAndroid Build Coastguard Worker 	uint32_t *ptr = res2.iovs[0].iov_base;
225*bbecb9d1SAndroid Build Coastguard Worker 	ck_assert_int_eq(ptr[i], test_green);
226*bbecb9d1SAndroid Build Coastguard Worker     }
227*bbecb9d1SAndroid Build Coastguard Worker 
228*bbecb9d1SAndroid Build Coastguard Worker     /* cleanup */
229*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_detach_resource(ctx.ctx_id, res2.handle);
230*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_detach_resource(ctx.ctx_id, res.handle);
231*bbecb9d1SAndroid Build Coastguard Worker 
232*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_destroy_backed_res(&res);
233*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_destroy_backed_res(&res2);
234*bbecb9d1SAndroid Build Coastguard Worker 
235*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_fini_ctx_cmdbuf(&ctx);
236*bbecb9d1SAndroid Build Coastguard Worker }
237*bbecb9d1SAndroid Build Coastguard Worker END_TEST
238*bbecb9d1SAndroid Build Coastguard Worker 
239*bbecb9d1SAndroid Build Coastguard Worker struct vertex {
240*bbecb9d1SAndroid Build Coastguard Worker    float position[4];
241*bbecb9d1SAndroid Build Coastguard Worker    float color[4];
242*bbecb9d1SAndroid Build Coastguard Worker };
243*bbecb9d1SAndroid Build Coastguard Worker 
244*bbecb9d1SAndroid Build Coastguard Worker static struct vertex vertices[3] =
245*bbecb9d1SAndroid Build Coastguard Worker {
246*bbecb9d1SAndroid Build Coastguard Worker    {
247*bbecb9d1SAndroid Build Coastguard Worker       { 0.0f, -0.9f, 0.0f, 1.0f },
248*bbecb9d1SAndroid Build Coastguard Worker       { 1.0f, 0.0f, 0.0f, 1.0f }
249*bbecb9d1SAndroid Build Coastguard Worker    },
250*bbecb9d1SAndroid Build Coastguard Worker    {
251*bbecb9d1SAndroid Build Coastguard Worker       { -0.9f, 0.9f, 0.0f, 1.0f },
252*bbecb9d1SAndroid Build Coastguard Worker       { 0.0f, 1.0f, 0.0f, 1.0f }
253*bbecb9d1SAndroid Build Coastguard Worker    },
254*bbecb9d1SAndroid Build Coastguard Worker    {
255*bbecb9d1SAndroid Build Coastguard Worker       { 0.9f, 0.9f, 0.0f, 1.0f },
256*bbecb9d1SAndroid Build Coastguard Worker       { 0.0f, 0.0f, 1.0f, 1.0f }
257*bbecb9d1SAndroid Build Coastguard Worker    }
258*bbecb9d1SAndroid Build Coastguard Worker };
259*bbecb9d1SAndroid Build Coastguard Worker 
260*bbecb9d1SAndroid Build Coastguard Worker /* create a resource - clear it to a color, render something */
START_TEST(virgl_test_render_simple)261*bbecb9d1SAndroid Build Coastguard Worker START_TEST(virgl_test_render_simple)
262*bbecb9d1SAndroid Build Coastguard Worker {
263*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_context ctx;
264*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_resource res;
265*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_resource vbo;
266*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_surface surf;
267*bbecb9d1SAndroid Build Coastguard Worker     struct pipe_framebuffer_state fb_state;
268*bbecb9d1SAndroid Build Coastguard Worker     struct pipe_vertex_element ve[2];
269*bbecb9d1SAndroid Build Coastguard Worker     struct pipe_vertex_buffer vbuf;
270*bbecb9d1SAndroid Build Coastguard Worker     int ve_handle, vs_handle, fs_handle;
271*bbecb9d1SAndroid Build Coastguard Worker     int ctx_handle = 1;
272*bbecb9d1SAndroid Build Coastguard Worker     union pipe_color_union color;
273*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_box box;
274*bbecb9d1SAndroid Build Coastguard Worker     int ret;
275*bbecb9d1SAndroid Build Coastguard Worker     int tw = 300, th = 300;
276*bbecb9d1SAndroid Build Coastguard Worker 
277*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_init_ctx_cmdbuf(&ctx);
278*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
279*bbecb9d1SAndroid Build Coastguard Worker 
280*bbecb9d1SAndroid Build Coastguard Worker     /* init and create simple 2D resource */
281*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_create_backed_simple_2d_res(&res, 1, tw, th);
282*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
283*bbecb9d1SAndroid Build Coastguard Worker 
284*bbecb9d1SAndroid Build Coastguard Worker     /* attach resource to context */
285*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_attach_resource(ctx.ctx_id, res.handle);
286*bbecb9d1SAndroid Build Coastguard Worker 
287*bbecb9d1SAndroid Build Coastguard Worker     /* create a surface for the resource */
288*bbecb9d1SAndroid Build Coastguard Worker     memset(&surf, 0, sizeof(surf));
289*bbecb9d1SAndroid Build Coastguard Worker     surf.base.format = PIPE_FORMAT_B8G8R8X8_UNORM;
290*bbecb9d1SAndroid Build Coastguard Worker     surf.handle = ctx_handle++;
291*bbecb9d1SAndroid Build Coastguard Worker     surf.base.texture = &res.base;
292*bbecb9d1SAndroid Build Coastguard Worker 
293*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_create_surface(&ctx, surf.handle, &res, &surf.base);
294*bbecb9d1SAndroid Build Coastguard Worker 
295*bbecb9d1SAndroid Build Coastguard Worker     /* set the framebuffer state */
296*bbecb9d1SAndroid Build Coastguard Worker     fb_state.nr_cbufs = 1;
297*bbecb9d1SAndroid Build Coastguard Worker     fb_state.zsbuf = NULL;
298*bbecb9d1SAndroid Build Coastguard Worker     fb_state.cbufs[0] = &surf.base;
299*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_set_framebuffer_state(&ctx, &fb_state);
300*bbecb9d1SAndroid Build Coastguard Worker 
301*bbecb9d1SAndroid Build Coastguard Worker     /* clear the resource */
302*bbecb9d1SAndroid Build Coastguard Worker     /* clear buffer to green */
303*bbecb9d1SAndroid Build Coastguard Worker     color.f[0] = 0.0;
304*bbecb9d1SAndroid Build Coastguard Worker     color.f[1] = 1.0;
305*bbecb9d1SAndroid Build Coastguard Worker     color.f[2] = 0.0;
306*bbecb9d1SAndroid Build Coastguard Worker     color.f[3] = 1.0;
307*bbecb9d1SAndroid Build Coastguard Worker     virgl_encode_clear(&ctx, PIPE_CLEAR_COLOR0, &color, 0.0, 0);
308*bbecb9d1SAndroid Build Coastguard Worker 
309*bbecb9d1SAndroid Build Coastguard Worker     /* create vertex elements */
310*bbecb9d1SAndroid Build Coastguard Worker     ve_handle = ctx_handle++;
311*bbecb9d1SAndroid Build Coastguard Worker     memset(ve, 0, sizeof(ve));
312*bbecb9d1SAndroid Build Coastguard Worker     ve[0].src_offset = Offset(struct vertex, position);
313*bbecb9d1SAndroid Build Coastguard Worker     ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
314*bbecb9d1SAndroid Build Coastguard Worker     ve[1].src_offset = Offset(struct vertex, color);
315*bbecb9d1SAndroid Build Coastguard Worker     ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
316*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_create_vertex_elements(&ctx, ve_handle, 2, ve);
317*bbecb9d1SAndroid Build Coastguard Worker 
318*bbecb9d1SAndroid Build Coastguard Worker     virgl_encode_bind_object(&ctx, ve_handle, VIRGL_OBJECT_VERTEX_ELEMENTS);
319*bbecb9d1SAndroid Build Coastguard Worker 
320*bbecb9d1SAndroid Build Coastguard Worker     /* create vbo */
321*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_create_backed_simple_buffer(&vbo, 2, sizeof(vertices), PIPE_BIND_VERTEX_BUFFER);
322*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
323*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_attach_resource(ctx.ctx_id, vbo.handle);
324*bbecb9d1SAndroid Build Coastguard Worker 
325*bbecb9d1SAndroid Build Coastguard Worker     /* inline write the data to it */
326*bbecb9d1SAndroid Build Coastguard Worker     box.x = 0;
327*bbecb9d1SAndroid Build Coastguard Worker     box.y = 0;
328*bbecb9d1SAndroid Build Coastguard Worker     box.z = 0;
329*bbecb9d1SAndroid Build Coastguard Worker     box.w = sizeof(vertices);
330*bbecb9d1SAndroid Build Coastguard Worker     box.h = 1;
331*bbecb9d1SAndroid Build Coastguard Worker     box.d = 1;
332*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_inline_write(&ctx, &vbo, 0, 0, (struct pipe_box *)&box, &vertices, box.w, 0);
333*bbecb9d1SAndroid Build Coastguard Worker 
334*bbecb9d1SAndroid Build Coastguard Worker     vbuf.stride = sizeof(struct vertex);
335*bbecb9d1SAndroid Build Coastguard Worker     vbuf.buffer_offset = 0;
336*bbecb9d1SAndroid Build Coastguard Worker     vbuf.buffer = &vbo.base;
337*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_set_vertex_buffers(&ctx, 1, &vbuf);
338*bbecb9d1SAndroid Build Coastguard Worker 
339*bbecb9d1SAndroid Build Coastguard Worker     /* create vertex shader */
340*bbecb9d1SAndroid Build Coastguard Worker     {
341*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_shader_state vs;
342*bbecb9d1SAndroid Build Coastguard Worker          const char *text =
343*bbecb9d1SAndroid Build Coastguard Worker 	   "VERT\n"
344*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL IN[0]\n"
345*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL IN[1]\n"
346*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL OUT[0], POSITION\n"
347*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL OUT[1], COLOR\n"
348*bbecb9d1SAndroid Build Coastguard Worker 	   "  0: MOV OUT[1], IN[1]\n"
349*bbecb9d1SAndroid Build Coastguard Worker 	   "  1: MOV OUT[0], IN[0]\n"
350*bbecb9d1SAndroid Build Coastguard Worker 	   "  2: END\n";
351*bbecb9d1SAndroid Build Coastguard Worker 	 memset(&vs, 0, sizeof(vs));
352*bbecb9d1SAndroid Build Coastguard Worker 	 vs_handle = ctx_handle++;
353*bbecb9d1SAndroid Build Coastguard Worker 	 virgl_encode_shader_state(&ctx, vs_handle, PIPE_SHADER_VERTEX,
354*bbecb9d1SAndroid Build Coastguard Worker 				   &vs, text);
355*bbecb9d1SAndroid Build Coastguard Worker 	 virgl_encode_bind_shader(&ctx, vs_handle, PIPE_SHADER_VERTEX);
356*bbecb9d1SAndroid Build Coastguard Worker     }
357*bbecb9d1SAndroid Build Coastguard Worker 
358*bbecb9d1SAndroid Build Coastguard Worker     /* create fragment shader */
359*bbecb9d1SAndroid Build Coastguard Worker     {
360*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_shader_state fs;
361*bbecb9d1SAndroid Build Coastguard Worker 	const char *text =
362*bbecb9d1SAndroid Build Coastguard Worker 	    "FRAG\n"
363*bbecb9d1SAndroid Build Coastguard Worker 	    "DCL IN[0], COLOR, LINEAR\n"
364*bbecb9d1SAndroid Build Coastguard Worker 	    "DCL OUT[0], COLOR\n"
365*bbecb9d1SAndroid Build Coastguard Worker 	    "  0: MOV OUT[0], IN[0]\n"
366*bbecb9d1SAndroid Build Coastguard Worker 	    "  1: END\n";
367*bbecb9d1SAndroid Build Coastguard Worker 	memset(&fs, 0, sizeof(fs));
368*bbecb9d1SAndroid Build Coastguard Worker 	fs_handle = ctx_handle++;
369*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_shader_state(&ctx, fs_handle, PIPE_SHADER_FRAGMENT,
370*bbecb9d1SAndroid Build Coastguard Worker 				   &fs, text);
371*bbecb9d1SAndroid Build Coastguard Worker 
372*bbecb9d1SAndroid Build Coastguard Worker         virgl_encode_bind_shader(&ctx, fs_handle, PIPE_SHADER_FRAGMENT);
373*bbecb9d1SAndroid Build Coastguard Worker     }
374*bbecb9d1SAndroid Build Coastguard Worker 
375*bbecb9d1SAndroid Build Coastguard Worker     /* link shader */
376*bbecb9d1SAndroid Build Coastguard Worker     {
377*bbecb9d1SAndroid Build Coastguard Worker         uint32_t handles[PIPE_SHADER_TYPES];
378*bbecb9d1SAndroid Build Coastguard Worker         memset(handles, 0, sizeof(handles));
379*bbecb9d1SAndroid Build Coastguard Worker         handles[PIPE_SHADER_VERTEX] = vs_handle;
380*bbecb9d1SAndroid Build Coastguard Worker         handles[PIPE_SHADER_FRAGMENT] = fs_handle;
381*bbecb9d1SAndroid Build Coastguard Worker         virgl_encode_link_shader(&ctx, handles);
382*bbecb9d1SAndroid Build Coastguard Worker     }
383*bbecb9d1SAndroid Build Coastguard Worker 
384*bbecb9d1SAndroid Build Coastguard Worker     /* set blend state */
385*bbecb9d1SAndroid Build Coastguard Worker     {
386*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_blend_state blend;
387*bbecb9d1SAndroid Build Coastguard Worker 	int blend_handle = ctx_handle++;
388*bbecb9d1SAndroid Build Coastguard Worker 	memset(&blend, 0, sizeof(blend));
389*bbecb9d1SAndroid Build Coastguard Worker 	blend.rt[0].colormask = PIPE_MASK_RGBA;
390*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_blend_state(&ctx, blend_handle, &blend);
391*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_bind_object(&ctx, blend_handle, VIRGL_OBJECT_BLEND);
392*bbecb9d1SAndroid Build Coastguard Worker     }
393*bbecb9d1SAndroid Build Coastguard Worker 
394*bbecb9d1SAndroid Build Coastguard Worker     /* set depth stencil alpha state */
395*bbecb9d1SAndroid Build Coastguard Worker     {
396*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_depth_stencil_alpha_state dsa;
397*bbecb9d1SAndroid Build Coastguard Worker 	int dsa_handle = ctx_handle++;
398*bbecb9d1SAndroid Build Coastguard Worker 	memset(&dsa, 0, sizeof(dsa));
399*bbecb9d1SAndroid Build Coastguard Worker 	dsa.depth.writemask = 1;
400*bbecb9d1SAndroid Build Coastguard Worker 	dsa.depth.func = PIPE_FUNC_LESS;
401*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_dsa_state(&ctx, dsa_handle, &dsa);
402*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_bind_object(&ctx, dsa_handle, VIRGL_OBJECT_DSA);
403*bbecb9d1SAndroid Build Coastguard Worker     }
404*bbecb9d1SAndroid Build Coastguard Worker 
405*bbecb9d1SAndroid Build Coastguard Worker     /* set rasterizer state */
406*bbecb9d1SAndroid Build Coastguard Worker     {
407*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_rasterizer_state rasterizer;
408*bbecb9d1SAndroid Build Coastguard Worker 	int rs_handle = ctx_handle++;
409*bbecb9d1SAndroid Build Coastguard Worker 	memset(&rasterizer, 0, sizeof(rasterizer));
410*bbecb9d1SAndroid Build Coastguard Worker 	rasterizer.cull_face = PIPE_FACE_NONE;
411*bbecb9d1SAndroid Build Coastguard Worker 	rasterizer.half_pixel_center = 1;
412*bbecb9d1SAndroid Build Coastguard Worker 	rasterizer.bottom_edge_rule = 1;
413*bbecb9d1SAndroid Build Coastguard Worker 	rasterizer.depth_clip = 1;
414*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_rasterizer_state(&ctx, rs_handle, &rasterizer);
415*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_bind_object(&ctx, rs_handle, VIRGL_OBJECT_RASTERIZER);
416*bbecb9d1SAndroid Build Coastguard Worker     }
417*bbecb9d1SAndroid Build Coastguard Worker 
418*bbecb9d1SAndroid Build Coastguard Worker     /* set viewport state */
419*bbecb9d1SAndroid Build Coastguard Worker     {
420*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_viewport_state vp;
421*bbecb9d1SAndroid Build Coastguard Worker 	float znear = 0, zfar = 1.0;
422*bbecb9d1SAndroid Build Coastguard Worker 	float half_w = tw / 2.0f;
423*bbecb9d1SAndroid Build Coastguard Worker 	float half_h = th / 2.0f;
424*bbecb9d1SAndroid Build Coastguard Worker 	float half_d = (zfar - znear) / 2.0f;
425*bbecb9d1SAndroid Build Coastguard Worker 
426*bbecb9d1SAndroid Build Coastguard Worker 	vp.scale[0] = half_w;
427*bbecb9d1SAndroid Build Coastguard Worker 	vp.scale[1] = half_h;
428*bbecb9d1SAndroid Build Coastguard Worker 	vp.scale[2] = half_d;
429*bbecb9d1SAndroid Build Coastguard Worker 
430*bbecb9d1SAndroid Build Coastguard Worker 	vp.translate[0] = half_w + 0;
431*bbecb9d1SAndroid Build Coastguard Worker 	vp.translate[1] = half_h + 0;
432*bbecb9d1SAndroid Build Coastguard Worker 	vp.translate[2] = half_d + znear;
433*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encoder_set_viewport_states(&ctx, 0, 1, &vp);
434*bbecb9d1SAndroid Build Coastguard Worker     }
435*bbecb9d1SAndroid Build Coastguard Worker 
436*bbecb9d1SAndroid Build Coastguard Worker     /* draw */
437*bbecb9d1SAndroid Build Coastguard Worker     {
438*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_draw_info info;
439*bbecb9d1SAndroid Build Coastguard Worker 	memset(&info, 0, sizeof(info));
440*bbecb9d1SAndroid Build Coastguard Worker 	info.count = 3;
441*bbecb9d1SAndroid Build Coastguard Worker 	info.mode = PIPE_PRIM_TRIANGLES;
442*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encoder_draw_vbo(&ctx, &info);
443*bbecb9d1SAndroid Build Coastguard Worker     }
444*bbecb9d1SAndroid Build Coastguard Worker 
445*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_submit_cmd(ctx.cbuf->buf, ctx.ctx_id, ctx.cbuf->cdw);
446*bbecb9d1SAndroid Build Coastguard Worker 
447*bbecb9d1SAndroid Build Coastguard Worker     /* create a fence */
448*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_reset_fence();
449*bbecb9d1SAndroid Build Coastguard Worker     ret = virgl_renderer_create_fence(1, ctx.ctx_id);
450*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
451*bbecb9d1SAndroid Build Coastguard Worker 
452*bbecb9d1SAndroid Build Coastguard Worker     do {
453*bbecb9d1SAndroid Build Coastguard Worker 	int fence;
454*bbecb9d1SAndroid Build Coastguard Worker 
455*bbecb9d1SAndroid Build Coastguard Worker 	virgl_renderer_poll();
456*bbecb9d1SAndroid Build Coastguard Worker 	fence = testvirgl_get_last_fence();
457*bbecb9d1SAndroid Build Coastguard Worker 	if (fence >= 1)
458*bbecb9d1SAndroid Build Coastguard Worker 	    break;
459*bbecb9d1SAndroid Build Coastguard Worker 	nanosleep((struct timespec[]){{0, 50000}}, NULL);
460*bbecb9d1SAndroid Build Coastguard Worker     } while(1);
461*bbecb9d1SAndroid Build Coastguard Worker 
462*bbecb9d1SAndroid Build Coastguard Worker     /* read back the tri values in the resource */
463*bbecb9d1SAndroid Build Coastguard Worker     box.x = 0;
464*bbecb9d1SAndroid Build Coastguard Worker     box.y = 0;
465*bbecb9d1SAndroid Build Coastguard Worker     box.z = 0;
466*bbecb9d1SAndroid Build Coastguard Worker     box.w = tw;
467*bbecb9d1SAndroid Build Coastguard Worker     box.h = th;
468*bbecb9d1SAndroid Build Coastguard Worker     box.d = 1;
469*bbecb9d1SAndroid Build Coastguard Worker     ret = virgl_renderer_transfer_read_iov(res.handle, ctx.ctx_id, 0, 0, 0, &box, 0, NULL, 0);
470*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
471*bbecb9d1SAndroid Build Coastguard Worker 
472*bbecb9d1SAndroid Build Coastguard Worker     {
473*bbecb9d1SAndroid Build Coastguard Worker 	int w, h;
474*bbecb9d1SAndroid Build Coastguard Worker 	bool all_cleared = true;
475*bbecb9d1SAndroid Build Coastguard Worker 	uint32_t *ptr = res.iovs[0].iov_base;
476*bbecb9d1SAndroid Build Coastguard Worker 	for (h = 0; h < th; h++) {
477*bbecb9d1SAndroid Build Coastguard Worker 	    for (w = 0; w < tw; w++) {
478*bbecb9d1SAndroid Build Coastguard Worker 		if (ptr[h * tw + w] != test_green)
479*bbecb9d1SAndroid Build Coastguard Worker 		    all_cleared = false;
480*bbecb9d1SAndroid Build Coastguard Worker 	    }
481*bbecb9d1SAndroid Build Coastguard Worker 	}
482*bbecb9d1SAndroid Build Coastguard Worker 	ck_assert_int_eq(all_cleared, false);
483*bbecb9d1SAndroid Build Coastguard Worker     }
484*bbecb9d1SAndroid Build Coastguard Worker 
485*bbecb9d1SAndroid Build Coastguard Worker     /* cleanup */
486*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_detach_resource(ctx.ctx_id, res.handle);
487*bbecb9d1SAndroid Build Coastguard Worker 
488*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_destroy_backed_res(&vbo);
489*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_destroy_backed_res(&res);
490*bbecb9d1SAndroid Build Coastguard Worker 
491*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_fini_ctx_cmdbuf(&ctx);
492*bbecb9d1SAndroid Build Coastguard Worker }
493*bbecb9d1SAndroid Build Coastguard Worker END_TEST
494*bbecb9d1SAndroid Build Coastguard Worker 
495*bbecb9d1SAndroid Build Coastguard Worker /* create a resource - clear it to a color, render something */
START_TEST(virgl_test_render_geom_simple)496*bbecb9d1SAndroid Build Coastguard Worker START_TEST(virgl_test_render_geom_simple)
497*bbecb9d1SAndroid Build Coastguard Worker {
498*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_context ctx;
499*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_resource res;
500*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_resource vbo;
501*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_surface surf;
502*bbecb9d1SAndroid Build Coastguard Worker     struct pipe_framebuffer_state fb_state;
503*bbecb9d1SAndroid Build Coastguard Worker     struct pipe_vertex_element ve[2];
504*bbecb9d1SAndroid Build Coastguard Worker     struct pipe_vertex_buffer vbuf;
505*bbecb9d1SAndroid Build Coastguard Worker     int ve_handle, vs_handle, fs_handle, gs_handle;
506*bbecb9d1SAndroid Build Coastguard Worker     int ctx_handle = 1;
507*bbecb9d1SAndroid Build Coastguard Worker     union pipe_color_union color;
508*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_box box;
509*bbecb9d1SAndroid Build Coastguard Worker     int ret;
510*bbecb9d1SAndroid Build Coastguard Worker     int tw = 300, th = 300;
511*bbecb9d1SAndroid Build Coastguard Worker 
512*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_init_ctx_cmdbuf(&ctx);
513*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
514*bbecb9d1SAndroid Build Coastguard Worker 
515*bbecb9d1SAndroid Build Coastguard Worker     /* Geometry shader are only available since GLSL 150 */
516*bbecb9d1SAndroid Build Coastguard Worker     uint32_t glsl_level = testvirgl_get_glsl_level_from_caps();
517*bbecb9d1SAndroid Build Coastguard Worker     if (glsl_level < 150) {
518*bbecb9d1SAndroid Build Coastguard Worker       testvirgl_fini_ctx_cmdbuf(&ctx);
519*bbecb9d1SAndroid Build Coastguard Worker       return;
520*bbecb9d1SAndroid Build Coastguard Worker     }
521*bbecb9d1SAndroid Build Coastguard Worker 
522*bbecb9d1SAndroid Build Coastguard Worker     /* init and create simple 2D resource */
523*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_create_backed_simple_2d_res(&res, 1, tw, th);
524*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
525*bbecb9d1SAndroid Build Coastguard Worker 
526*bbecb9d1SAndroid Build Coastguard Worker     /* attach resource to context */
527*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_attach_resource(ctx.ctx_id, res.handle);
528*bbecb9d1SAndroid Build Coastguard Worker 
529*bbecb9d1SAndroid Build Coastguard Worker     /* create a surface for the resource */
530*bbecb9d1SAndroid Build Coastguard Worker     memset(&surf, 0, sizeof(surf));
531*bbecb9d1SAndroid Build Coastguard Worker     surf.base.format = PIPE_FORMAT_B8G8R8X8_UNORM;
532*bbecb9d1SAndroid Build Coastguard Worker     surf.handle = ctx_handle++;
533*bbecb9d1SAndroid Build Coastguard Worker     surf.base.texture = &res.base;
534*bbecb9d1SAndroid Build Coastguard Worker 
535*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_create_surface(&ctx, surf.handle, &res, &surf.base);
536*bbecb9d1SAndroid Build Coastguard Worker 
537*bbecb9d1SAndroid Build Coastguard Worker     /* set the framebuffer state */
538*bbecb9d1SAndroid Build Coastguard Worker     fb_state.nr_cbufs = 1;
539*bbecb9d1SAndroid Build Coastguard Worker     fb_state.zsbuf = NULL;
540*bbecb9d1SAndroid Build Coastguard Worker     fb_state.cbufs[0] = &surf.base;
541*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_set_framebuffer_state(&ctx, &fb_state);
542*bbecb9d1SAndroid Build Coastguard Worker 
543*bbecb9d1SAndroid Build Coastguard Worker     /* clear the resource */
544*bbecb9d1SAndroid Build Coastguard Worker     /* clear buffer to green */
545*bbecb9d1SAndroid Build Coastguard Worker     color.f[0] = 0.0;
546*bbecb9d1SAndroid Build Coastguard Worker     color.f[1] = 1.0;
547*bbecb9d1SAndroid Build Coastguard Worker     color.f[2] = 0.0;
548*bbecb9d1SAndroid Build Coastguard Worker     color.f[3] = 1.0;
549*bbecb9d1SAndroid Build Coastguard Worker     virgl_encode_clear(&ctx, PIPE_CLEAR_COLOR0, &color, 0.0, 0);
550*bbecb9d1SAndroid Build Coastguard Worker 
551*bbecb9d1SAndroid Build Coastguard Worker     /* create vertex elements */
552*bbecb9d1SAndroid Build Coastguard Worker     ve_handle = ctx_handle++;
553*bbecb9d1SAndroid Build Coastguard Worker     memset(ve, 0, sizeof(ve));
554*bbecb9d1SAndroid Build Coastguard Worker     ve[0].src_offset = Offset(struct vertex, position);
555*bbecb9d1SAndroid Build Coastguard Worker     ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
556*bbecb9d1SAndroid Build Coastguard Worker     ve[1].src_offset = Offset(struct vertex, color);
557*bbecb9d1SAndroid Build Coastguard Worker     ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
558*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_create_vertex_elements(&ctx, ve_handle, 2, ve);
559*bbecb9d1SAndroid Build Coastguard Worker 
560*bbecb9d1SAndroid Build Coastguard Worker     virgl_encode_bind_object(&ctx, ve_handle, VIRGL_OBJECT_VERTEX_ELEMENTS);
561*bbecb9d1SAndroid Build Coastguard Worker 
562*bbecb9d1SAndroid Build Coastguard Worker     /* create vbo */
563*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_create_backed_simple_buffer(&vbo, 2, sizeof(vertices), PIPE_BIND_VERTEX_BUFFER);
564*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
565*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_attach_resource(ctx.ctx_id, vbo.handle);
566*bbecb9d1SAndroid Build Coastguard Worker 
567*bbecb9d1SAndroid Build Coastguard Worker     /* inline write the data to it */
568*bbecb9d1SAndroid Build Coastguard Worker     box.x = 0;
569*bbecb9d1SAndroid Build Coastguard Worker     box.y = 0;
570*bbecb9d1SAndroid Build Coastguard Worker     box.z = 0;
571*bbecb9d1SAndroid Build Coastguard Worker     box.w = sizeof(vertices);
572*bbecb9d1SAndroid Build Coastguard Worker     box.h = 1;
573*bbecb9d1SAndroid Build Coastguard Worker     box.d = 1;
574*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_inline_write(&ctx, &vbo, 0, 0, (struct pipe_box *)&box, &vertices, box.w, 0);
575*bbecb9d1SAndroid Build Coastguard Worker 
576*bbecb9d1SAndroid Build Coastguard Worker     vbuf.stride = sizeof(struct vertex);
577*bbecb9d1SAndroid Build Coastguard Worker     vbuf.buffer_offset = 0;
578*bbecb9d1SAndroid Build Coastguard Worker     vbuf.buffer = &vbo.base;
579*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_set_vertex_buffers(&ctx, 1, &vbuf);
580*bbecb9d1SAndroid Build Coastguard Worker 
581*bbecb9d1SAndroid Build Coastguard Worker     /* create vertex shader */
582*bbecb9d1SAndroid Build Coastguard Worker     {
583*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_shader_state vs;
584*bbecb9d1SAndroid Build Coastguard Worker          const char *text =
585*bbecb9d1SAndroid Build Coastguard Worker 	   "VERT\n"
586*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL IN[0]\n"
587*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL IN[1]\n"
588*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL OUT[0], POSITION\n"
589*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL OUT[1], GENERIC[20]\n"
590*bbecb9d1SAndroid Build Coastguard Worker 	   "  0: MOV OUT[1], IN[1]\n"
591*bbecb9d1SAndroid Build Coastguard Worker 	   "  1: MOV OUT[0], IN[0]\n"
592*bbecb9d1SAndroid Build Coastguard Worker 	   "  2: END\n";
593*bbecb9d1SAndroid Build Coastguard Worker 	 memset(&vs, 0, sizeof(vs));
594*bbecb9d1SAndroid Build Coastguard Worker 	 vs_handle = ctx_handle++;
595*bbecb9d1SAndroid Build Coastguard Worker 	 virgl_encode_shader_state(&ctx, vs_handle, PIPE_SHADER_VERTEX,
596*bbecb9d1SAndroid Build Coastguard Worker 				   &vs, text);
597*bbecb9d1SAndroid Build Coastguard Worker          virgl_encode_bind_shader(&ctx, vs_handle, PIPE_SHADER_VERTEX);
598*bbecb9d1SAndroid Build Coastguard Worker     }
599*bbecb9d1SAndroid Build Coastguard Worker 
600*bbecb9d1SAndroid Build Coastguard Worker     /* create geometry shader */
601*bbecb9d1SAndroid Build Coastguard Worker     {
602*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_shader_state gs;
603*bbecb9d1SAndroid Build Coastguard Worker          const char *text =
604*bbecb9d1SAndroid Build Coastguard Worker 	   "GEOM\n"
605*bbecb9d1SAndroid Build Coastguard Worker 	   "PROPERTY GS_INPUT_PRIMITIVE TRIANGLES\n"
606*bbecb9d1SAndroid Build Coastguard Worker 	   "PROPERTY GS_OUTPUT_PRIMITIVE TRIANGLE_STRIP\n"
607*bbecb9d1SAndroid Build Coastguard Worker 	   "PROPERTY GS_MAX_OUTPUT_VERTICES 3\n"
608*bbecb9d1SAndroid Build Coastguard Worker 	   "PROPERTY GS_INVOCATIONS 1\n"
609*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL IN[][0], POSITION\n"
610*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL IN[][1], GENERIC[20]\n"
611*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL OUT[0], POSITION\n"
612*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL OUT[1], GENERIC[20]\n"
613*bbecb9d1SAndroid Build Coastguard Worker 	   "IMM[0] INT32 {0, 0, 0, 0}\n"
614*bbecb9d1SAndroid Build Coastguard Worker 	   "0:MOV OUT[0], IN[0][0]\n"
615*bbecb9d1SAndroid Build Coastguard Worker 	   "1:MOV OUT[1], IN[0][1]\n"
616*bbecb9d1SAndroid Build Coastguard Worker 	   "2:EMIT IMM[0].xxxx\n"
617*bbecb9d1SAndroid Build Coastguard Worker 	   "3:MOV OUT[0], IN[1][0]\n"
618*bbecb9d1SAndroid Build Coastguard Worker 	   "4:MOV OUT[1], IN[0][1]\n" /* copy color from input vertex 0 */
619*bbecb9d1SAndroid Build Coastguard Worker 	   "5:EMIT IMM[0].xxxx\n"
620*bbecb9d1SAndroid Build Coastguard Worker 	   "6:MOV OUT[0], IN[2][0]\n"
621*bbecb9d1SAndroid Build Coastguard Worker 	   "7:MOV OUT[1], IN[2][1]\n"
622*bbecb9d1SAndroid Build Coastguard Worker 	   "8:EMIT IMM[0].xxxx\n"
623*bbecb9d1SAndroid Build Coastguard Worker 	   "9:END\n";
624*bbecb9d1SAndroid Build Coastguard Worker 	 memset(&gs, 0, sizeof(gs));
625*bbecb9d1SAndroid Build Coastguard Worker 	 gs_handle = ctx_handle++;
626*bbecb9d1SAndroid Build Coastguard Worker 	 virgl_encode_shader_state(&ctx, gs_handle, PIPE_SHADER_GEOMETRY,
627*bbecb9d1SAndroid Build Coastguard Worker 				   &gs, text);
628*bbecb9d1SAndroid Build Coastguard Worker          virgl_encode_bind_shader(&ctx, gs_handle, PIPE_SHADER_GEOMETRY);
629*bbecb9d1SAndroid Build Coastguard Worker     }
630*bbecb9d1SAndroid Build Coastguard Worker 
631*bbecb9d1SAndroid Build Coastguard Worker     /* create fragment shader */
632*bbecb9d1SAndroid Build Coastguard Worker     {
633*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_shader_state fs;
634*bbecb9d1SAndroid Build Coastguard Worker 	const char *text =
635*bbecb9d1SAndroid Build Coastguard Worker 	    "FRAG\n"
636*bbecb9d1SAndroid Build Coastguard Worker 	    "DCL IN[0], GENERIC[20], LINEAR\n"
637*bbecb9d1SAndroid Build Coastguard Worker 	    "DCL OUT[0], COLOR\n"
638*bbecb9d1SAndroid Build Coastguard Worker 	    "  0: MOV OUT[0], IN[0]\n"
639*bbecb9d1SAndroid Build Coastguard Worker 	    "  1: END\n";
640*bbecb9d1SAndroid Build Coastguard Worker 	memset(&fs, 0, sizeof(fs));
641*bbecb9d1SAndroid Build Coastguard Worker 	fs_handle = ctx_handle++;
642*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_shader_state(&ctx, fs_handle, PIPE_SHADER_FRAGMENT,
643*bbecb9d1SAndroid Build Coastguard Worker 				   &fs, text);
644*bbecb9d1SAndroid Build Coastguard Worker 
645*bbecb9d1SAndroid Build Coastguard Worker         virgl_encode_bind_shader(&ctx, fs_handle, PIPE_SHADER_FRAGMENT);
646*bbecb9d1SAndroid Build Coastguard Worker     }
647*bbecb9d1SAndroid Build Coastguard Worker 
648*bbecb9d1SAndroid Build Coastguard Worker     /* set blend state */
649*bbecb9d1SAndroid Build Coastguard Worker     {
650*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_blend_state blend;
651*bbecb9d1SAndroid Build Coastguard Worker 	int blend_handle = ctx_handle++;
652*bbecb9d1SAndroid Build Coastguard Worker 	memset(&blend, 0, sizeof(blend));
653*bbecb9d1SAndroid Build Coastguard Worker 	blend.rt[0].colormask = PIPE_MASK_RGBA;
654*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_blend_state(&ctx, blend_handle, &blend);
655*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_bind_object(&ctx, blend_handle, VIRGL_OBJECT_BLEND);
656*bbecb9d1SAndroid Build Coastguard Worker     }
657*bbecb9d1SAndroid Build Coastguard Worker 
658*bbecb9d1SAndroid Build Coastguard Worker     /* set depth stencil alpha state */
659*bbecb9d1SAndroid Build Coastguard Worker     {
660*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_depth_stencil_alpha_state dsa;
661*bbecb9d1SAndroid Build Coastguard Worker 	int dsa_handle = ctx_handle++;
662*bbecb9d1SAndroid Build Coastguard Worker 	memset(&dsa, 0, sizeof(dsa));
663*bbecb9d1SAndroid Build Coastguard Worker 	dsa.depth.writemask = 1;
664*bbecb9d1SAndroid Build Coastguard Worker 	dsa.depth.func = PIPE_FUNC_LESS;
665*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_dsa_state(&ctx, dsa_handle, &dsa);
666*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_bind_object(&ctx, dsa_handle, VIRGL_OBJECT_DSA);
667*bbecb9d1SAndroid Build Coastguard Worker     }
668*bbecb9d1SAndroid Build Coastguard Worker 
669*bbecb9d1SAndroid Build Coastguard Worker     /* set rasterizer state */
670*bbecb9d1SAndroid Build Coastguard Worker     {
671*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_rasterizer_state rasterizer;
672*bbecb9d1SAndroid Build Coastguard Worker 	int rs_handle = ctx_handle++;
673*bbecb9d1SAndroid Build Coastguard Worker 	memset(&rasterizer, 0, sizeof(rasterizer));
674*bbecb9d1SAndroid Build Coastguard Worker 	rasterizer.cull_face = PIPE_FACE_NONE;
675*bbecb9d1SAndroid Build Coastguard Worker 	rasterizer.half_pixel_center = 1;
676*bbecb9d1SAndroid Build Coastguard Worker 	rasterizer.bottom_edge_rule = 1;
677*bbecb9d1SAndroid Build Coastguard Worker 	rasterizer.depth_clip = 1;
678*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_rasterizer_state(&ctx, rs_handle, &rasterizer);
679*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_bind_object(&ctx, rs_handle, VIRGL_OBJECT_RASTERIZER);
680*bbecb9d1SAndroid Build Coastguard Worker     }
681*bbecb9d1SAndroid Build Coastguard Worker 
682*bbecb9d1SAndroid Build Coastguard Worker     /* set viewport state */
683*bbecb9d1SAndroid Build Coastguard Worker     {
684*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_viewport_state vp;
685*bbecb9d1SAndroid Build Coastguard Worker 	float znear = 0, zfar = 1.0;
686*bbecb9d1SAndroid Build Coastguard Worker 	float half_w = tw / 2.0f;
687*bbecb9d1SAndroid Build Coastguard Worker 	float half_h = th / 2.0f;
688*bbecb9d1SAndroid Build Coastguard Worker 	float half_d = (zfar - znear) / 2.0f;
689*bbecb9d1SAndroid Build Coastguard Worker 
690*bbecb9d1SAndroid Build Coastguard Worker 	vp.scale[0] = half_w;
691*bbecb9d1SAndroid Build Coastguard Worker 	vp.scale[1] = half_h;
692*bbecb9d1SAndroid Build Coastguard Worker 	vp.scale[2] = half_d;
693*bbecb9d1SAndroid Build Coastguard Worker 
694*bbecb9d1SAndroid Build Coastguard Worker 	vp.translate[0] = half_w + 0;
695*bbecb9d1SAndroid Build Coastguard Worker 	vp.translate[1] = half_h + 0;
696*bbecb9d1SAndroid Build Coastguard Worker 	vp.translate[2] = half_d + znear;
697*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encoder_set_viewport_states(&ctx, 0, 1, &vp);
698*bbecb9d1SAndroid Build Coastguard Worker     }
699*bbecb9d1SAndroid Build Coastguard Worker 
700*bbecb9d1SAndroid Build Coastguard Worker     /* draw */
701*bbecb9d1SAndroid Build Coastguard Worker     {
702*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_draw_info info;
703*bbecb9d1SAndroid Build Coastguard Worker 	memset(&info, 0, sizeof(info));
704*bbecb9d1SAndroid Build Coastguard Worker 	info.count = 3;
705*bbecb9d1SAndroid Build Coastguard Worker 	info.mode = PIPE_PRIM_TRIANGLES;
706*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encoder_draw_vbo(&ctx, &info);
707*bbecb9d1SAndroid Build Coastguard Worker     }
708*bbecb9d1SAndroid Build Coastguard Worker 
709*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_submit_cmd(ctx.cbuf->buf, ctx.ctx_id, ctx.cbuf->cdw);
710*bbecb9d1SAndroid Build Coastguard Worker 
711*bbecb9d1SAndroid Build Coastguard Worker     /* create a fence */
712*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_reset_fence();
713*bbecb9d1SAndroid Build Coastguard Worker     ret = virgl_renderer_create_fence(1, ctx.ctx_id);
714*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
715*bbecb9d1SAndroid Build Coastguard Worker 
716*bbecb9d1SAndroid Build Coastguard Worker     do {
717*bbecb9d1SAndroid Build Coastguard Worker 	int fence;
718*bbecb9d1SAndroid Build Coastguard Worker 
719*bbecb9d1SAndroid Build Coastguard Worker 	virgl_renderer_poll();
720*bbecb9d1SAndroid Build Coastguard Worker 	fence = testvirgl_get_last_fence();
721*bbecb9d1SAndroid Build Coastguard Worker 	if (fence >= 1)
722*bbecb9d1SAndroid Build Coastguard Worker 	    break;
723*bbecb9d1SAndroid Build Coastguard Worker 	nanosleep((struct timespec[]){{0, 50000}}, NULL);
724*bbecb9d1SAndroid Build Coastguard Worker     } while(1);
725*bbecb9d1SAndroid Build Coastguard Worker 
726*bbecb9d1SAndroid Build Coastguard Worker     /* read back the tri values in the resource */
727*bbecb9d1SAndroid Build Coastguard Worker     box.x = 0;
728*bbecb9d1SAndroid Build Coastguard Worker     box.y = 0;
729*bbecb9d1SAndroid Build Coastguard Worker     box.z = 0;
730*bbecb9d1SAndroid Build Coastguard Worker     box.w = tw;
731*bbecb9d1SAndroid Build Coastguard Worker     box.h = th;
732*bbecb9d1SAndroid Build Coastguard Worker     box.d = 1;
733*bbecb9d1SAndroid Build Coastguard Worker     ret = virgl_renderer_transfer_read_iov(res.handle, ctx.ctx_id, 0, 0, 0, &box, 0, NULL, 0);
734*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
735*bbecb9d1SAndroid Build Coastguard Worker 
736*bbecb9d1SAndroid Build Coastguard Worker     {
737*bbecb9d1SAndroid Build Coastguard Worker 	int w, h;
738*bbecb9d1SAndroid Build Coastguard Worker 	bool all_cleared = true;
739*bbecb9d1SAndroid Build Coastguard Worker 	uint32_t *ptr = res.iovs[0].iov_base;
740*bbecb9d1SAndroid Build Coastguard Worker 	for (h = 0; h < th; h++) {
741*bbecb9d1SAndroid Build Coastguard Worker 	    for (w = 0; w < tw; w++) {
742*bbecb9d1SAndroid Build Coastguard Worker 		if (ptr[h * tw + w] != test_green)
743*bbecb9d1SAndroid Build Coastguard Worker 		    all_cleared = false;
744*bbecb9d1SAndroid Build Coastguard Worker 	    }
745*bbecb9d1SAndroid Build Coastguard Worker 	}
746*bbecb9d1SAndroid Build Coastguard Worker 	ck_assert_int_eq(all_cleared, false);
747*bbecb9d1SAndroid Build Coastguard Worker     }
748*bbecb9d1SAndroid Build Coastguard Worker 
749*bbecb9d1SAndroid Build Coastguard Worker     /* cleanup */
750*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_detach_resource(ctx.ctx_id, res.handle);
751*bbecb9d1SAndroid Build Coastguard Worker 
752*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_destroy_backed_res(&vbo);
753*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_destroy_backed_res(&res);
754*bbecb9d1SAndroid Build Coastguard Worker 
755*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_fini_ctx_cmdbuf(&ctx);
756*bbecb9d1SAndroid Build Coastguard Worker }
757*bbecb9d1SAndroid Build Coastguard Worker END_TEST
758*bbecb9d1SAndroid Build Coastguard Worker 
759*bbecb9d1SAndroid Build Coastguard Worker /* create a resource - clear it to a color, render something
760*bbecb9d1SAndroid Build Coastguard Worker  * and test transform feedback
761*bbecb9d1SAndroid Build Coastguard Worker  */
START_TEST(virgl_test_render_xfb)762*bbecb9d1SAndroid Build Coastguard Worker START_TEST(virgl_test_render_xfb)
763*bbecb9d1SAndroid Build Coastguard Worker {
764*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_context ctx;
765*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_resource res;
766*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_resource vbo;
767*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_resource xfb;
768*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_surface surf;
769*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_so_target so_target;
770*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_so_target *so_target_ptr;
771*bbecb9d1SAndroid Build Coastguard Worker     struct pipe_framebuffer_state fb_state;
772*bbecb9d1SAndroid Build Coastguard Worker     struct pipe_vertex_element ve[2];
773*bbecb9d1SAndroid Build Coastguard Worker     struct pipe_vertex_buffer vbuf;
774*bbecb9d1SAndroid Build Coastguard Worker     int ve_handle, vs_handle, fs_handle, xfb_handle;
775*bbecb9d1SAndroid Build Coastguard Worker     int ctx_handle = 1;
776*bbecb9d1SAndroid Build Coastguard Worker     union pipe_color_union color;
777*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_box box;
778*bbecb9d1SAndroid Build Coastguard Worker     int ret;
779*bbecb9d1SAndroid Build Coastguard Worker     int tw = 300, th = 300;
780*bbecb9d1SAndroid Build Coastguard Worker 
781*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_init_ctx_cmdbuf(&ctx);
782*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
783*bbecb9d1SAndroid Build Coastguard Worker 
784*bbecb9d1SAndroid Build Coastguard Worker     /* init and create simple 2D resource */
785*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_create_backed_simple_2d_res(&res, 1, tw, th);
786*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
787*bbecb9d1SAndroid Build Coastguard Worker 
788*bbecb9d1SAndroid Build Coastguard Worker     /* attach resource to context */
789*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_attach_resource(ctx.ctx_id, res.handle);
790*bbecb9d1SAndroid Build Coastguard Worker 
791*bbecb9d1SAndroid Build Coastguard Worker     /* create a surface for the resource */
792*bbecb9d1SAndroid Build Coastguard Worker     memset(&surf, 0, sizeof(surf));
793*bbecb9d1SAndroid Build Coastguard Worker     surf.base.format = PIPE_FORMAT_B8G8R8X8_UNORM;
794*bbecb9d1SAndroid Build Coastguard Worker     surf.handle = ctx_handle++;
795*bbecb9d1SAndroid Build Coastguard Worker     surf.base.texture = &res.base;
796*bbecb9d1SAndroid Build Coastguard Worker 
797*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_create_surface(&ctx, surf.handle, &res, &surf.base);
798*bbecb9d1SAndroid Build Coastguard Worker 
799*bbecb9d1SAndroid Build Coastguard Worker     /* set the framebuffer state */
800*bbecb9d1SAndroid Build Coastguard Worker     fb_state.nr_cbufs = 1;
801*bbecb9d1SAndroid Build Coastguard Worker     fb_state.zsbuf = NULL;
802*bbecb9d1SAndroid Build Coastguard Worker     fb_state.cbufs[0] = &surf.base;
803*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_set_framebuffer_state(&ctx, &fb_state);
804*bbecb9d1SAndroid Build Coastguard Worker 
805*bbecb9d1SAndroid Build Coastguard Worker     /* clear the resource */
806*bbecb9d1SAndroid Build Coastguard Worker     /* clear buffer to green */
807*bbecb9d1SAndroid Build Coastguard Worker     color.f[0] = 0.0;
808*bbecb9d1SAndroid Build Coastguard Worker     color.f[1] = 1.0;
809*bbecb9d1SAndroid Build Coastguard Worker     color.f[2] = 0.0;
810*bbecb9d1SAndroid Build Coastguard Worker     color.f[3] = 1.0;
811*bbecb9d1SAndroid Build Coastguard Worker     virgl_encode_clear(&ctx, PIPE_CLEAR_COLOR0, &color, 0.0, 0);
812*bbecb9d1SAndroid Build Coastguard Worker 
813*bbecb9d1SAndroid Build Coastguard Worker     /* create vertex elements */
814*bbecb9d1SAndroid Build Coastguard Worker     ve_handle = ctx_handle++;
815*bbecb9d1SAndroid Build Coastguard Worker     memset(ve, 0, sizeof(ve));
816*bbecb9d1SAndroid Build Coastguard Worker     ve[0].src_offset = Offset(struct vertex, position);
817*bbecb9d1SAndroid Build Coastguard Worker     ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
818*bbecb9d1SAndroid Build Coastguard Worker     ve[1].src_offset = Offset(struct vertex, color);
819*bbecb9d1SAndroid Build Coastguard Worker     ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
820*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_create_vertex_elements(&ctx, ve_handle, 2, ve);
821*bbecb9d1SAndroid Build Coastguard Worker 
822*bbecb9d1SAndroid Build Coastguard Worker     virgl_encode_bind_object(&ctx, ve_handle, VIRGL_OBJECT_VERTEX_ELEMENTS);
823*bbecb9d1SAndroid Build Coastguard Worker 
824*bbecb9d1SAndroid Build Coastguard Worker     /* create vbo */
825*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_create_backed_simple_buffer(&vbo, 2, sizeof(vertices), PIPE_BIND_VERTEX_BUFFER);
826*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
827*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_attach_resource(ctx.ctx_id, vbo.handle);
828*bbecb9d1SAndroid Build Coastguard Worker 
829*bbecb9d1SAndroid Build Coastguard Worker     /* inline write the data to it */
830*bbecb9d1SAndroid Build Coastguard Worker     box.x = 0;
831*bbecb9d1SAndroid Build Coastguard Worker     box.y = 0;
832*bbecb9d1SAndroid Build Coastguard Worker     box.z = 0;
833*bbecb9d1SAndroid Build Coastguard Worker     box.w = sizeof(vertices);
834*bbecb9d1SAndroid Build Coastguard Worker     box.h = 1;
835*bbecb9d1SAndroid Build Coastguard Worker     box.d = 1;
836*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_inline_write(&ctx, &vbo, 0, 0, (struct pipe_box *)&box, &vertices, box.w, 0);
837*bbecb9d1SAndroid Build Coastguard Worker 
838*bbecb9d1SAndroid Build Coastguard Worker     vbuf.stride = sizeof(struct vertex);
839*bbecb9d1SAndroid Build Coastguard Worker     vbuf.buffer_offset = 0;
840*bbecb9d1SAndroid Build Coastguard Worker     vbuf.buffer = &vbo.base;
841*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_set_vertex_buffers(&ctx, 1, &vbuf);
842*bbecb9d1SAndroid Build Coastguard Worker 
843*bbecb9d1SAndroid Build Coastguard Worker     /* create stream output buffer */
844*bbecb9d1SAndroid Build Coastguard Worker     ret = testvirgl_create_backed_simple_buffer(&xfb, 3, 3*sizeof(vertices), PIPE_BIND_STREAM_OUTPUT);
845*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
846*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_attach_resource(ctx.ctx_id, xfb.handle);
847*bbecb9d1SAndroid Build Coastguard Worker 
848*bbecb9d1SAndroid Build Coastguard Worker     /* set streamout target */
849*bbecb9d1SAndroid Build Coastguard Worker     xfb_handle = ctx_handle++;
850*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_create_so_target(&ctx, xfb_handle, &xfb, 0, 3*sizeof(vertices));
851*bbecb9d1SAndroid Build Coastguard Worker     so_target.handle = xfb_handle;
852*bbecb9d1SAndroid Build Coastguard Worker     so_target_ptr = &so_target;
853*bbecb9d1SAndroid Build Coastguard Worker     virgl_encoder_set_so_targets(&ctx, 1, (struct pipe_stream_output_target **)&so_target_ptr, 0);
854*bbecb9d1SAndroid Build Coastguard Worker 
855*bbecb9d1SAndroid Build Coastguard Worker     /* create vertex shader */
856*bbecb9d1SAndroid Build Coastguard Worker     {
857*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_shader_state vs;
858*bbecb9d1SAndroid Build Coastguard Worker          const char *text =
859*bbecb9d1SAndroid Build Coastguard Worker 	   "VERT\n"
860*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL IN[0]\n"
861*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL IN[1]\n"
862*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL OUT[0], POSITION\n"
863*bbecb9d1SAndroid Build Coastguard Worker 	   "DCL OUT[1], COLOR\n"
864*bbecb9d1SAndroid Build Coastguard Worker 	   "  0: MOV OUT[1], IN[1]\n"
865*bbecb9d1SAndroid Build Coastguard Worker 	   "  1: MOV OUT[0], IN[0]\n"
866*bbecb9d1SAndroid Build Coastguard Worker 	   "  2: END\n";
867*bbecb9d1SAndroid Build Coastguard Worker 	 memset(&vs, 0, sizeof(vs));
868*bbecb9d1SAndroid Build Coastguard Worker 	 vs_handle = ctx_handle++;
869*bbecb9d1SAndroid Build Coastguard Worker 	 vs.stream_output.num_outputs = 1;
870*bbecb9d1SAndroid Build Coastguard Worker 	 vs.stream_output.stride[0] = 4;
871*bbecb9d1SAndroid Build Coastguard Worker 	 vs.stream_output.output[0].num_components = 4;
872*bbecb9d1SAndroid Build Coastguard Worker 	 virgl_encode_shader_state(&ctx, vs_handle, PIPE_SHADER_VERTEX,
873*bbecb9d1SAndroid Build Coastguard Worker 				   &vs, text);
874*bbecb9d1SAndroid Build Coastguard Worker          virgl_encode_bind_shader(&ctx, vs_handle, PIPE_SHADER_VERTEX);
875*bbecb9d1SAndroid Build Coastguard Worker     }
876*bbecb9d1SAndroid Build Coastguard Worker 
877*bbecb9d1SAndroid Build Coastguard Worker     /* create fragment shader */
878*bbecb9d1SAndroid Build Coastguard Worker     {
879*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_shader_state fs;
880*bbecb9d1SAndroid Build Coastguard Worker 	const char *text =
881*bbecb9d1SAndroid Build Coastguard Worker 	    "FRAG\n"
882*bbecb9d1SAndroid Build Coastguard Worker 	    "DCL IN[0], COLOR, LINEAR\n"
883*bbecb9d1SAndroid Build Coastguard Worker 	    "DCL OUT[0], COLOR\n"
884*bbecb9d1SAndroid Build Coastguard Worker 	    "  0: MOV OUT[0], IN[0]\n"
885*bbecb9d1SAndroid Build Coastguard Worker 	    "  1: END\n";
886*bbecb9d1SAndroid Build Coastguard Worker 	memset(&fs, 0, sizeof(fs));
887*bbecb9d1SAndroid Build Coastguard Worker 	fs_handle = ctx_handle++;
888*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_shader_state(&ctx, fs_handle, PIPE_SHADER_FRAGMENT,
889*bbecb9d1SAndroid Build Coastguard Worker 				   &fs, text);
890*bbecb9d1SAndroid Build Coastguard Worker         virgl_encode_bind_shader(&ctx, fs_handle, PIPE_SHADER_FRAGMENT);
891*bbecb9d1SAndroid Build Coastguard Worker     }
892*bbecb9d1SAndroid Build Coastguard Worker 
893*bbecb9d1SAndroid Build Coastguard Worker     /* set blend state */
894*bbecb9d1SAndroid Build Coastguard Worker     {
895*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_blend_state blend;
896*bbecb9d1SAndroid Build Coastguard Worker 	int blend_handle = ctx_handle++;
897*bbecb9d1SAndroid Build Coastguard Worker 	memset(&blend, 0, sizeof(blend));
898*bbecb9d1SAndroid Build Coastguard Worker 	blend.rt[0].colormask = PIPE_MASK_RGBA;
899*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_blend_state(&ctx, blend_handle, &blend);
900*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_bind_object(&ctx, blend_handle, VIRGL_OBJECT_BLEND);
901*bbecb9d1SAndroid Build Coastguard Worker     }
902*bbecb9d1SAndroid Build Coastguard Worker 
903*bbecb9d1SAndroid Build Coastguard Worker     /* set depth stencil alpha state */
904*bbecb9d1SAndroid Build Coastguard Worker     {
905*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_depth_stencil_alpha_state dsa;
906*bbecb9d1SAndroid Build Coastguard Worker 	int dsa_handle = ctx_handle++;
907*bbecb9d1SAndroid Build Coastguard Worker 	memset(&dsa, 0, sizeof(dsa));
908*bbecb9d1SAndroid Build Coastguard Worker 	dsa.depth.writemask = 1;
909*bbecb9d1SAndroid Build Coastguard Worker 	dsa.depth.func = PIPE_FUNC_LESS;
910*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_dsa_state(&ctx, dsa_handle, &dsa);
911*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_bind_object(&ctx, dsa_handle, VIRGL_OBJECT_DSA);
912*bbecb9d1SAndroid Build Coastguard Worker     }
913*bbecb9d1SAndroid Build Coastguard Worker 
914*bbecb9d1SAndroid Build Coastguard Worker     /* set rasterizer state */
915*bbecb9d1SAndroid Build Coastguard Worker     {
916*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_rasterizer_state rasterizer;
917*bbecb9d1SAndroid Build Coastguard Worker 	int rs_handle = ctx_handle++;
918*bbecb9d1SAndroid Build Coastguard Worker 	memset(&rasterizer, 0, sizeof(rasterizer));
919*bbecb9d1SAndroid Build Coastguard Worker 	rasterizer.cull_face = PIPE_FACE_NONE;
920*bbecb9d1SAndroid Build Coastguard Worker 	rasterizer.half_pixel_center = 1;
921*bbecb9d1SAndroid Build Coastguard Worker 	rasterizer.bottom_edge_rule = 1;
922*bbecb9d1SAndroid Build Coastguard Worker 	rasterizer.depth_clip = 1;
923*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_rasterizer_state(&ctx, rs_handle, &rasterizer);
924*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encode_bind_object(&ctx, rs_handle, VIRGL_OBJECT_RASTERIZER);
925*bbecb9d1SAndroid Build Coastguard Worker     }
926*bbecb9d1SAndroid Build Coastguard Worker 
927*bbecb9d1SAndroid Build Coastguard Worker     /* set viewport state */
928*bbecb9d1SAndroid Build Coastguard Worker     {
929*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_viewport_state vp;
930*bbecb9d1SAndroid Build Coastguard Worker 	float znear = 0, zfar = 1.0;
931*bbecb9d1SAndroid Build Coastguard Worker 	float half_w = tw / 2.0f;
932*bbecb9d1SAndroid Build Coastguard Worker 	float half_h = th / 2.0f;
933*bbecb9d1SAndroid Build Coastguard Worker 	float half_d = (zfar - znear) / 2.0f;
934*bbecb9d1SAndroid Build Coastguard Worker 
935*bbecb9d1SAndroid Build Coastguard Worker 	vp.scale[0] = half_w;
936*bbecb9d1SAndroid Build Coastguard Worker 	vp.scale[1] = half_h;
937*bbecb9d1SAndroid Build Coastguard Worker 	vp.scale[2] = half_d;
938*bbecb9d1SAndroid Build Coastguard Worker 
939*bbecb9d1SAndroid Build Coastguard Worker 	vp.translate[0] = half_w + 0;
940*bbecb9d1SAndroid Build Coastguard Worker 	vp.translate[1] = half_h + 0;
941*bbecb9d1SAndroid Build Coastguard Worker 	vp.translate[2] = half_d + znear;
942*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encoder_set_viewport_states(&ctx, 0, 1, &vp);
943*bbecb9d1SAndroid Build Coastguard Worker     }
944*bbecb9d1SAndroid Build Coastguard Worker 
945*bbecb9d1SAndroid Build Coastguard Worker     /* draw */
946*bbecb9d1SAndroid Build Coastguard Worker     {
947*bbecb9d1SAndroid Build Coastguard Worker 	struct pipe_draw_info info;
948*bbecb9d1SAndroid Build Coastguard Worker 	memset(&info, 0, sizeof(info));
949*bbecb9d1SAndroid Build Coastguard Worker 	info.count = 3;
950*bbecb9d1SAndroid Build Coastguard Worker 	info.mode = PIPE_PRIM_TRIANGLES;
951*bbecb9d1SAndroid Build Coastguard Worker 	virgl_encoder_draw_vbo(&ctx, &info);
952*bbecb9d1SAndroid Build Coastguard Worker     }
953*bbecb9d1SAndroid Build Coastguard Worker 
954*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_submit_cmd(ctx.cbuf->buf, ctx.ctx_id, ctx.cbuf->cdw);
955*bbecb9d1SAndroid Build Coastguard Worker 
956*bbecb9d1SAndroid Build Coastguard Worker     /* create a fence */
957*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_reset_fence();
958*bbecb9d1SAndroid Build Coastguard Worker     ret = virgl_renderer_create_fence(1, ctx.ctx_id);
959*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
960*bbecb9d1SAndroid Build Coastguard Worker 
961*bbecb9d1SAndroid Build Coastguard Worker     do {
962*bbecb9d1SAndroid Build Coastguard Worker 	int fence;
963*bbecb9d1SAndroid Build Coastguard Worker 
964*bbecb9d1SAndroid Build Coastguard Worker 	virgl_renderer_poll();
965*bbecb9d1SAndroid Build Coastguard Worker 	fence = testvirgl_get_last_fence();
966*bbecb9d1SAndroid Build Coastguard Worker 	if (fence >= 1)
967*bbecb9d1SAndroid Build Coastguard Worker 	    break;
968*bbecb9d1SAndroid Build Coastguard Worker 	nanosleep((struct timespec[]){{0, 50000}}, NULL);
969*bbecb9d1SAndroid Build Coastguard Worker     } while(1);
970*bbecb9d1SAndroid Build Coastguard Worker 
971*bbecb9d1SAndroid Build Coastguard Worker     /* read back the tri values in the resource */
972*bbecb9d1SAndroid Build Coastguard Worker     box.x = 0;
973*bbecb9d1SAndroid Build Coastguard Worker     box.y = 0;
974*bbecb9d1SAndroid Build Coastguard Worker     box.z = 0;
975*bbecb9d1SAndroid Build Coastguard Worker     box.w = tw;
976*bbecb9d1SAndroid Build Coastguard Worker     box.h = th;
977*bbecb9d1SAndroid Build Coastguard Worker     box.d = 1;
978*bbecb9d1SAndroid Build Coastguard Worker     ret = virgl_renderer_transfer_read_iov(res.handle, ctx.ctx_id, 0, 0, 0, &box, 0, NULL, 0);
979*bbecb9d1SAndroid Build Coastguard Worker     ck_assert_int_eq(ret, 0);
980*bbecb9d1SAndroid Build Coastguard Worker 
981*bbecb9d1SAndroid Build Coastguard Worker     {
982*bbecb9d1SAndroid Build Coastguard Worker 	int w, h;
983*bbecb9d1SAndroid Build Coastguard Worker 	bool all_cleared = true;
984*bbecb9d1SAndroid Build Coastguard Worker 	uint32_t *ptr = res.iovs[0].iov_base;
985*bbecb9d1SAndroid Build Coastguard Worker 	for (h = 0; h < th; h++) {
986*bbecb9d1SAndroid Build Coastguard Worker 	    for (w = 0; w < tw; w++) {
987*bbecb9d1SAndroid Build Coastguard Worker 		if (ptr[h * tw + w] != test_green)
988*bbecb9d1SAndroid Build Coastguard Worker 		    all_cleared = false;
989*bbecb9d1SAndroid Build Coastguard Worker 	    }
990*bbecb9d1SAndroid Build Coastguard Worker 	}
991*bbecb9d1SAndroid Build Coastguard Worker 	ck_assert_int_eq(all_cleared, false);
992*bbecb9d1SAndroid Build Coastguard Worker     }
993*bbecb9d1SAndroid Build Coastguard Worker 
994*bbecb9d1SAndroid Build Coastguard Worker     /* cleanup */
995*bbecb9d1SAndroid Build Coastguard Worker     virgl_renderer_ctx_detach_resource(ctx.ctx_id, res.handle);
996*bbecb9d1SAndroid Build Coastguard Worker 
997*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_destroy_backed_res(&xfb);
998*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_destroy_backed_res(&vbo);
999*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_destroy_backed_res(&res);
1000*bbecb9d1SAndroid Build Coastguard Worker 
1001*bbecb9d1SAndroid Build Coastguard Worker     testvirgl_fini_ctx_cmdbuf(&ctx);
1002*bbecb9d1SAndroid Build Coastguard Worker }
1003*bbecb9d1SAndroid Build Coastguard Worker END_TEST
1004*bbecb9d1SAndroid Build Coastguard Worker 
1005*bbecb9d1SAndroid Build Coastguard Worker /* send a large shader across */
START_TEST(virgl_test_large_shader)1006*bbecb9d1SAndroid Build Coastguard Worker START_TEST(virgl_test_large_shader)
1007*bbecb9d1SAndroid Build Coastguard Worker {
1008*bbecb9d1SAndroid Build Coastguard Worker    int ret;
1009*bbecb9d1SAndroid Build Coastguard Worker    struct virgl_context ctx;
1010*bbecb9d1SAndroid Build Coastguard Worker    int ctx_handle = 1;
1011*bbecb9d1SAndroid Build Coastguard Worker    int fs_handle;
1012*bbecb9d1SAndroid Build Coastguard Worker    ret = testvirgl_init_ctx_cmdbuf(&ctx);
1013*bbecb9d1SAndroid Build Coastguard Worker    ck_assert_int_eq(ret, 0);
1014*bbecb9d1SAndroid Build Coastguard Worker 
1015*bbecb9d1SAndroid Build Coastguard Worker    /* create large fragment shader */
1016*bbecb9d1SAndroid Build Coastguard Worker    {
1017*bbecb9d1SAndroid Build Coastguard Worker       struct pipe_shader_state fs;
1018*bbecb9d1SAndroid Build Coastguard Worker       const char *text = large_frag;
1019*bbecb9d1SAndroid Build Coastguard Worker 
1020*bbecb9d1SAndroid Build Coastguard Worker       memset(&fs, 0, sizeof(fs));
1021*bbecb9d1SAndroid Build Coastguard Worker       fs_handle = ctx_handle++;
1022*bbecb9d1SAndroid Build Coastguard Worker       virgl_encode_shader_state(&ctx, fs_handle, PIPE_SHADER_FRAGMENT,
1023*bbecb9d1SAndroid Build Coastguard Worker                                 &fs, text);
1024*bbecb9d1SAndroid Build Coastguard Worker 
1025*bbecb9d1SAndroid Build Coastguard Worker       virgl_encode_bind_shader(&ctx, fs_handle, PIPE_SHADER_FRAGMENT);
1026*bbecb9d1SAndroid Build Coastguard Worker    }
1027*bbecb9d1SAndroid Build Coastguard Worker 
1028*bbecb9d1SAndroid Build Coastguard Worker    testvirgl_fini_ctx_cmdbuf(&ctx);
1029*bbecb9d1SAndroid Build Coastguard Worker }
1030*bbecb9d1SAndroid Build Coastguard Worker END_TEST
1031*bbecb9d1SAndroid Build Coastguard Worker 
virgl_init_suite(void)1032*bbecb9d1SAndroid Build Coastguard Worker static Suite *virgl_init_suite(void)
1033*bbecb9d1SAndroid Build Coastguard Worker {
1034*bbecb9d1SAndroid Build Coastguard Worker   Suite *s;
1035*bbecb9d1SAndroid Build Coastguard Worker   TCase *tc_core;
1036*bbecb9d1SAndroid Build Coastguard Worker 
1037*bbecb9d1SAndroid Build Coastguard Worker   s = suite_create("virgl_clear");
1038*bbecb9d1SAndroid Build Coastguard Worker   tc_core = tcase_create("clear");
1039*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, virgl_test_clear);
1040*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, virgl_test_blit_simple);
1041*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, virgl_test_overlap_obj_id);
1042*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, virgl_test_large_shader);
1043*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, virgl_test_render_simple);
1044*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, virgl_test_render_geom_simple);
1045*bbecb9d1SAndroid Build Coastguard Worker   tcase_add_test(tc_core, virgl_test_render_xfb);
1046*bbecb9d1SAndroid Build Coastguard Worker 
1047*bbecb9d1SAndroid Build Coastguard Worker   suite_add_tcase(s, tc_core);
1048*bbecb9d1SAndroid Build Coastguard Worker   return s;
1049*bbecb9d1SAndroid Build Coastguard Worker 
1050*bbecb9d1SAndroid Build Coastguard Worker }
1051*bbecb9d1SAndroid Build Coastguard Worker 
main(void)1052*bbecb9d1SAndroid Build Coastguard Worker int main(void)
1053*bbecb9d1SAndroid Build Coastguard Worker {
1054*bbecb9d1SAndroid Build Coastguard Worker   Suite *s;
1055*bbecb9d1SAndroid Build Coastguard Worker   SRunner *sr;
1056*bbecb9d1SAndroid Build Coastguard Worker   int number_failed;
1057*bbecb9d1SAndroid Build Coastguard Worker 
1058*bbecb9d1SAndroid Build Coastguard Worker   if (getenv("VRENDTEST_USE_EGL_SURFACELESS"))
1059*bbecb9d1SAndroid Build Coastguard Worker      context_flags |= VIRGL_RENDERER_USE_SURFACELESS;
1060*bbecb9d1SAndroid Build Coastguard Worker    if (getenv("VRENDTEST_USE_EGL_GLES"))
1061*bbecb9d1SAndroid Build Coastguard Worker       context_flags |= VIRGL_RENDERER_USE_GLES;
1062*bbecb9d1SAndroid Build Coastguard Worker 
1063*bbecb9d1SAndroid Build Coastguard Worker   s = virgl_init_suite();
1064*bbecb9d1SAndroid Build Coastguard Worker   sr = srunner_create(s);
1065*bbecb9d1SAndroid Build Coastguard Worker 
1066*bbecb9d1SAndroid Build Coastguard Worker   srunner_run_all(sr, CK_NORMAL);
1067*bbecb9d1SAndroid Build Coastguard Worker   number_failed = srunner_ntests_failed(sr);
1068*bbecb9d1SAndroid Build Coastguard Worker   srunner_free(sr);
1069*bbecb9d1SAndroid Build Coastguard Worker 
1070*bbecb9d1SAndroid Build Coastguard Worker   return number_failed == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
1071*bbecb9d1SAndroid Build Coastguard Worker }
1072