1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright © 2010 Jakob Bornecrantz 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define USE_TRACE 0 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define WIDTH 300 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HEIGHT 300 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NEAR 30 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FAR 1000 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FLIP 0 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* pipe_*_state structs */ 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* pipe_context */ 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* pipe_screen */ 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* PIPE_* */ 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* TGSI_SEMANTIC_{POSITION|GENERIC} */ 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_shader_tokens.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* pipe_buffer_* helpers */ 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* constant state object helper */ 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "cso_cache/cso_context.h" 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* u_sampler_view_default_template */ 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_sampler.h" 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* debug_dump_surface_bmp */ 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h" 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* util_draw_vertex_buffer helper */ 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_draw_quad.h" 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* FREE & CALLOC_STRUCT */ 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* util_make_[fragment|vertex]_passthrough_shader */ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_simple_shaders.h" 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* to get a hardware pipe driver */ 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe-loader/pipe_loader.h" 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct program 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_loader_device *dev; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_screen *screen; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_context *cso; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_blend_state blend; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_depth_stencil_alpha_state depthstencil; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_rasterizer_state rasterizer; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_state sampler; 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_viewport_state viewport; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state framebuffer; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_element velem[2]; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *vs; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fs; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org union pipe_color_union clear_color; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *vbuf; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *target; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *tex; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *view; 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void init_prog(struct program *p) 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface surf_tmpl; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ret; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* find a hardware device */ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = pipe_loader_probe(&p->dev, 1); 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ret); 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* init a pipe screen */ 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->screen = pipe_loader_create_screen(p->dev, PIPE_SEARCH_DIR); 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(p->screen); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* create the pipe driver context and cso context */ 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->pipe = p->screen->context_create(p->screen, NULL); 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->cso = cso_create_context(p->pipe); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set clear color */ 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->clear_color.f[0] = 0.3; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->clear_color.f[1] = 0.1; 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->clear_color.f[2] = 0.3; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->clear_color.f[3] = 1.0; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* vertex buffer */ 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float vertices[4][2][4] = { 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 0.9f, 0.9f, 0.0f, 1.0f }, 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1.0f, 1.0f, 0.0f, 1.0f } 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { -0.9f, 0.9f, 0.0f, 1.0f }, 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 0.0f, 1.0f, 0.0f, 1.0f } 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { -0.9f, -0.9f, 0.0f, 1.0f }, 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 0.0f, 0.0f, 1.0f, 1.0f } 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 0.9f, -0.9f, 0.0f, 1.0f }, 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1.0f, 0.0f, 1.0f, 1.0f } 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->vbuf = pipe_buffer_create(p->screen, PIPE_BIND_VERTEX_BUFFER, 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_USAGE_STATIC, sizeof(vertices)); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_write(p->pipe, p->vbuf, 0, sizeof(vertices), vertices); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* render target texture */ 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource tmplt; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&tmplt, 0, sizeof(tmplt)); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmplt.target = PIPE_TEXTURE_2D; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmplt.format = PIPE_FORMAT_B8G8R8A8_UNORM; /* All drivers support this */ 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmplt.width0 = WIDTH; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmplt.height0 = HEIGHT; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmplt.depth0 = 1; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmplt.array_size = 1; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmplt.last_level = 0; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmplt.bind = PIPE_BIND_RENDER_TARGET; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->target = p->screen->resource_create(p->screen, &tmplt); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* sampler texture */ 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *ptr; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *t; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource t_tmplt; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view v_tmplt; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_box box; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&t_tmplt, 0, sizeof(t_tmplt)); 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t_tmplt.target = PIPE_TEXTURE_2D; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t_tmplt.format = PIPE_FORMAT_B8G8R8A8_UNORM; /* All drivers support this */ 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t_tmplt.width0 = 2; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t_tmplt.height0 = 2; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t_tmplt.depth0 = 1; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t_tmplt.array_size = 1; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t_tmplt.last_level = 0; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t_tmplt.bind = PIPE_BIND_RENDER_TARGET; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->tex = p->screen->resource_create(p->screen, &t_tmplt); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&box, 0, sizeof(box)); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.width = 2; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.height = 2; 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t = p->pipe->get_transfer(p->pipe, p->tex, 0, PIPE_TRANSFER_WRITE, &box); 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptr = p->pipe->transfer_map(p->pipe, t); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptr[0] = 0xffff0000; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptr[1] = 0xff0000ff; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptr[2] = 0xff00ff00; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptr[3] = 0xffffff00; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->pipe->transfer_unmap(p->pipe, t); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->pipe->transfer_destroy(p->pipe, t); 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_sampler_view_default_template(&v_tmplt, p->tex, p->tex->format); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->view = p->pipe->create_sampler_view(p->pipe, p->tex, &v_tmplt); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* disabled blending/masking */ 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&p->blend, 0, sizeof(p->blend)); 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->blend.rt[0].colormask = PIPE_MASK_RGBA; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no-op depth/stencil/alpha */ 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&p->depthstencil, 0, sizeof(p->depthstencil)); 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* rasterizer */ 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&p->rasterizer, 0, sizeof(p->rasterizer)); 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->rasterizer.cull_face = PIPE_FACE_NONE; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->rasterizer.gl_rasterization_rules = 1; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->rasterizer.depth_clip = 1; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* sampler */ 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&p->sampler, 0, sizeof(p->sampler)); 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->sampler.min_img_filter = PIPE_TEX_MIPFILTER_LINEAR; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->sampler.mag_img_filter = PIPE_TEX_MIPFILTER_LINEAR; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->sampler.normalized_coords = 1; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_tmpl.format = PIPE_FORMAT_B8G8R8A8_UNORM; /* All drivers support this */ 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_tmpl.usage = PIPE_BIND_RENDER_TARGET; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_tmpl.u.tex.level = 0; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_tmpl.u.tex.first_layer = 0; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_tmpl.u.tex.last_layer = 0; 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* drawing destination */ 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&p->framebuffer, 0, sizeof(p->framebuffer)); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->framebuffer.width = WIDTH; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->framebuffer.height = HEIGHT; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->framebuffer.nr_cbufs = 1; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->framebuffer.cbufs[0] = p->pipe->create_surface(p->pipe, p->target, &surf_tmpl); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* viewport, depth isn't really needed */ 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float x = 0; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float y = 0; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float z = FAR; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float half_width = (float)WIDTH / 2.0f; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float half_height = (float)HEIGHT / 2.0f; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float half_depth = ((float)FAR - (float)NEAR) / 2.0f; 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float scale, bias; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (FLIP) { 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org scale = -1.0f; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bias = (float)HEIGHT; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org scale = 1.0f; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bias = 0.0f; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->viewport.scale[0] = half_width; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->viewport.scale[1] = half_height * scale; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->viewport.scale[2] = half_depth; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->viewport.scale[3] = 1.0f; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->viewport.translate[0] = half_width + x; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->viewport.translate[1] = (half_height + y) * scale + bias; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->viewport.translate[2] = half_depth + z; 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->viewport.translate[3] = 0.0f; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* vertex elements state */ 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(p->velem, 0, sizeof(p->velem)); 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->velem[0].src_offset = 0 * 4 * sizeof(float); /* offset 0, first element */ 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->velem[0].instance_divisor = 0; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->velem[0].vertex_buffer_index = 0; 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->velem[1].src_offset = 1 * 4 * sizeof(float); /* offset 16, second element */ 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->velem[1].instance_divisor = 0; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->velem[1].vertex_buffer_index = 0; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->velem[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* vertex shader */ 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_SEMANTIC_GENERIC }; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint semantic_indexes[] = { 0, 0 }; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->vs = util_make_vertex_passthrough_shader(p->pipe, 2, semantic_names, semantic_indexes); 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fragment shader */ 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->fs = util_make_fragment_tex_shader(p->pipe, TGSI_TEXTURE_2D, TGSI_INTERPOLATE_LINEAR); 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void close_prog(struct program *p) 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* unset bound textures as well */ 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_sampler_views(p->cso, PIPE_SHADER_FRAGMENT, 0, NULL); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* unset all state */ 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_release_all(p->cso); 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->pipe->delete_vs_state(p->pipe, p->vs); 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->pipe->delete_fs_state(p->pipe, p->fs); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&p->framebuffer.cbufs[0], NULL); 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&p->view, NULL); 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&p->target, NULL); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&p->tex, NULL); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&p->vbuf, NULL); 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_destroy_context(p->cso); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->pipe->destroy(p->pipe); 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->screen->destroy(p->screen); 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_loader_release(&p->dev, 1); 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(p); 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void draw(struct program *p) 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set the render target */ 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_framebuffer(p->cso, &p->framebuffer); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clear the render target */ 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->pipe->clear(p->pipe, PIPE_CLEAR_COLOR, &p->clear_color, 0, 0); 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set misc state we care about */ 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_blend(p->cso, &p->blend); 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_depth_stencil_alpha(p->cso, &p->depthstencil); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_rasterizer(p->cso, &p->rasterizer); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_viewport(p->cso, &p->viewport); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* sampler */ 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_single_sampler(p->cso, 0, &p->sampler); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_single_sampler_done(p->cso); 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* texture sampler view */ 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_sampler_views(p->cso, PIPE_SHADER_FRAGMENT, 1, &p->view); 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* shaders */ 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_fragment_shader_handle(p->cso, p->fs); 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_vertex_shader_handle(p->cso, p->vs); 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* vertex element data */ 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_vertex_elements(p->cso, 2, p->velem); 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_draw_vertex_buffer(p->pipe, p->cso, 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->vbuf, 0, 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_PRIM_QUADS, 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4, /* verts */ 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2); /* attribs/vert */ 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->pipe->flush(p->pipe, NULL); 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_dump_surface_bmp(p->pipe, "result.bmp", p->framebuffer.cbufs[0]); 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint main(int argc, char** argv) 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct program *p = CALLOC_STRUCT(program); 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_prog(p); 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw(p); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org close_prog(p); 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 356