Path: blob/21.2-virgl/src/gallium/tests/graw/tex-srgb.c
4565 views
/* Test sRGB texturing.1*/23#include "graw_util.h"456static const int WIDTH = 600;7static const int HEIGHT = 300;89static struct graw_info info;1011static struct pipe_resource *texture;12static struct pipe_sampler_view *linear_sv, *srgb_sv;131415struct vertex {16float position[4];17float color[4];18};1920static struct vertex vertices1[] =21{22{ { -0.1, -0.9, 0.0, 1.0 },23{ 1, 1, 0, 1 } },2425{ { -0.1, 0.9, 0.0, 1.0 },26{ 1, 0, 0, 1 } },2728{ {-0.9, 0.9, 0.0, 1.0 },29{ 0, 0, 0, 1 } },3031{ {-0.9, -0.9, 0.0, 1.0 },32{ 0, 1, 0, 1 } },33};343536static struct vertex vertices2[] =37{38{ { 0.9, -0.9, 0.0, 1.0 },39{ 1, 1, 0, 1 } },4041{ { 0.9, 0.9, 0.0, 1.0 },42{ 1, 0, 0, 1 } },4344{ { 0.1, 0.9, 0.0, 1.0 },45{ 0, 0, 0, 1 } },4647{ { 0.1, -0.9, 0.0, 1.0 },48{ 0, 1, 0, 1 } },49};5051525354static void55set_vertices(struct vertex *verts, unsigned num_verts)56{57struct pipe_vertex_element ve[2];58struct pipe_vertex_buffer vbuf;59void *handle;6061memset(ve, 0, sizeof ve);6263ve[0].src_offset = Offset(struct vertex, position);64ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;65ve[1].src_offset = Offset(struct vertex, color);66ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;6768handle = info.ctx->create_vertex_elements_state(info.ctx, 2, ve);69info.ctx->bind_vertex_elements_state(info.ctx, handle);7071memset(&vbuf, 0, sizeof vbuf);7273vbuf.stride = sizeof(struct vertex);74vbuf.buffer_offset = 0;75vbuf.buffer.resource = pipe_buffer_create_with_data(info.ctx,76PIPE_BIND_VERTEX_BUFFER,77PIPE_USAGE_DEFAULT,78num_verts * sizeof(struct vertex),79verts);8081info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, false, &vbuf);82}8384static void set_vertex_shader( void )85{86void *handle;87const char *text =88"VERT\n"89"DCL IN[0]\n"90"DCL IN[1]\n"91"DCL OUT[0], POSITION\n"92"DCL OUT[1], GENERIC[0]\n"93" 0: MOV OUT[1], IN[1]\n"94" 1: MOV OUT[0], IN[0]\n"95" 2: END\n";9697handle = graw_parse_vertex_shader(info.ctx, text);98info.ctx->bind_vs_state(info.ctx, handle);99}100101static void set_fragment_shader( void )102{103void *handle;104const char *text =105"FRAG\n"106"DCL IN[0], GENERIC[0], PERSPECTIVE\n"107"DCL OUT[0], COLOR\n"108"DCL TEMP[0]\n"109"DCL SAMP[0]\n"110"DCL SVIEW[0], 2D, FLOAT\n"111" 0: TXP TEMP[0], IN[0], SAMP[0], 2D\n"112" 1: MOV OUT[0], TEMP[0]\n"113" 2: END\n";114115handle = graw_parse_fragment_shader(info.ctx, text);116info.ctx->bind_fs_state(info.ctx, handle);117}118119120static void draw( void )121{122union pipe_color_union clear_color;123124clear_color.f[0] = 0.5;125clear_color.f[1] = 0.5;126clear_color.f[2] = 0.5;127clear_color.f[3] = 1.0;128129info.ctx->clear(info.ctx, PIPE_CLEAR_COLOR, NULL, &clear_color, 0, 0);130131info.ctx->set_sampler_views(info.ctx, PIPE_SHADER_FRAGMENT, 0, 1, 0, &linear_sv);132set_vertices(vertices1, 4);133util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, 4);134135info.ctx->set_sampler_views(info.ctx, PIPE_SHADER_FRAGMENT, 0, 1, 0, &srgb_sv);136set_vertices(vertices2, 4);137util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, 4);138139info.ctx->flush(info.ctx, NULL, 0);140141graw_util_flush_front(&info);142}143144145static void init_tex( void )146{147#define SIZE 64148ubyte tex2d[SIZE][SIZE][4];149int s, t;150151for (s = 0; s < SIZE; s++) {152for (t = 0; t < SIZE; t++) {153tex2d[t][s][0] = 0;154tex2d[t][s][1] = s * 255 / SIZE;155tex2d[t][s][2] = t * 255 / SIZE;156tex2d[t][s][3] = 255;157}158}159160texture = graw_util_create_tex2d(&info, SIZE, SIZE,161PIPE_FORMAT_B8G8R8A8_UNORM, tex2d);162163{164void *sampler;165sampler = graw_util_create_simple_sampler(&info,166PIPE_TEX_WRAP_REPEAT,167PIPE_TEX_FILTER_NEAREST);168info.ctx->bind_sampler_states(info.ctx, PIPE_SHADER_FRAGMENT,1690, 1, &sampler);170}171172/* linear sampler view */173{174struct pipe_sampler_view sv_temp;175memset(&sv_temp, 0, sizeof sv_temp);176sv_temp.format = PIPE_FORMAT_B8G8R8A8_UNORM;177sv_temp.texture = texture;178sv_temp.swizzle_r = PIPE_SWIZZLE_X;179sv_temp.swizzle_g = PIPE_SWIZZLE_Y;180sv_temp.swizzle_b = PIPE_SWIZZLE_Z;181sv_temp.swizzle_a = PIPE_SWIZZLE_W;182linear_sv = info.ctx->create_sampler_view(info.ctx, texture, &sv_temp);183if (linear_sv == NULL)184exit(0);185}186187/* srgb sampler view */188{189struct pipe_sampler_view sv_temp;190memset(&sv_temp, 0, sizeof sv_temp);191sv_temp.format = PIPE_FORMAT_B8G8R8A8_SRGB;192sv_temp.texture = texture;193sv_temp.swizzle_r = PIPE_SWIZZLE_X;194sv_temp.swizzle_g = PIPE_SWIZZLE_Y;195sv_temp.swizzle_b = PIPE_SWIZZLE_Z;196sv_temp.swizzle_a = PIPE_SWIZZLE_W;197srgb_sv = info.ctx->create_sampler_view(info.ctx, texture, &sv_temp);198if (srgb_sv == NULL)199exit(0);200}201#undef SIZE202}203204static void init( void )205{206if (!graw_util_create_window(&info, WIDTH, HEIGHT, 1, FALSE))207exit(1);208209graw_util_default_state(&info, FALSE);210211graw_util_viewport(&info, 0, 0, WIDTH, HEIGHT, 30, 10000);212213init_tex();214215set_vertex_shader();216set_fragment_shader();217}218219220int main( int argc, char *argv[] )221{222init();223224graw_set_display_func( draw );225graw_main_loop();226return 0;227}228229230