1d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca/* Test the TGSI_SEMANTIC_FACE fragment shader input. 2d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca */ 3d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 4d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca#include <stdio.h> 5d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 6d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca#include "graw_util.h" 7d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 8d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 9d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecastatic int width = 300; 10d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecastatic int height = 300; 11d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 12d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecastatic struct graw_info info; 13d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 14d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecastruct vertex { 15d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca float position[4]; 16d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca float color[4]; 17d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca}; 18d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 19d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca#define z0 0.2 20d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca#define z01 0.5 21d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca#define z1 0.4 22d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 23d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecastatic struct vertex vertices[] = 24d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca{ 25d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca /* left quad: clock-wise, front-facing, red */ 26d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 27d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca {-0.8, -0.9, z0, 1.0 }, 28d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 0, 0, 0, 1 } 29d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca }, 30d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 31d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 32d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { -0.2, -0.9, z0, 1.0 }, 33d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 0, 0, 0, 1 } 34d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca }, 35d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 36d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 37d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 0.2, 0.9, z01, 1.0 }, 38d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 0, 0, 0, 1 } 39d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca }, 40d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 41d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 42d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca {-0.9, 0.9, z01, 1.0 }, 43d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 0, 0, 0, 1 } 44d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca }, 45d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 46d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca /* right quad : counter-clock-wise, back-facing, green */ 47d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 48d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 0.2, -0.9, z1, 1.0 }, 49d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 1, 1, 1, -1 } 50d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca }, 51d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 52d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 53d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { -0.2, 0.8, z1, 1.0 }, 54d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 1, 1, 1, -1 } 55d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca }, 56d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 57d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 58d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 0.9, 0.8, z1, 1.0 }, 59d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 1, 1, 1, -1 } 60d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca }, 61d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 62d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 63d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 0.8, -0.9, z1, 1.0 }, 64d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca { 1, 1, 1, -1 } 65d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca }, 66d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca}; 67d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 68d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca#define NUM_VERTS (sizeof(vertices) / sizeof(vertices[0])) 69d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 70d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 71d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 72d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecastatic void 73d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaset_vertices(void) 74d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca{ 75d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca struct pipe_vertex_element ve[2]; 76d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca struct pipe_vertex_buffer vbuf; 77d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca void *handle; 78d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 79d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca memset(ve, 0, sizeof ve); 80d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 81d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca ve[0].src_offset = Offset(struct vertex, position); 82d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 83d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca ve[1].src_offset = Offset(struct vertex, color); 84d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 85d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 86d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca handle = info.ctx->create_vertex_elements_state(info.ctx, 2, ve); 87d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca info.ctx->bind_vertex_elements_state(info.ctx, handle); 88d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 89d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 90d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca vbuf.stride = sizeof(struct vertex); 91d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca vbuf.buffer_offset = 0; 921a840cc5925f52079916feb2c456816a7a91d627Marek Olšák vbuf.buffer = pipe_buffer_create_with_data(info.ctx, 931a840cc5925f52079916feb2c456816a7a91d627Marek Olšák PIPE_BIND_VERTEX_BUFFER, 941a840cc5925f52079916feb2c456816a7a91d627Marek Olšák PIPE_USAGE_STATIC, 951a840cc5925f52079916feb2c456816a7a91d627Marek Olšák sizeof(vertices), 961a840cc5925f52079916feb2c456816a7a91d627Marek Olšák vertices); 97d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 98d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca info.ctx->set_vertex_buffers(info.ctx, 1, &vbuf); 99d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca} 100d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 101d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 102d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecastatic void 103d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaset_vertex_shader(void) 104d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca{ 105d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca void *handle; 106d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca const char *text = 107d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca "VERT\n" 108d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca "DCL IN[0]\n" 109d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca "DCL IN[1]\n" 110d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca "DCL OUT[0], POSITION\n" 111d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca "DCL OUT[1], GENERIC[0]\n" 112d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca " 0: MOV OUT[0], IN[0]\n" 113d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca " 1: MOV OUT[1], IN[1]\n" 114d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca " 2: END\n"; 115d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 116d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca handle = graw_parse_vertex_shader(info.ctx, text); 117d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca info.ctx->bind_vs_state(info.ctx, handle); 118d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca} 119d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 120d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 121d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecastatic void 122d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaset_fragment_shader(void) 123d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca{ 124d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca void *handle; 125d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca const char *text = 126d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca "FRAG\n" 127d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca "DCL IN[0], FACE, CONSTANT\n" 128d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca "DCL IN[1], GENERIC, CONSTANT\n" 129d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca "DCL OUT[0], COLOR\n" 130d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca "DCL TEMP[0]\n" 131d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca "IMM FLT32 { 1.0, 0.0, 0.0, 0.0 }\n" 132d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca "IMM FLT32 { 0.0, 1.0, 0.0, 0.0 }\n" 133d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca "IMM FLT32 { 0.5, 0.6, 0.0, 0.0 }\n" 134d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca " 0: SGT TEMP[0].x, IN[0].xxxx, IMM[1].xxxx\n" /* TMP[0].x = IN[0].x > 0.0 */ 135d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca " 1: IF TEMP[0].xxxx :4\n" 136d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca " 2: MOV OUT[0], IMM[0]\n" /* front-facing: red */ 137d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca " 3: ELSE :5\n" 138d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca " 4: MOV OUT[0], IMM[1]\n" /* back-facing: green */ 139d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca " 5: ENDIF\n" 140d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca " 6: END\n"; 141d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 142d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca handle = graw_parse_fragment_shader(info.ctx, text); 143d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca info.ctx->bind_fs_state(info.ctx, handle); 144d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca} 145d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 146d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 147d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecastatic void 148d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecadraw(void) 149d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca{ 150d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca union pipe_color_union clear_color; 151d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 152d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca clear_color.f[0] = 0.25; 153d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca clear_color.f[1] = 0.25; 154d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca clear_color.f[2] = 0.25; 155d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca clear_color.f[3] = 1.00; 156d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 157d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca info.ctx->clear(info.ctx, 158d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca PIPE_CLEAR_COLOR | PIPE_CLEAR_DEPTHSTENCIL, 159d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca &clear_color, 1.0, 0); 160d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, NUM_VERTS); 161d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca info.ctx->flush(info.ctx, NULL); 162d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 163d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca graw_util_flush_front(&info); 164d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca} 165d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 166d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 167d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca#if 0 168d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecastatic void 169d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaresize(int w, int h) 170d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca{ 171d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca width = w; 172d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca height = h; 173d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 174d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca set_viewport(0, 0, width, height, 30, 1000); 175d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca} 176d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca#endif 177d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 178d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 179d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecastatic void 180d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecainit(void) 181d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca{ 182d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca if (!graw_util_create_window(&info, width, height, 1, TRUE)) 183d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca exit(1); 184d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 185d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca graw_util_default_state(&info, TRUE); 186d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 187d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca graw_util_viewport(&info, 0, 0, width, height, -1.0, 1.0); 188d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 189d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca set_vertices(); 190d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca set_vertex_shader(); 191d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca set_fragment_shader(); 192d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca} 193d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 194d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 195d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaint 196d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecamain(int argc, char *argv[]) 197d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca{ 198d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca init(); 199d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 200d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca printf("Left quad: clock-wise, front-facing, red\n"); 201d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca printf("Right quad: counter clock-wise, back-facing, green\n"); 202d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 203d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca graw_set_display_func(draw); 204d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca /*graw_set_reshape_func(resize);*/ 205d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca graw_main_loop(); 206d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca return 0; 207d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca} 208