Path: blob/21.2-virgl/src/gallium/tests/graw/tex-swizzle.c
4565 views
/* Test texture swizzles */12#include <stdio.h>34#include "graw_util.h"567static struct graw_info info;89static struct pipe_resource *texture = NULL;10static struct pipe_sampler_view *sv = NULL;11static void *sampler = NULL;1213static const int WIDTH = 300;14static const int HEIGHT = 300;1516struct vertex {17float position[4];18float color[4];19};2021static struct vertex vertices[] =22{23{ { 0.9, -0.9, 0.0, 1.0 },24{ 1, 0, 0, 1 } },2526{ { 0.9, 0.9, 0.0, 1.0 },27{ 1, 1, 0, 1 } },2829{ {-0.9, 0.9, 0.0, 1.0 },30{ 0, 1, 0, 1 } },3132{ {-0.9, -0.9, 0.0, 1.0 },33{ 0, 0, 0, 1 } },34};353637static void set_vertices(void)38{39struct pipe_vertex_element ve[2];40struct pipe_vertex_buffer vbuf;41void *handle;4243memset(ve, 0, sizeof ve);4445ve[0].src_offset = Offset(struct vertex, position);46ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;47ve[1].src_offset = Offset(struct vertex, color);48ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;4950handle = info.ctx->create_vertex_elements_state(info.ctx, 2, ve);51info.ctx->bind_vertex_elements_state(info.ctx, handle);5253memset(&vbuf, 0, sizeof vbuf);5455vbuf.stride = sizeof(struct vertex);56vbuf.buffer_offset = 0;57vbuf.buffer.resource = pipe_buffer_create_with_data(info.ctx,58PIPE_BIND_VERTEX_BUFFER,59PIPE_USAGE_DEFAULT,60sizeof(vertices),61vertices);6263info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, false, &vbuf);64}6566static void set_vertex_shader(void)67{68void *handle;69const char *text =70"VERT\n"71"DCL IN[0]\n"72"DCL IN[1]\n"73"DCL OUT[0], POSITION\n"74"DCL OUT[1], GENERIC[0]\n"75" 0: MOV OUT[1], IN[1]\n"76" 1: MOV OUT[0], IN[0]\n"77" 2: END\n";7879handle = graw_parse_vertex_shader(info.ctx, text);80info.ctx->bind_vs_state(info.ctx, handle);81}8283static void set_fragment_shader(void)84{85void *handle;86const char *text =87"FRAG\n"88"DCL IN[0], GENERIC[0], PERSPECTIVE\n"89"DCL OUT[0], COLOR\n"90"DCL SAMP[0]\n"91"DCL SVIEW[0], 2D, FLOAT\n"92" 0: TXP OUT[0], IN[0], SAMP[0], 2D\n"93" 2: END\n";9495handle = graw_parse_fragment_shader(info.ctx, text);96info.ctx->bind_fs_state(info.ctx, handle);97}9899100static void draw(void)101{102union pipe_color_union clear_color;103104clear_color.f[0] = 0.5;105clear_color.f[1] = 0.5;106clear_color.f[2] = 0.5;107clear_color.f[3] = 1.0;108109info.ctx->clear(info.ctx, PIPE_CLEAR_COLOR, NULL, &clear_color, 0, 0);110util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, 4);111info.ctx->flush(info.ctx, NULL, 0);112113graw_util_flush_front(&info);114}115116117118static void119init_tex(const unsigned swizzle[4])120{121#define SIZE 256122struct pipe_sampler_view sv_template;123ubyte tex2d[SIZE][SIZE][4];124int s, t;125126for (s = 0; s < SIZE; s++) {127for (t = 0; t < SIZE; t++) {128tex2d[t][s][0] = 0; /*B*/129tex2d[t][s][1] = t; /*G*/130tex2d[t][s][2] = s; /*R*/131tex2d[t][s][3] = 1; /*A*/132}133}134135texture = graw_util_create_tex2d(&info, SIZE, SIZE,136PIPE_FORMAT_B8G8R8A8_UNORM, tex2d);137138memset(&sv_template, 0, sizeof sv_template);139sv_template.format = texture->format;140sv_template.texture = texture;141sv_template.swizzle_r = swizzle[0];142sv_template.swizzle_g = swizzle[1];143sv_template.swizzle_b = swizzle[2];144sv_template.swizzle_a = swizzle[3];145sv = info.ctx->create_sampler_view(info.ctx, texture, &sv_template);146if (sv == NULL)147exit(5);148149info.ctx->set_sampler_views(info.ctx, PIPE_SHADER_FRAGMENT, 0, 1, 0, &sv);150151sampler = graw_util_create_simple_sampler(&info,152PIPE_TEX_WRAP_REPEAT,153PIPE_TEX_FILTER_NEAREST);154155info.ctx->bind_sampler_states(info.ctx, PIPE_SHADER_FRAGMENT,1560, 1, &sampler);157#undef SIZE158}159160161static void162init(const unsigned swizzle[4])163{164if (!graw_util_create_window(&info, WIDTH, HEIGHT, 1, FALSE))165exit(1);166167graw_util_default_state(&info, FALSE);168169graw_util_viewport(&info, 0, 0, WIDTH, HEIGHT, 30, 10000);170171init_tex(swizzle);172173set_vertices();174set_vertex_shader();175set_fragment_shader();176}177178179static unsigned180char_to_swizzle(char c)181{182switch (c) {183case 'r':184return PIPE_SWIZZLE_X;185case 'g':186return PIPE_SWIZZLE_Y;187case 'b':188return PIPE_SWIZZLE_Z;189case 'a':190return PIPE_SWIZZLE_W;191case '0':192return PIPE_SWIZZLE_0;193case '1':194return PIPE_SWIZZLE_1;195default:196return PIPE_SWIZZLE_X;197}198}199200201int main(int argc, char *argv[])202{203const char swizzle_names[] = "rgba01";204uint swizzle[4];205int i;206207swizzle[0] = PIPE_SWIZZLE_X;208swizzle[1] = PIPE_SWIZZLE_Y;209swizzle[2] = PIPE_SWIZZLE_Z;210swizzle[3] = PIPE_SWIZZLE_W;211212for (i = 1; i < argc; i++) {213swizzle[i-1] = char_to_swizzle(argv[i][0]);214}215216printf("Example:\n");217printf(" tex-swizzle r 0 g 1\n");218printf("Current swizzle = ");219for (i = 0; i < 4; i++) {220printf("%c", swizzle_names[swizzle[i]]);221}222printf("\n");223224init(swizzle);225226graw_set_display_func(draw);227graw_main_loop();228return 0;229}230231232