1848b8605Smrg/* Test gallium occlusion queries. 2848b8605Smrg */ 3848b8605Smrg 4848b8605Smrg#include <stdio.h> 5848b8605Smrg 6848b8605Smrg#include "graw_util.h" 7848b8605Smrg 8848b8605Smrg 9848b8605Smrgstatic int width = 300; 10848b8605Smrgstatic int height = 300; 11848b8605Smrg 12848b8605Smrg/* expected results of occlusion test (depndsd on window size) */ 13848b8605Smrgstatic int expected1 = (int) ((300 * 0.9) * (300 * 0.9)); 14848b8605Smrgstatic int expected2 = 420; 15848b8605Smrg 16848b8605Smrg 17848b8605Smrgstatic struct graw_info info; 18848b8605Smrg 19848b8605Smrgstruct vertex { 20848b8605Smrg float position[4]; 21848b8605Smrg float color[4]; 22848b8605Smrg}; 23848b8605Smrg 24848b8605Smrg#define z0 0.2 25848b8605Smrg#define z1 0.6 26848b8605Smrg 27848b8605Smrgstatic struct vertex obj1_vertices[4] = 28848b8605Smrg{ 29848b8605Smrg { 30848b8605Smrg {-0.9, -0.9, z0, 1.0 }, 31848b8605Smrg { 1, 0, 0, 1 } 32848b8605Smrg }, 33848b8605Smrg 34848b8605Smrg { 35848b8605Smrg { 0.9, -0.9, z0, 1.0 }, 36848b8605Smrg { 1, 0, 0, 1 } 37848b8605Smrg }, 38848b8605Smrg 39848b8605Smrg { 40848b8605Smrg { 0.9, 0.9, z0, 1.0 }, 41848b8605Smrg { 1, 0, 0, 1 } 42848b8605Smrg }, 43848b8605Smrg 44848b8605Smrg { 45848b8605Smrg {-0.9, 0.9, z0, 1.0 }, 46848b8605Smrg { 1, 0, 0, 1 } 47848b8605Smrg } 48848b8605Smrg}; 49848b8605Smrg 50848b8605Smrgstatic struct vertex obj2_vertices[4] = 51848b8605Smrg{ 52848b8605Smrg { 53848b8605Smrg { -0.2, -0.2, z1, 1.0 }, 54848b8605Smrg { 0, 0, 1, 1 } 55848b8605Smrg }, 56848b8605Smrg 57848b8605Smrg { 58848b8605Smrg { 0.95, -0.2, z1, 1.0 }, 59848b8605Smrg { 0, 0, 1, 1 } 60848b8605Smrg }, 61848b8605Smrg 62848b8605Smrg { 63848b8605Smrg { 0.95, 0.2, z1, 1.0 }, 64848b8605Smrg { 0, 0, 1, 1 } 65848b8605Smrg }, 66848b8605Smrg 67848b8605Smrg { 68848b8605Smrg { -0.2, 0.2, z1, 1.0 }, 69848b8605Smrg { 0, 0, 1, 1 } 70848b8605Smrg }, 71848b8605Smrg}; 72848b8605Smrg 73848b8605Smrg#define NUM_VERTS 4 74848b8605Smrg 75848b8605Smrg 76848b8605Smrg 77848b8605Smrgstatic void 78848b8605Smrgset_vertices(struct vertex *vertices, unsigned bytes) 79848b8605Smrg{ 80848b8605Smrg struct pipe_vertex_element ve[2]; 81848b8605Smrg struct pipe_vertex_buffer vbuf; 82848b8605Smrg void *handle; 83848b8605Smrg 84848b8605Smrg memset(ve, 0, sizeof ve); 85848b8605Smrg 86848b8605Smrg ve[0].src_offset = Offset(struct vertex, position); 87848b8605Smrg ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 88848b8605Smrg ve[1].src_offset = Offset(struct vertex, color); 89848b8605Smrg ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 90848b8605Smrg 91848b8605Smrg handle = info.ctx->create_vertex_elements_state(info.ctx, 2, ve); 92848b8605Smrg info.ctx->bind_vertex_elements_state(info.ctx, handle); 93848b8605Smrg 94848b8605Smrg 95848b8605Smrg vbuf.stride = sizeof(struct vertex); 96848b8605Smrg vbuf.buffer_offset = 0; 97b8e80941Smrg vbuf.buffer.resource = pipe_buffer_create_with_data(info.ctx, 98848b8605Smrg PIPE_BIND_VERTEX_BUFFER, 99848b8605Smrg PIPE_USAGE_DEFAULT, 100848b8605Smrg bytes, 101848b8605Smrg vertices); 102848b8605Smrg 103848b8605Smrg info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf); 104848b8605Smrg} 105848b8605Smrg 106848b8605Smrg 107848b8605Smrgstatic void 108848b8605Smrgset_vertex_shader(struct graw_info *info) 109848b8605Smrg{ 110848b8605Smrg void *handle; 111848b8605Smrg const char *text = 112848b8605Smrg "VERT\n" 113848b8605Smrg "DCL IN[0]\n" 114848b8605Smrg "DCL IN[1]\n" 115848b8605Smrg "DCL OUT[0], POSITION\n" 116848b8605Smrg "DCL OUT[1], GENERIC[0]\n" 117848b8605Smrg " 0: MOV OUT[0], IN[0]\n" 118848b8605Smrg " 1: MOV OUT[1], IN[1]\n" 119848b8605Smrg " 2: END\n"; 120848b8605Smrg 121848b8605Smrg handle = graw_parse_vertex_shader(info->ctx, text); 122848b8605Smrg if (!handle) { 123848b8605Smrg debug_printf("Failed to parse vertex shader\n"); 124848b8605Smrg return; 125848b8605Smrg } 126848b8605Smrg info->ctx->bind_vs_state(info->ctx, handle); 127848b8605Smrg} 128848b8605Smrg 129848b8605Smrg 130848b8605Smrgstatic void 131848b8605Smrgset_fragment_shader(struct graw_info *info) 132848b8605Smrg{ 133848b8605Smrg void *handle; 134848b8605Smrg const char *text = 135848b8605Smrg "FRAG\n" 136848b8605Smrg "DCL IN[0], GENERIC, LINEAR\n" 137848b8605Smrg "DCL OUT[0], COLOR\n" 138848b8605Smrg " 0: MOV OUT[0], IN[0]\n" 139848b8605Smrg " 1: END\n"; 140848b8605Smrg 141848b8605Smrg handle = graw_parse_fragment_shader(info->ctx, text); 142848b8605Smrg if (!handle) { 143848b8605Smrg debug_printf("Failed to parse fragment shader\n"); 144848b8605Smrg return; 145848b8605Smrg } 146848b8605Smrg info->ctx->bind_fs_state(info->ctx, handle); 147848b8605Smrg} 148848b8605Smrg 149848b8605Smrg 150848b8605Smrgstatic void 151848b8605Smrgdraw(void) 152848b8605Smrg{ 153848b8605Smrg int expected1_min = (int) (expected1 * 0.95); 154848b8605Smrg int expected1_max = (int) (expected1 * 1.05); 155848b8605Smrg int expected2_min = (int) (expected2 * 0.95); 156848b8605Smrg int expected2_max = (int) (expected2 * 1.05); 157848b8605Smrg 158848b8605Smrg union pipe_color_union clear_color; 159848b8605Smrg 160848b8605Smrg struct pipe_query *q1, *q2; 161848b8605Smrg union pipe_query_result res1, res2; 162848b8605Smrg 163848b8605Smrg clear_color.f[0] = 0.25; 164848b8605Smrg clear_color.f[1] = 0.25; 165848b8605Smrg clear_color.f[2] = 0.25; 166848b8605Smrg clear_color.f[3] = 1.00; 167848b8605Smrg 168848b8605Smrg info.ctx->clear(info.ctx, 169848b8605Smrg PIPE_CLEAR_COLOR | PIPE_CLEAR_DEPTHSTENCIL, 170848b8605Smrg &clear_color, 1.0, 0); 171848b8605Smrg 172848b8605Smrg q1 = info.ctx->create_query(info.ctx, PIPE_QUERY_OCCLUSION_COUNTER, 0); 173848b8605Smrg q2 = info.ctx->create_query(info.ctx, PIPE_QUERY_OCCLUSION_COUNTER, 0); 174848b8605Smrg 175848b8605Smrg /* draw first, large object */ 176848b8605Smrg set_vertices(obj1_vertices, sizeof(obj1_vertices)); 177848b8605Smrg info.ctx->begin_query(info.ctx, q1); 178848b8605Smrg util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, NUM_VERTS); 179848b8605Smrg info.ctx->end_query(info.ctx, q1); 180848b8605Smrg 181848b8605Smrg /* draw second, small object behind first object */ 182848b8605Smrg set_vertices(obj2_vertices, sizeof(obj2_vertices)); 183848b8605Smrg info.ctx->begin_query(info.ctx, q2); 184848b8605Smrg util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, NUM_VERTS); 185848b8605Smrg info.ctx->end_query(info.ctx, q2); 186848b8605Smrg 187848b8605Smrg info.ctx->get_query_result(info.ctx, q1, TRUE, &res1); 188848b8605Smrg info.ctx->get_query_result(info.ctx, q2, TRUE, &res2); 189848b8605Smrg 190848b8605Smrg printf("result1 = %lu result2 = %lu\n", res1.u64, res2.u64); 191848b8605Smrg if (res1.u64 < expected1_min || res1.u64 > expected1_max) 192848b8605Smrg printf(" Failure: result1 should be near %d\n", expected1); 193848b8605Smrg if (res2.u64 < expected2_min || res2.u64 > expected2_max) 194848b8605Smrg printf(" Failure: result2 should be near %d\n", expected2); 195848b8605Smrg 196848b8605Smrg info.ctx->flush(info.ctx, NULL, 0); 197848b8605Smrg 198848b8605Smrg graw_util_flush_front(&info); 199848b8605Smrg 200848b8605Smrg info.ctx->destroy_query(info.ctx, q1); 201848b8605Smrg info.ctx->destroy_query(info.ctx, q2); 202848b8605Smrg} 203848b8605Smrg 204848b8605Smrg 205848b8605Smrg#if 0 206848b8605Smrgstatic void 207848b8605Smrgresize(int w, int h) 208848b8605Smrg{ 209848b8605Smrg width = w; 210848b8605Smrg height = h; 211848b8605Smrg 212848b8605Smrg graw_util_viewport(&info, 0, 0, width, height, 30, 1000); 213848b8605Smrg} 214848b8605Smrg#endif 215848b8605Smrg 216848b8605Smrg 217848b8605Smrgstatic void 218848b8605Smrginit(void) 219848b8605Smrg{ 220848b8605Smrg if (!graw_util_create_window(&info, width, height, 1, TRUE)) 221848b8605Smrg exit(1); 222848b8605Smrg 223848b8605Smrg graw_util_default_state(&info, TRUE); 224848b8605Smrg 225848b8605Smrg graw_util_viewport(&info, 0, 0, width, height, -1.0, 1.0); 226848b8605Smrg 227848b8605Smrg set_vertex_shader(&info); 228848b8605Smrg set_fragment_shader(&info); 229848b8605Smrg} 230848b8605Smrg 231848b8605Smrg 232848b8605Smrgint 233848b8605Smrgmain(int argc, char *argv[]) 234848b8605Smrg{ 235848b8605Smrg init(); 236848b8605Smrg 237848b8605Smrg printf("The red quad should mostly occlude the blue quad.\n"); 238848b8605Smrg 239848b8605Smrg graw_set_display_func(draw); 240848b8605Smrg /*graw_set_reshape_func(resize);*/ 241848b8605Smrg graw_main_loop(); 242848b8605Smrg return 0; 243848b8605Smrg} 244