1e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák/**************************************************************************
2e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák *
3e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * Copyright 2014 Advanced Micro Devices, Inc.
4e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * All Rights Reserved.
5e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák *
6e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * Permission is hereby granted, free of charge, to any person obtaining a
7e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * copy of this software and associated documentation files (the
8e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * "Software"), to deal in the Software without restriction, including
9e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * without limitation the rights to use, copy, modify, merge, publish,
10e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * distribute, sub license, and/or sell copies of the Software, and to
11e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * permit persons to whom the Software is furnished to do so, subject to
12e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * the following conditions:
13e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák *
14e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * The above copyright notice and this permission notice (including the
15e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * next paragraph) shall be included in all copies or substantial portions
16e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * of the Software.
17e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák *
18e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
22e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák *
26e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák **************************************************************************/
27e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
28e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák#include "util/u_tests.h"
29e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
30e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák#include "util/u_draw_quad.h"
31e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák#include "util/u_format.h"
32e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák#include "util/u_inlines.h"
3356e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák#include "util/u_memory.h"
34e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák#include "util/u_simple_shaders.h"
35e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák#include "util/u_surface.h"
3640fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák#include "util/u_string.h"
37e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák#include "util/u_tile.h"
3840fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák#include "tgsi/tgsi_strings.h"
3956e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák#include "tgsi/tgsi_text.h"
40e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák#include "cso_cache/cso_context.h"
41e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák#include <stdio.h>
42e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
43e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák#define TOLERANCE 0.01
44e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
45e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákstatic struct pipe_resource *
46e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákutil_create_texture2d(struct pipe_screen *screen, unsigned width,
47e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák                      unsigned height, enum pipe_format format)
48e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák{
49e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   struct pipe_resource templ = {{0}};
50e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
51e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   templ.target = PIPE_TEXTURE_2D;
52e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   templ.width0 = width;
53e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   templ.height0 = height;
54e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   templ.depth0 = 1;
55e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   templ.array_size = 1;
56e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   templ.format = format;
57e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   templ.usage = PIPE_USAGE_DEFAULT;
58e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   templ.bind = PIPE_BIND_SAMPLER_VIEW |
59e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák                (util_format_is_depth_or_stencil(format) ?
60e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák                    PIPE_BIND_DEPTH_STENCIL : PIPE_BIND_RENDER_TARGET);
61e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
62e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   return screen->resource_create(screen, &templ);
63e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák}
64e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
65e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákstatic void
66e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákutil_set_framebuffer_cb0(struct cso_context *cso, struct pipe_context *ctx,
67e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák			 struct pipe_resource *tex)
68e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák{
69e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   struct pipe_surface templ = {{0}}, *surf;
70e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   struct pipe_framebuffer_state fb = {0};
71e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
72e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   templ.format = tex->format;
73e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   surf = ctx->create_surface(ctx, tex, &templ);
74e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
75e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   fb.width = tex->width0;
76e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   fb.height = tex->height0;
77e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   fb.cbufs[0] = surf;
78e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   fb.nr_cbufs = 1;
79e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
80e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   cso_set_framebuffer(cso, &fb);
81e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   pipe_surface_reference(&surf, NULL);
82e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák}
83e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
84e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákstatic void
85e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákutil_set_blend_normal(struct cso_context *cso)
86e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák{
87e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   struct pipe_blend_state blend = {0};
88e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
89e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   blend.rt[0].colormask = PIPE_MASK_RGBA;
90e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   cso_set_blend(cso, &blend);
91e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák}
92e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
93e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákstatic void
94e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákutil_set_dsa_disable(struct cso_context *cso)
95e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák{
96e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   struct pipe_depth_stencil_alpha_state dsa = {{0}};
97e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
98e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   cso_set_depth_stencil_alpha(cso, &dsa);
99e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák}
100e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
101e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákstatic void
102e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákutil_set_rasterizer_normal(struct cso_context *cso)
103e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák{
104e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   struct pipe_rasterizer_state rs = {0};
105e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
106e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   rs.half_pixel_center = 1;
107e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   rs.bottom_edge_rule = 1;
108e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   rs.depth_clip = 1;
109e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
110e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   cso_set_rasterizer(cso, &rs);
111e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák}
112e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
113e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákstatic void
114e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákutil_set_max_viewport(struct cso_context *cso, struct pipe_resource *tex)
115e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák{
116e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   struct pipe_viewport_state viewport;
117e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
118e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   viewport.scale[0] = 0.5f * tex->width0;
119e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   viewport.scale[1] = 0.5f * tex->height0;
120e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   viewport.scale[2] = 1.0f;
121e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   viewport.translate[0] = 0.5f * tex->width0;
122e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   viewport.translate[1] = 0.5f * tex->height0;
123e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   viewport.translate[2] = 0.0f;
124e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
125e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   cso_set_viewport(cso, &viewport);
126e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák}
127e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
128e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákstatic void
129e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákutil_set_interleaved_vertex_elements(struct cso_context *cso,
130e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák                                     unsigned num_elements)
131e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák{
132ebbe31d57c195245b2b556c14291cafccc835738Jan Vesely   unsigned i;
133e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   struct pipe_vertex_element *velem =
134e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák      calloc(1, num_elements * sizeof(struct pipe_vertex_element));
135e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
136e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   for (i = 0; i < num_elements; i++) {
137e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák      velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
138e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák      velem[i].src_offset = i * 16;
139e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   }
140e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
141e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   cso_set_vertex_elements(cso, num_elements, velem);
142e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   free(velem);
143e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák}
144e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
14563e51baedcf7c833289645a94ab36bef45b701ecMarek Olšákstatic void *
14663e51baedcf7c833289645a94ab36bef45b701ecMarek Olšákutil_set_passthrough_vertex_shader(struct cso_context *cso,
14763e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák                                   struct pipe_context *ctx,
14863e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák                                   bool window_space)
14963e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák{
15063e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   static const uint vs_attribs[] = {
15163e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák      TGSI_SEMANTIC_POSITION,
15263e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák      TGSI_SEMANTIC_GENERIC
15363e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   };
15463e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   static const uint vs_indices[] = {0, 0};
15563e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   void *vs;
15663e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák
15763e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   vs = util_make_vertex_passthrough_shader(ctx, 2, vs_attribs, vs_indices,
15863e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák                                            window_space);
15963e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   cso_set_vertex_shader_handle(cso, vs);
16063e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   return vs;
16163e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák}
16263e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák
16363e51baedcf7c833289645a94ab36bef45b701ecMarek Olšákstatic void
16463e51baedcf7c833289645a94ab36bef45b701ecMarek Olšákutil_set_common_states_and_clear(struct cso_context *cso, struct pipe_context *ctx,
16563e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák                                 struct pipe_resource *cb)
16663e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák{
16763e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   static const float clear_color[] = {0.1, 0.1, 0.1, 0.1};
16863e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák
16963e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   util_set_framebuffer_cb0(cso, ctx, cb);
17063e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   util_set_blend_normal(cso);
17163e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   util_set_dsa_disable(cso);
17263e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   util_set_rasterizer_normal(cso);
17363e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   util_set_max_viewport(cso, cb);
17463e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák
17563e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   ctx->clear(ctx, PIPE_CLEAR_COLOR0, (void*)clear_color, 0, 0);
17663e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák}
17763e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák
17863e51baedcf7c833289645a94ab36bef45b701ecMarek Olšákstatic void
17963e51baedcf7c833289645a94ab36bef45b701ecMarek Olšákutil_draw_fullscreen_quad(struct cso_context *cso)
18063e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák{
18163e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   static float vertices[] = {
18263e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák     -1, -1, 0, 1,   0, 0, 0, 0,
18363e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák     -1,  1, 0, 1,   0, 1, 0, 0,
18463e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák      1,  1, 0, 1,   1, 1, 0, 0,
18563e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák      1, -1, 0, 1,   1, 0, 0, 0
18663e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   };
18763e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   util_set_interleaved_vertex_elements(cso, 2);
18863e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   util_draw_user_vertex_buffer(cso, vertices, PIPE_PRIM_QUADS, 4, 2);
18963e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák}
19063e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák
1919e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák/**
1929e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák * Probe and test if the rectangle contains the expected color.
1939e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák *
1949e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák * If "num_expected_colors" > 1, at least one expected color must match
1959e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák * the probed color. "expected" should be an array of 4*num_expected_colors
1969e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák * floats.
1979e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák */
198e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákstatic bool
1999e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšákutil_probe_rect_rgba_multi(struct pipe_context *ctx, struct pipe_resource *tex,
2009e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                           unsigned offx, unsigned offy, unsigned w,
2019e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                           unsigned h,
2029e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                           const float *expected,
2039e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                           unsigned num_expected_colors)
204e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák{
205e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   struct pipe_transfer *transfer;
206e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   void *map;
207e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   float *pixels = malloc(w * h * 4 * sizeof(float));
208ebbe31d57c195245b2b556c14291cafccc835738Jan Vesely   unsigned x,y,e,c;
209e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   bool pass = true;
210e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
211e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   map = pipe_transfer_map(ctx, tex, 0, 0, PIPE_TRANSFER_READ,
212e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák                           offx, offy, w, h, &transfer);
213e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   pipe_get_tile_rgba(transfer, map, 0, 0, w, h, pixels);
214e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   pipe_transfer_unmap(ctx, transfer);
215e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
2169e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   for (e = 0; e < num_expected_colors; e++) {
2179e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák      for (y = 0; y < h; y++) {
2189e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák         for (x = 0; x < w; x++) {
2199e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák            float *probe = &pixels[(y*w + x)*4];
2209e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák
2219e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák            for (c = 0; c < 4; c++) {
2229e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák               if (fabs(probe[c] - expected[e*4+c]) >= TOLERANCE) {
2239e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                  if (e < num_expected_colors-1)
2249e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                     goto next_color; /* test the next expected color */
2259e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák
2269e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                  printf("Probe color at (%i,%i),  ", offx+x, offy+y);
2279e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                  printf("Expected: %.3f, %.3f, %.3f, %.3f,  ",
2289e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                         expected[e*4], expected[e*4+1],
2299e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                         expected[e*4+2], expected[e*4+3]);
2309e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                  printf("Got: %.3f, %.3f, %.3f, %.3f\n",
2319e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                         probe[0], probe[1], probe[2], probe[2]);
2329e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                  pass = false;
2339e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                  goto done;
2349e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák               }
235e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák            }
2369e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák         }
237e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák      }
2389e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák      break; /* this color was successful */
2399e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák
2409e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   next_color:;
241e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   }
242e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákdone:
243e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
244e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   free(pixels);
245e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   return pass;
246e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák}
247e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
2489e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšákstatic bool
2499e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšákutil_probe_rect_rgba(struct pipe_context *ctx, struct pipe_resource *tex,
2509e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                     unsigned offx, unsigned offy, unsigned w, unsigned h,
2519e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                     const float *expected)
2529e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák{
2539e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   return util_probe_rect_rgba_multi(ctx, tex, offx, offy, w, h, expected, 1);
2549e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák}
2559e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák
25663e51baedcf7c833289645a94ab36bef45b701ecMarek Olšákenum {
25763e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   SKIP = -1,
25863e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   FAIL = 0, /* also "false" */
25963e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   PASS = 1 /* also "true" */
26063e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák};
26163e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák
26263e51baedcf7c833289645a94ab36bef45b701ecMarek Olšákstatic void
26340fa7d44aba923308c30e96fd319b371f99f4545Marek Olšákutil_report_result_helper(int status, const char *name, ...)
26463e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák{
26540fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   char buf[256];
26640fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   va_list ap;
26740fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák
26840fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   va_start(ap, name);
26940fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   util_vsnprintf(buf, sizeof(buf), name, ap);
27040fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   va_end(ap);
27140fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák
27240fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   printf("Test(%s) = %s\n", buf,
27363e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák          status == SKIP ? "skip" :
27463e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák          status == PASS ? "pass" : "fail");
27563e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák}
27663e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák
27740fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák#define util_report_result(status) util_report_result_helper(status, __func__)
27863e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák
279e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák/**
280e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * Test TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION.
281e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák *
282e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * The viewport state is set as usual, but it should have no effect.
283e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * Clipping should also be disabled.
284e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák *
285e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * POSITION.xyz should already be multiplied by 1/w and POSITION.w should
286e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * contain 1/w. By setting w=0, we can test that POSITION.xyz isn't
287e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * multiplied by 1/w (otherwise nothing would be rendered).
288e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák *
289e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * TODO: Whether the value of POSITION.w is correctly interpreted as 1/w
290e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák *       during perspective interpolation is not tested.
291e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák */
292e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákstatic void
293e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšáktgsi_vs_window_space_position(struct pipe_context *ctx)
294e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák{
295e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   struct cso_context *cso;
296e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   struct pipe_resource *cb;
297e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   void *fs, *vs;
298e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   bool pass = true;
29963e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   static const float red[] = {1, 0, 0, 1};
300e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
301e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   if (!ctx->screen->get_param(ctx->screen,
302e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák                               PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION)) {
30363e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák      util_report_result(SKIP);
304e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák      return;
305e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   }
306e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
307e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   cso = cso_create_context(ctx);
308e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   cb = util_create_texture2d(ctx->screen, 256, 256,
309e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák                              PIPE_FORMAT_R8G8B8A8_UNORM);
31063e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   util_set_common_states_and_clear(cso, ctx, cb);
311e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
312e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   /* Fragment shader. */
313e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   fs = util_make_fragment_passthrough_shader(ctx, TGSI_SEMANTIC_GENERIC,
314e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák                                       TGSI_INTERPOLATE_LINEAR, TRUE);
315e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   cso_set_fragment_shader_handle(cso, fs);
316e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
317e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   /* Vertex shader. */
31863e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   vs = util_set_passthrough_vertex_shader(cso, ctx, true);
31963e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák
32063e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   /* Draw. */
32163e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   {
32263e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák      static float vertices[] = {
32363e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák          0,   0, 0, 0,   1,  0, 0, 1,
32463e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák          0, 256, 0, 0,   1,  0, 0, 1,
32563e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák        256, 256, 0, 0,   1,  0, 0, 1,
32663e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák        256,   0, 0, 0,   1,  0, 0, 1,
32763e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák      };
32863e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák      util_set_interleaved_vertex_elements(cso, 2);
32963e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák      util_draw_user_vertex_buffer(cso, vertices, PIPE_PRIM_QUADS, 4, 2);
33063e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   }
331e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
332e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   /* Probe pixels. */
333e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   pass = pass && util_probe_rect_rgba(ctx, cb, 0, 0,
334e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák                                       cb->width0, cb->height0, red);
335e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
336e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   /* Cleanup. */
337e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   cso_destroy_context(cso);
338e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   ctx->delete_vs_state(ctx, vs);
339e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   ctx->delete_fs_state(ctx, fs);
340e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   pipe_resource_reference(&cb, NULL);
341e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
34263e51baedcf7c833289645a94ab36bef45b701ecMarek Olšák   util_report_result(pass);
343e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák}
344e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák
3459e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšákstatic void
34640fa7d44aba923308c30e96fd319b371f99f4545Marek Olšáknull_sampler_view(struct pipe_context *ctx, unsigned tgsi_tex_target)
3479e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák{
3489e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   struct cso_context *cso;
3499e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   struct pipe_resource *cb;
3509e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   void *fs, *vs;
3519e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   bool pass = true;
3529e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   /* 2 expected colors: */
35340fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   static const float expected_tex[] = {0, 0, 0, 1,
35440fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák                                        0, 0, 0, 0};
35540fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   static const float expected_buf[] = {0, 0, 0, 0};
35640fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   const float *expected = tgsi_tex_target == TGSI_TEXTURE_BUFFER ?
35740fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák                              expected_buf : expected_tex;
35840fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   unsigned num_expected = tgsi_tex_target == TGSI_TEXTURE_BUFFER ? 1 : 2;
35940fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák
36040fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   if (tgsi_tex_target == TGSI_TEXTURE_BUFFER &&
36140fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák       !ctx->screen->get_param(ctx->screen, PIPE_CAP_TEXTURE_BUFFER_OBJECTS)) {
36240fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák      util_report_result_helper(SKIP, "%s: %s", __func__,
36340fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák                                tgsi_texture_names[tgsi_tex_target]);
36440fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák      return;
36540fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   }
3669e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák
3679e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   cso = cso_create_context(ctx);
3689e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   cb = util_create_texture2d(ctx->screen, 256, 256,
3699e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák                              PIPE_FORMAT_R8G8B8A8_UNORM);
3709e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   util_set_common_states_and_clear(cso, ctx, cb);
3719e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák
3729e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   ctx->set_sampler_views(ctx, PIPE_SHADER_FRAGMENT, 0, 1, NULL);
3739e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák
3749e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   /* Fragment shader. */
37540fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   fs = util_make_fragment_tex_shader(ctx, tgsi_tex_target,
37693379748f7e4f5ab22040cdb7a4cccdcfb7954c1Rob Clark                                      TGSI_INTERPOLATE_LINEAR,
3773817a7a1d7434ae5ae069599013cea81cf809aa5Nicolai Hähnle                                      TGSI_RETURN_TYPE_FLOAT,
37893379748f7e4f5ab22040cdb7a4cccdcfb7954c1Rob Clark                                      TGSI_RETURN_TYPE_FLOAT);
3799e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   cso_set_fragment_shader_handle(cso, fs);
3809e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák
3819e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   /* Vertex shader. */
3829e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   vs = util_set_passthrough_vertex_shader(cso, ctx, false);
3839e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   util_draw_fullscreen_quad(cso);
3849e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák
3859e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   /* Probe pixels. */
3869e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   pass = pass && util_probe_rect_rgba_multi(ctx, cb, 0, 0,
38740fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák                                  cb->width0, cb->height0, expected,
38840fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák                                  num_expected);
3899e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák
3909e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   /* Cleanup. */
3919e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   cso_destroy_context(cso);
3929e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   ctx->delete_vs_state(ctx, vs);
3939e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   ctx->delete_fs_state(ctx, fs);
3949e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák   pipe_resource_reference(&cb, NULL);
3959e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák
39640fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   util_report_result_helper(pass, "%s: %s", __func__,
39740fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák                             tgsi_texture_names[tgsi_tex_target]);
3989e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák}
3999e8a6d848639d52d7459bc2a7eac1ce4d6410f02Marek Olšák
40056e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšákstatic void
40156e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšáknull_constant_buffer(struct pipe_context *ctx)
40256e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák{
40356e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   struct cso_context *cso;
40456e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   struct pipe_resource *cb;
40556e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   void *fs, *vs;
40656e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   bool pass = true;
40756e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   static const float zero[] = {0, 0, 0, 0};
40856e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák
40956e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   cso = cso_create_context(ctx);
41056e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   cb = util_create_texture2d(ctx->screen, 256, 256,
41156e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák                              PIPE_FORMAT_R8G8B8A8_UNORM);
41256e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   util_set_common_states_and_clear(cso, ctx, cb);
41356e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák
41456e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   ctx->set_constant_buffer(ctx, PIPE_SHADER_FRAGMENT, 0, NULL);
41556e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák
41656e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   /* Fragment shader. */
41756e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   {
41856e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák      static const char *text = /* I don't like ureg... */
41956e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák            "FRAG\n"
42056e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák            "DCL CONST[0]\n"
42156e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák            "DCL OUT[0], COLOR\n"
42256e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák
42356e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák            "MOV OUT[0], CONST[0]\n"
42456e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák            "END\n";
42556e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák      struct tgsi_token tokens[1000];
426425dc4c4b3663c619634de9f9f00c7765e7d0320Rob Clark      struct pipe_shader_state state;
42756e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák
428a609da60c034ab059ead213e6c25fe4d37bf7d43Brian Paul      if (!tgsi_text_translate(text, tokens, ARRAY_SIZE(tokens))) {
42956e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák         puts("Can't compile a fragment shader.");
43056e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák         util_report_result(FAIL);
43156e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák         return;
43256e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák      }
433425dc4c4b3663c619634de9f9f00c7765e7d0320Rob Clark      pipe_shader_state_from_tgsi(&state, tokens);
43456e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák      fs = ctx->create_fs_state(ctx, &state);
43556e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák      cso_set_fragment_shader_handle(cso, fs);
43656e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   }
43756e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák
43856e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   /* Vertex shader. */
43956e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   vs = util_set_passthrough_vertex_shader(cso, ctx, false);
44056e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   util_draw_fullscreen_quad(cso);
44156e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák
44256e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   /* Probe pixels. */
44356e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   pass = pass && util_probe_rect_rgba(ctx, cb, 0, 0, cb->width0,
44456e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák                                       cb->height0, zero);
44556e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák
44656e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   /* Cleanup. */
44756e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   cso_destroy_context(cso);
44856e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   ctx->delete_vs_state(ctx, vs);
44956e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   ctx->delete_fs_state(ctx, fs);
45056e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   pipe_resource_reference(&cb, NULL);
45156e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák
45256e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   util_report_result(pass);
45356e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák}
45456e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák
455d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšákstatic void
456d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšáknull_fragment_shader(struct pipe_context *ctx)
457d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák{
458d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   struct cso_context *cso;
459d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   struct pipe_resource *cb;
460d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   void *vs;
461d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   struct pipe_rasterizer_state rs = {0};
462d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   struct pipe_query *query;
463d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   union pipe_query_result qresult;
464d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák
465d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   cso = cso_create_context(ctx);
466d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   cb = util_create_texture2d(ctx->screen, 256, 256,
467d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák                              PIPE_FORMAT_R8G8B8A8_UNORM);
468d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   util_set_common_states_and_clear(cso, ctx, cb);
469d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák
470d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   /* No rasterization. */
471d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   rs.rasterizer_discard = 1;
472d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   cso_set_rasterizer(cso, &rs);
473d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák
474d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   vs = util_set_passthrough_vertex_shader(cso, ctx, false);
475d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák
476d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   query = ctx->create_query(ctx, PIPE_QUERY_PRIMITIVES_GENERATED, 0);
477d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   ctx->begin_query(ctx, query);
478d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   util_draw_fullscreen_quad(cso);
479d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   ctx->end_query(ctx, query);
480d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   ctx->get_query_result(ctx, query, true, &qresult);
481d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák
482d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   /* Cleanup. */
483d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   cso_destroy_context(cso);
484d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   ctx->delete_vs_state(ctx, vs);
485d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   ctx->destroy_query(ctx, query);
486d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   pipe_resource_reference(&cb, NULL);
487d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák
488d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   /* Check PRIMITIVES_GENERATED. */
489d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   util_report_result(qresult.u64 == 2);
490d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák}
491d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák
492e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák/**
493e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * Run all tests. This should be run with a clean context after
494e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák * context_create.
495e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák */
496e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšákvoid
497dcf996c31eb818a85adb0187cdb4df0b9f14d1d9Marek Olšákutil_run_tests(struct pipe_screen *screen)
498e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák{
4990fc21ecfc0891d239f20bf7724e51bc75503570cMarek Olšák   struct pipe_context *ctx = screen->context_create(screen, NULL, 0);
500dcf996c31eb818a85adb0187cdb4df0b9f14d1d9Marek Olšák
501d842d2f25190fea353b0eb104ae83062fbd2c245Marek Olšák   null_fragment_shader(ctx);
502e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák   tgsi_vs_window_space_position(ctx);
50340fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   null_sampler_view(ctx, TGSI_TEXTURE_2D);
50440fa7d44aba923308c30e96fd319b371f99f4545Marek Olšák   null_sampler_view(ctx, TGSI_TEXTURE_BUFFER);
50556e709bffb626fff6bbb7f7da81ffe23ab96b878Marek Olšák   null_constant_buffer(ctx);
506dcf996c31eb818a85adb0187cdb4df0b9f14d1d9Marek Olšák
507dcf996c31eb818a85adb0187cdb4df0b9f14d1d9Marek Olšák   ctx->destroy(ctx);
508dcf996c31eb818a85adb0187cdb4df0b9f14d1d9Marek Olšák
509dcf996c31eb818a85adb0187cdb4df0b9f14d1d9Marek Olšák   puts("Done. Exiting..");
510dcf996c31eb818a85adb0187cdb4df0b9f14d1d9Marek Olšák   exit(0);
511e6a2d3f7b621d1984f82b557175a8af9555b80acMarek Olšák}
512