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