1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 VMware, Inc. All Rights Reserved. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 LunarG, Inc. All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "renderer.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vg_context.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_shader_tokens.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_draw_quad.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_simple_shaders.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_sampler.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_surface.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "cso_cache/cso_context.h" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_ureg.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef enum { 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RENDERER_STATE_INIT, 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RENDERER_STATE_COPY, 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RENDERER_STATE_DRAWTEX, 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RENDERER_STATE_SCISSOR, 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RENDERER_STATE_CLEAR, 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RENDERER_STATE_FILTER, 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RENDERER_STATE_POLYGON_STENCIL, 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RENDERER_STATE_POLYGON_FILL, 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NUM_RENDERER_STATES 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} RendererState; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef enum { 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RENDERER_VS_PLAIN, 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RENDERER_VS_COLOR, 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RENDERER_VS_TEXTURE, 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NUM_RENDERER_VS 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} RendererVs; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef enum { 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RENDERER_FS_COLOR, 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RENDERER_FS_TEXTURE, 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RENDERER_FS_SCISSOR, 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RENDERER_FS_WHITE, 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NUM_RENDERER_FS 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} RendererFs; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct renderer { 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_context *cso; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGbitfield dirty; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct { 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_rasterizer_state rasterizer; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_depth_stencil_alpha_state dsa; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state fb; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } g3d; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct matrix projection; 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct matrix mvp; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *vs_cbuf; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *fs_cbuf; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat fs_cbuf_data[32]; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint fs_cbuf_len; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_element velems[2]; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat vertices[4][2][4]; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *cached_vs[NUM_RENDERER_VS]; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *cached_fs[NUM_RENDERER_FS]; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RendererState state; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state data */ 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org union { 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct { 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint tex_width; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint tex_height; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } copy; 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct { 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint tex_width; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint tex_height; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } drawtex; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct { 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGboolean restore_dsa; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } scissor; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct { 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGboolean use_sampler; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint tex_width, tex_height; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } filter; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct { 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_depth_stencil_alpha_state dsa; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGboolean manual_two_sides; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGboolean restore_dsa; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } polygon_stencil; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } u; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return VG_TRUE if the renderer can use the resource as the asked bindings. 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic VGboolean renderer_can_support(struct renderer *renderer, 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *res, 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned bindings) 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_screen *screen = renderer->pipe->screen; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return screen->is_format_supported(screen, 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->format, res->target, 0, bindings); 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the model-view-projection matrix used by vertex shaders. 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_set_mvp(struct renderer *renderer, 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct matrix *mvp) 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct matrix *cur = &renderer->mvp; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *cbuf; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat consts[3][4]; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint i; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* projection only */ 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!mvp) 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mvp = &renderer->projection; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* re-upload only if necessary */ 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (memcmp(cur, mvp, sizeof(*mvp)) == 0) 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 3x3 matrix to 3 constant vectors (no Z) */ 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org consts[i][0] = mvp->m[i + 0]; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org consts[i][1] = mvp->m[i + 3]; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org consts[i][2] = 0.0f; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org consts[i][3] = mvp->m[i + 6]; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cbuf = renderer->vs_cbuf; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&cbuf, NULL); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cbuf = pipe_buffer_create(renderer->pipe->screen, 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_CONSTANT_BUFFER, 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_USAGE_STATIC, 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(consts)); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cbuf) { 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_write(renderer->pipe, cbuf, 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, sizeof(consts), consts); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_set_constant_buffer(renderer->pipe, 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_SHADER_VERTEX, 0, cbuf); 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(cur, mvp, sizeof(*mvp)); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->vs_cbuf = cbuf; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a simple vertex shader that passes through position and the given 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * attribute. 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *create_passthrough_vs(struct pipe_context *pipe, int semantic_name) 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_program *ureg; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src src[2], constants[3]; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst dst[2], tmp; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg = ureg_create(TGSI_PROCESSOR_VERTEX); 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ureg) 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* position is in user coordinates */ 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src[0] = ureg_DECL_vs_input(ureg, 0); 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0] = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0); 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = ureg_DECL_temporary(ureg); 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < Elements(constants); i++) 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org constants[i] = ureg_DECL_constant(ureg, i); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* transform to clipped coordinates */ 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_DP4(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_X), src[0], constants[0]); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_DP4(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Y), src[0], constants[1]); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Z), src[0]); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_DP4(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_W), src[0], constants[2]); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, dst[0], ureg_src(tmp)); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (semantic_name >= 0) { 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src[1] = ureg_DECL_vs_input(ureg, 1); 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[1] = ureg_DECL_output(ureg, semantic_name, 0); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, dst[1], src[1]); 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_END(ureg); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ureg_create_shader_and_destroy(ureg, pipe); 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set renderer vertex shader. 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function modifies vertex_shader state. 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_set_vs(struct renderer *r, RendererVs id) 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* create as needed */ 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!r->cached_vs[id]) { 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int semantic_name = -1; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (id) { 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RENDERER_VS_PLAIN: 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RENDERER_VS_COLOR: 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org semantic_name = TGSI_SEMANTIC_COLOR; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RENDERER_VS_TEXTURE: 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org semantic_name = TGSI_SEMANTIC_GENERIC; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"Unknown renderer vs id"); 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->cached_vs[id] = create_passthrough_vs(r->pipe, semantic_name); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_vertex_shader_handle(r->cso, r->cached_vs[id]); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a simple fragment shader that sets the depth to 0.0f. 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *create_scissor_fs(struct pipe_context *pipe) 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_program *ureg; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst out; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src imm; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT); 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org imm = ureg_imm4f(ureg, 0.0f, 0.0f, 0.0f, 0.0f); 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, ureg_writemask(out, TGSI_WRITEMASK_Z), imm); 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_END(ureg); 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ureg_create_shader_and_destroy(ureg, pipe); 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a simple fragment shader that sets the color to white. 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *create_white_fs(struct pipe_context *pipe) 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_program *ureg; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst out; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src imm; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT); 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org imm = ureg_imm4f(ureg, 1.0f, 1.0f, 1.0f, 1.0f); 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(ureg, out, imm); 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_END(ureg); 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ureg_create_shader_and_destroy(ureg, pipe); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set renderer fragment shader. 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function modifies fragment_shader state. 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_set_fs(struct renderer *r, RendererFs id) 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* create as needed */ 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!r->cached_fs[id]) { 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fs = NULL; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (id) { 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RENDERER_FS_COLOR: 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fs = util_make_fragment_passthrough_shader(r->pipe); 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RENDERER_FS_TEXTURE: 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fs = util_make_fragment_tex_shader(r->pipe, 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_TEXTURE_2D, TGSI_INTERPOLATE_LINEAR); 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RENDERER_FS_SCISSOR: 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fs = create_scissor_fs(r->pipe); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RENDERER_FS_WHITE: 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fs = create_white_fs(r->pipe); 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"Unknown renderer fs id"); 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->cached_fs[id] = fs; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_fragment_shader_handle(r->cso, r->cached_fs[id]); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef enum { 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEGA_Y0_TOP, 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEGA_Y0_BOTTOM 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} VegaOrientation; 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void vg_set_viewport(struct renderer *r, 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VegaOrientation orientation) 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_framebuffer_state *fb = &r->g3d.fb; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_viewport_state viewport; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat y_scale = (orientation == VEGA_Y0_BOTTOM) ? -2.f : 2.f; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org viewport.scale[0] = fb->width / 2.f; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org viewport.scale[1] = fb->height / y_scale; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org viewport.scale[2] = 1.0; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org viewport.scale[3] = 1.0; 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org viewport.translate[0] = fb->width / 2.f; 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org viewport.translate[1] = fb->height / 2.f; 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org viewport.translate[2] = 0.0; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org viewport.translate[3] = 0.0; 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_viewport(r->cso, &viewport); 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set renderer target. 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function modifies framebuffer and viewport states. 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_set_target(struct renderer *r, 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *cbuf, 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *zsbuf, 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGboolean y0_top) 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state fb; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&fb, 0, sizeof(fb)); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb.width = cbuf->width; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb.height = cbuf->height; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb.cbufs[0] = cbuf; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb.nr_cbufs = 1; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb.zsbuf = zsbuf; 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_framebuffer(r->cso, &fb); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vg_set_viewport(r, (y0_top) ? VEGA_Y0_TOP : VEGA_Y0_BOTTOM); 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set renderer blend state. Blending is disabled. 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function modifies blend state. 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_set_blend(struct renderer *r, 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGbitfield channel_mask) 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_blend_state blend; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&blend, 0, sizeof(blend)); 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE; 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO; 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (channel_mask & VG_RED) 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].colormask |= PIPE_MASK_R; 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (channel_mask & VG_GREEN) 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].colormask |= PIPE_MASK_G; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (channel_mask & VG_BLUE) 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].colormask |= PIPE_MASK_B; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (channel_mask & VG_ALPHA) 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].colormask |= PIPE_MASK_A; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_blend(r->cso, &blend); 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set renderer sampler and view states. 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function modifies samplers and fragment_sampler_views states. 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_set_samplers(struct renderer *r, 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint num_views, 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **views) 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_state sampler; 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned tex_filter = PIPE_TEX_FILTER_NEAREST; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned tex_wrap = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&sampler, 0, sizeof(sampler)); 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.min_img_filter = tex_filter; 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.mag_img_filter = tex_filter; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.wrap_s = tex_wrap; 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.wrap_t = tex_wrap; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.normalized_coords = 1; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set samplers */ 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_views; i++) 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_single_sampler(r->cso, PIPE_SHADER_FRAGMENT, i, &sampler); 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_single_sampler_done(r->cso, PIPE_SHADER_FRAGMENT); 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set views */ 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_sampler_views(r->cso, PIPE_SHADER_FRAGMENT, num_views, views); 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set custom renderer fragment shader, and optionally set samplers and views 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and upload the fragment constant buffer. 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function modifies fragment_shader, samplers and fragment_sampler_views 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * states. 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_set_custom_fs(struct renderer *renderer, 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fs, 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_sampler_state **samplers, 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **views, 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint num_samplers, 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *const_buffer, 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint const_buffer_len) 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_fragment_shader_handle(renderer->cso, fs); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set samplers and views */ 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (num_samplers) { 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_samplers(renderer->cso, PIPE_SHADER_FRAGMENT, num_samplers, samplers); 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT, num_samplers, views); 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* upload fs constant buffer */ 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (const_buffer_len) { 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *cbuf = renderer->fs_cbuf; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!cbuf || renderer->fs_cbuf_len != const_buffer_len || 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcmp(renderer->fs_cbuf_data, const_buffer, const_buffer_len)) { 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&cbuf, NULL); 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cbuf = pipe_buffer_create(renderer->pipe->screen, 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_CONSTANT_BUFFER, PIPE_USAGE_STATIC, 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const_buffer_len); 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_write(renderer->pipe, cbuf, 0, 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const_buffer_len, const_buffer); 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_set_constant_buffer(renderer->pipe, 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_SHADER_FRAGMENT, 0, cbuf); 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->fs_cbuf = cbuf; 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (const_buffer_len <= sizeof(renderer->fs_cbuf_data)) { 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(renderer->fs_cbuf_data, const_buffer, const_buffer_len); 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->fs_cbuf_len = const_buffer_len; 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->fs_cbuf_len = 0; 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Setup renderer quad position. 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_quad_pos(struct renderer *r, 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat x0, VGfloat y0, 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat x1, VGfloat y1, 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGboolean scissor) 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat z; 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* the depth test is used for scissoring */ 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z = (scissor) ? 0.0f : 1.0f; 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* positions */ 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[0][0][0] = x0; 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[0][0][1] = y0; 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[0][0][2] = z; 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[1][0][0] = x1; 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[1][0][1] = y0; 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[1][0][2] = z; 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[2][0][0] = x1; 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[2][0][1] = y1; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[2][0][2] = z; 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[3][0][0] = x0; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[3][0][1] = y1; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[3][0][2] = z; 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Setup renderer quad texture coordinates. 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_quad_texcoord(struct renderer *r, 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat x0, VGfloat y0, 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat x1, VGfloat y1, 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint tex_width, VGint tex_height) 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat s0, t0, s1, t1, r0, q0; 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint i; 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s0 = x0 / tex_width; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s1 = x1 / tex_width; 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t0 = y0 / tex_height; 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t1 = y1 / tex_height; 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r0 = 0.0f; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org q0 = 1.0f; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* texcoords */ 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[0][1][0] = s0; 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[0][1][1] = t0; 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[1][1][0] = s1; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[1][1][1] = t0; 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[2][1][0] = s1; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[2][1][1] = t1; 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[3][1][0] = s0; 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[3][1][1] = t1; 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[i][1][2] = r0; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[i][1][3] = q0; 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw renderer quad. 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_quad_draw(struct renderer *r) 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_draw_user_vertex_buffer(r->cso, r->vertices, PIPE_PRIM_TRIANGLE_FAN, 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Elements(r->vertices), /* verts */ 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Elements(r->vertices[0])); /* attribs/vert */ 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for copying. 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean renderer_copy_begin(struct renderer *renderer, 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *dst, 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGboolean y0_top, 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *src) 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_INIT); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* sanity check */ 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!renderer_can_support(renderer, 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->texture, PIPE_BIND_RENDER_TARGET) || 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !renderer_can_support(renderer, 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->texture, PIPE_BIND_SAMPLER_VIEW)) 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VG_FALSE; 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_framebuffer(renderer->cso); 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_viewport(renderer->cso); 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_blend(renderer->cso); 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_samplers(renderer->cso, PIPE_SHADER_FRAGMENT); 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT); 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_fragment_shader(renderer->cso); 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_vertex_shader(renderer->cso); 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_target(renderer, dst, NULL, y0_top); 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_blend(renderer, ~0); 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_samplers(renderer, 1, &src); 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_fs(renderer, RENDERER_FS_TEXTURE); 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_vs(renderer, RENDERER_VS_TEXTURE); 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_mvp(renderer, NULL); 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* remember the texture size */ 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.copy.tex_width = src->texture->width0; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.copy.tex_height = src->texture->height0; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->state = RENDERER_STATE_COPY; 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VG_TRUE; 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw into the destination rectangle given by (x, y, w, h). The texture is 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sampled from within the rectangle given by (sx, sy, sw, sh). 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The coordinates are in surface coordinates. 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_copy(struct renderer *renderer, 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint x, VGint y, VGint w, VGint h, 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint sx, VGint sy, VGint sw, VGint sh) 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_COPY); 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* there is no depth buffer for scissoring anyway */ 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_pos(renderer, x, y, x + w, y + h, VG_FALSE); 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_texcoord(renderer, sx, sy, sx + sw, sy + sh, 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.copy.tex_width, 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.copy.tex_height); 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_draw(renderer); 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * End copying and restore the states. 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_copy_end(struct renderer *renderer) 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_COPY); 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_framebuffer(renderer->cso); 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_viewport(renderer->cso); 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_blend(renderer->cso); 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_samplers(renderer->cso, PIPE_SHADER_FRAGMENT); 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT); 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_fragment_shader(renderer->cso); 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_vertex_shader(renderer->cso); 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->state = RENDERER_STATE_INIT; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for textured drawing. 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean renderer_drawtex_begin(struct renderer *renderer, 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *src) 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_INIT); 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!renderer_can_support(renderer, src->texture, PIPE_BIND_SAMPLER_VIEW)) 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VG_FALSE; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_blend(renderer->cso); 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_samplers(renderer->cso, PIPE_SHADER_FRAGMENT); 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT); 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_fragment_shader(renderer->cso); 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_vertex_shader(renderer->cso); 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_blend(renderer, ~0); 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_samplers(renderer, 1, &src); 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_fs(renderer, RENDERER_FS_TEXTURE); 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_vs(renderer, RENDERER_VS_TEXTURE); 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_mvp(renderer, NULL); 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* remember the texture size */ 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.drawtex.tex_width = src->texture->width0; 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.drawtex.tex_height = src->texture->height0; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->state = RENDERER_STATE_DRAWTEX; 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VG_TRUE; 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw into the destination rectangle given by (x, y, w, h). The texture is 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sampled from within the rectangle given by (sx, sy, sw, sh). 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The coordinates are in surface coordinates. 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_drawtex(struct renderer *renderer, 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint x, VGint y, VGint w, VGint h, 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint sx, VGint sy, VGint sw, VGint sh) 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_DRAWTEX); 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* with scissoring */ 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_pos(renderer, x, y, x + w, y + h, VG_TRUE); 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_texcoord(renderer, sx, sy, sx + sw, sy + sh, 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.drawtex.tex_width, 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.drawtex.tex_height); 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_draw(renderer); 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * End textured drawing and restore the states. 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_drawtex_end(struct renderer *renderer) 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_DRAWTEX); 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_blend(renderer->cso); 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_samplers(renderer->cso, PIPE_SHADER_FRAGMENT); 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT); 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_fragment_shader(renderer->cso); 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_vertex_shader(renderer->cso); 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->state = RENDERER_STATE_INIT; 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for scissor update. This will reset the depth buffer 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to 1.0f. 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean renderer_scissor_begin(struct renderer *renderer, 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGboolean restore_dsa) 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_depth_stencil_alpha_state dsa; 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_INIT); 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (restore_dsa) 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_depth_stencil_alpha(renderer->cso); 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_blend(renderer->cso); 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_fragment_shader(renderer->cso); 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* enable depth writes */ 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&dsa, 0, sizeof(dsa)); 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.depth.enabled = 1; 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.depth.writemask = 1; 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.depth.func = PIPE_FUNC_ALWAYS; 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_depth_stencil_alpha(renderer->cso, &dsa); 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* disable color writes */ 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_blend(renderer, 0); 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_fs(renderer, RENDERER_FS_SCISSOR); 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_mvp(renderer, NULL); 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.scissor.restore_dsa = restore_dsa; 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->state = RENDERER_STATE_SCISSOR; 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clear the depth buffer to 1.0f */ 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->pipe->clear(renderer->pipe, 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_CLEAR_DEPTHSTENCIL, NULL, 1.0f, 0); 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VG_TRUE; 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add a scissor rectangle. Depth values inside the rectangle will be set to 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 0.0f. 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_scissor(struct renderer *renderer, 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint x, VGint y, VGint width, VGint height) 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_SCISSOR); 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_pos(renderer, x, y, x + width, y + height, VG_FALSE); 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_draw(renderer); 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * End scissor update and restore the states. 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_scissor_end(struct renderer *renderer) 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_SCISSOR); 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (renderer->u.scissor.restore_dsa) 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_depth_stencil_alpha(renderer->cso); 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_blend(renderer->cso); 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_fragment_shader(renderer->cso); 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->state = RENDERER_STATE_INIT; 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for clearing. 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean renderer_clear_begin(struct renderer *renderer) 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_INIT); 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_blend(renderer->cso); 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_fragment_shader(renderer->cso); 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_vertex_shader(renderer->cso); 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_blend(renderer, ~0); 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_fs(renderer, RENDERER_FS_COLOR); 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_vs(renderer, RENDERER_VS_COLOR); 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_mvp(renderer, NULL); 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->state = RENDERER_STATE_CLEAR; 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VG_TRUE; 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Clear the framebuffer with the specified region and color. 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The coordinates are in surface coordinates. 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_clear(struct renderer *renderer, 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint x, VGint y, VGint width, VGint height, 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const VGfloat color[4]) 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGuint i; 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_CLEAR); 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_pos(renderer, x, y, x + width, y + height, VG_TRUE); 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(renderer->vertices[i][1], color, sizeof(VGfloat) * 4); 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_draw(renderer); 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * End clearing and retore the states. 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_clear_end(struct renderer *renderer) 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_CLEAR); 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_blend(renderer->cso); 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_fragment_shader(renderer->cso); 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_vertex_shader(renderer->cso); 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->state = RENDERER_STATE_INIT; 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for image filtering. 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean renderer_filter_begin(struct renderer *renderer, 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *dst, 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGboolean y0_top, 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGbitfield channel_mask, 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_sampler_state **samplers, 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **views, 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint num_samplers, 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fs, 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *const_buffer, 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint const_buffer_len) 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *surf, surf_tmpl; 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_INIT); 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!fs) 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VG_FALSE; 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!renderer_can_support(renderer, dst, PIPE_BIND_RENDER_TARGET)) 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VG_FALSE; 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_surface_default_template(&surf_tmpl, dst, 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_RENDER_TARGET); 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf = renderer->pipe->create_surface(renderer->pipe, dst, &surf_tmpl); 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!surf) 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VG_FALSE; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_framebuffer(renderer->cso); 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_viewport(renderer->cso); 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_blend(renderer->cso); 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set the image as the target */ 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_target(renderer, surf, NULL, y0_top); 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&surf, NULL); 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_blend(renderer, channel_mask); 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (num_samplers) { 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *tex; 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_samplers(renderer->cso, PIPE_SHADER_FRAGMENT); 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT); 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_fragment_shader(renderer->cso); 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_vertex_shader(renderer->cso); 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_custom_fs(renderer, fs, 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org samplers, views, num_samplers, 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const_buffer, const_buffer_len); 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_vs(renderer, RENDERER_VS_TEXTURE); 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex = views[0]->texture; 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.filter.tex_width = tex->width0; 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.filter.tex_height = tex->height0; 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.filter.use_sampler = VG_TRUE; 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_fragment_shader(renderer->cso); 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_custom_fs(renderer, fs, NULL, NULL, 0, 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const_buffer, const_buffer_len); 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.filter.use_sampler = VG_FALSE; 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_mvp(renderer, NULL); 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->state = RENDERER_STATE_FILTER; 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VG_TRUE; 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw into a rectangle of the destination with the specified region of the 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture(s). 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The coordinates are in surface coordinates. 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_filter(struct renderer *renderer, 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint x, VGint y, VGint w, VGint h, 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint sx, VGint sy, VGint sw, VGint sh) 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_FILTER); 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_pos(renderer, x, y, x + w, y + h, VG_FALSE); 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (renderer->u.filter.use_sampler) { 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_texcoord(renderer, sx, sy, sx + sw, sy + sh, 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.filter.tex_width, 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.filter.tex_height); 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_draw(renderer); 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * End image filtering and restore the states. 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_filter_end(struct renderer *renderer) 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_FILTER); 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (renderer->u.filter.use_sampler) { 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_samplers(renderer->cso, PIPE_SHADER_FRAGMENT); 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT); 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_vertex_shader(renderer->cso); 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_framebuffer(renderer->cso); 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_viewport(renderer->cso); 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_blend(renderer->cso); 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_fragment_shader(renderer->cso); 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->state = RENDERER_STATE_INIT; 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for polygon silhouette rendering. 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean renderer_polygon_stencil_begin(struct renderer *renderer, 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_element *velem, 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGFillRule rule, 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGboolean restore_dsa) 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_depth_stencil_alpha_state *dsa; 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGboolean manual_two_sides; 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_INIT); 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_vertex_elements(renderer->cso); 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_blend(renderer->cso); 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_depth_stencil_alpha(renderer->cso); 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_vertex_elements(renderer->cso, 1, velem); 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* disable color writes */ 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_blend(renderer, 0); 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org manual_two_sides = VG_FALSE; 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa = &renderer->u.polygon_stencil.dsa; 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(dsa, 0, sizeof(*dsa)); 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rule == VG_EVEN_ODD) { 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].enabled = 1; 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].writemask = 1; 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].fail_op = PIPE_STENCIL_OP_KEEP; 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP; 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].zpass_op = PIPE_STENCIL_OP_INVERT; 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].func = PIPE_FUNC_ALWAYS; 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].valuemask = ~0; 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(rule == VG_NON_ZERO); 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* front face */ 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].enabled = 1; 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].writemask = ~0; 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].fail_op = PIPE_STENCIL_OP_KEEP; 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP; 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].zpass_op = PIPE_STENCIL_OP_INCR_WRAP; 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].func = PIPE_FUNC_ALWAYS; 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].valuemask = ~0; 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (renderer->pipe->screen->get_param(renderer->pipe->screen, 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_CAP_TWO_SIDED_STENCIL)) { 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* back face */ 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[1] = dsa->stencil[0]; 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[1].zpass_op = PIPE_STENCIL_OP_DECR_WRAP; 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org manual_two_sides = VG_TRUE; 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_depth_stencil_alpha(renderer->cso, dsa); 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (manual_two_sides) 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_rasterizer(renderer->cso); 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.polygon_stencil.manual_two_sides = manual_two_sides; 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->u.polygon_stencil.restore_dsa = restore_dsa; 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->state = RENDERER_STATE_POLYGON_STENCIL; 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VG_TRUE; 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Render a polygon silhouette to stencil buffer. 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_polygon_stencil(struct renderer *renderer, 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer *vbuf, 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGuint mode, VGuint start, VGuint count) 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_POLYGON_STENCIL); 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_vertex_buffers(renderer->cso, 1, vbuf); 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!renderer->u.polygon_stencil.manual_two_sides) { 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_draw_arrays(renderer->cso, mode, start, count); 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_rasterizer_state raster; 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_depth_stencil_alpha_state dsa; 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org raster = renderer->g3d.rasterizer; 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa = renderer->u.polygon_stencil.dsa; 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* front */ 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org raster.cull_face = PIPE_FACE_BACK; 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_INCR_WRAP; 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_rasterizer(renderer->cso, &raster); 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_depth_stencil_alpha(renderer->cso, &dsa); 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_draw_arrays(renderer->cso, mode, start, count); 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* back */ 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org raster.cull_face = PIPE_FACE_FRONT; 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_DECR_WRAP; 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_rasterizer(renderer->cso, &raster); 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_depth_stencil_alpha(renderer->cso, &dsa); 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_draw_arrays(renderer->cso, mode, start, count); 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * End polygon silhouette rendering. 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_polygon_stencil_end(struct renderer *renderer) 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_POLYGON_STENCIL); 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (renderer->u.polygon_stencil.manual_two_sides) 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_rasterizer(renderer->cso); 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_vertex_elements(renderer->cso); 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* restore color writes */ 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_blend(renderer->cso); 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (renderer->u.polygon_stencil.restore_dsa) 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_depth_stencil_alpha(renderer->cso); 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->state = RENDERER_STATE_INIT; 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for polygon filling. 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean renderer_polygon_fill_begin(struct renderer *renderer, 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGboolean save_dsa) 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_depth_stencil_alpha_state dsa; 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_INIT); 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (save_dsa) 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_depth_stencil_alpha(renderer->cso); 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* setup stencil ops */ 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&dsa, 0, sizeof(dsa)); 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].enabled = 1; 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].func = PIPE_FUNC_NOTEQUAL; 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE; 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE; 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE; 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].valuemask = ~0; 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[0].writemask = ~0; 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.depth = renderer->g3d.dsa.depth; 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_depth_stencil_alpha(renderer->cso, &dsa); 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->state = RENDERER_STATE_POLYGON_FILL; 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VG_TRUE; 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fill a polygon. 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_polygon_fill(struct renderer *renderer, 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat min_x, VGfloat min_y, 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat max_x, VGfloat max_y) 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_POLYGON_FILL); 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_pos(renderer, min_x, min_y, max_x, max_y, VG_TRUE); 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_draw(renderer); 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * End polygon filling. 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_polygon_fill_end(struct renderer *renderer) 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_POLYGON_FILL); 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_depth_stencil_alpha(renderer->cso); 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->state = RENDERER_STATE_INIT; 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct renderer * renderer_create(struct vg_context *owner) 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct renderer *renderer; 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_rasterizer_state *raster; 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stencil_ref sr; 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint i; 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer = CALLOC_STRUCT(renderer); 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!renderer) 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->pipe = owner->pipe; 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->cso = owner->cso_context; 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* init vertex data that doesn't change */ 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->vertices[i][0][3] = 1.0f; /* w */ 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 2; i++) { 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->velems[i].src_offset = i * 4 * sizeof(float); 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->velems[i].instance_divisor = 0; 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->velems[i].vertex_buffer_index = 0; 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->velems[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_vertex_elements(renderer->cso, 2, renderer->velems); 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* GL rasterization rules */ 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org raster = &renderer->g3d.rasterizer; 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(raster, 0, sizeof(*raster)); 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org raster->gl_rasterization_rules = 1; 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org raster->depth_clip = 1; 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_rasterizer(renderer->cso, raster); 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fixed at 0 */ 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&sr, 0, sizeof(sr)); 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_stencil_ref(renderer->cso, &sr); 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_vs(renderer, RENDERER_VS_PLAIN); 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->state = RENDERER_STATE_INIT; 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return renderer; 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_destroy(struct renderer *ctx) 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < NUM_RENDERER_VS; i++) { 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->cached_vs[i]) 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_delete_vertex_shader(ctx->cso, ctx->cached_vs[i]); 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < NUM_RENDERER_FS; i++) { 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->cached_fs[i]) 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_delete_fragment_shader(ctx->cso, ctx->cached_fs[i]); 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&ctx->vs_cbuf, NULL); 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&ctx->fs_cbuf, NULL); 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(ctx); 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void update_clip_state(struct renderer *renderer, 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct vg_state *state) 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_depth_stencil_alpha_state *dsa = &renderer->g3d.dsa; 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(dsa, 0, sizeof(struct pipe_depth_stencil_alpha_state)); 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state->scissoring) { 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state *fb = &renderer->g3d.fb; 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_scissor_begin(renderer, VG_FALSE); 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < state->scissor_rects_num; ++i) { 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float x = state->scissor_rects[i * 4 + 0].f; 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float y = state->scissor_rects[i * 4 + 1].f; 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float width = state->scissor_rects[i * 4 + 2].f; 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float height = state->scissor_rects[i * 4 + 3].f; 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint x0, y0, x1, y1, iw, ih; 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x0 = (VGint) x; 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y0 = (VGint) y; 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (x0 < 0) 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x0 = 0; 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (y0 < 0) 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y0 = 0; 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* note that x1 and y1 are exclusive */ 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x1 = (VGint) ceilf(x + width); 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y1 = (VGint) ceilf(y + height); 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (x1 > fb->width) 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x1 = fb->width; 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (y1 > fb->height) 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y1 = fb->height; 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iw = x1 - x0; 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ih = y1 - y0; 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (iw > 0 && ih> 0 ) 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_scissor(renderer, x0, y0, iw, ih); 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_scissor_end(renderer); 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->depth.enabled = 1; /* glEnable(GL_DEPTH_TEST); */ 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->depth.writemask = 0;/*glDepthMask(FALSE);*/ 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->depth.func = PIPE_FUNC_GEQUAL; 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_validate_blend(struct renderer *renderer, 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct vg_state *state, 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format fb_format) 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_blend_state blend; 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&blend, 0, sizeof(blend)); 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].colormask = PIPE_MASK_RGBA; 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE; 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE; 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO; 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO; 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO alpha masking happens after blending? */ 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (state->blend_mode) { 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_SRC: 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE; 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE; 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO; 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO; 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_SRC_OVER: 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* use the blend state only when there is no alpha channel */ 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!util_format_has_alpha(fb_format)) { 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_SRC_ALPHA; 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE; 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA; 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA; 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].blend_enable = 1; 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_SRC_IN: 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE; 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_DST_ALPHA; 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO; 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO; 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].blend_enable = 1; 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_DST_IN: 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ZERO; 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ZERO; 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ONE; 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_SRC_ALPHA; 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].blend_enable = 1; 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_DST_OVER: 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_MULTIPLY: 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_SCREEN: 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_DARKEN: 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_LIGHTEN: 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VG_BLEND_ADDITIVE: 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* need a shader */ 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"not implemented blend mode"); 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_blend(renderer->cso, &blend); 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Propogate OpenVG state changes to the renderer. Only framebuffer, blending 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and scissoring states are relevant here. 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_validate(struct renderer *renderer, 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGbitfield dirty, 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct st_framebuffer *stfb, 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct vg_state *state) 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(renderer->state == RENDERER_STATE_INIT); 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty |= renderer->dirty; 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->dirty = 0; 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dirty & FRAMEBUFFER_DIRTY) { 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state *fb = &renderer->g3d.fb; 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct matrix *proj = &renderer->projection; 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(fb, 0, sizeof(struct pipe_framebuffer_state)); 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb->width = stfb->width; 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb->height = stfb->height; 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb->nr_cbufs = 1; 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb->cbufs[0] = stfb->strb->surface; 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb->zsbuf = stfb->dsrb->surface; 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_framebuffer(renderer->cso, fb); 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vg_set_viewport(renderer, VEGA_Y0_BOTTOM); 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org matrix_load_identity(proj); 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org matrix_translate(proj, -1.0f, -1.0f); 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org matrix_scale(proj, 2.0f / fb->width, 2.0f / fb->height); 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we also got a new depth buffer */ 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dirty & DEPTH_STENCIL_DIRTY) { 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->pipe->clear(renderer->pipe, 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_CLEAR_DEPTHSTENCIL, NULL, 0.0, 0); 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* must be last because it renders to the depth buffer*/ 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dirty & DEPTH_STENCIL_DIRTY) { 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_clip_state(renderer, state); 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_depth_stencil_alpha(renderer->cso, &renderer->g3d.dsa); 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dirty & BLEND_DIRTY) 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_validate_blend(renderer, state, stfb->strb->format); 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for OpenVG pipeline. 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_validate_for_shader(struct renderer *renderer, 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_sampler_state **samplers, 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **views, 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint num_samplers, 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct matrix *modelview, 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *fs, 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *const_buffer, 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint const_buffer_len) 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct matrix mvp = renderer->projection; 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* will be used in POLYGON_STENCIL and POLYGON_FILL */ 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org matrix_mult(&mvp, modelview); 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_mvp(renderer, &mvp); 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_custom_fs(renderer, fs, 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org samplers, views, num_samplers, 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const_buffer, const_buffer_len); 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_validate_for_mask_rendering(struct renderer *renderer, 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *dst, 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct matrix *modelview) 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct matrix mvp = renderer->projection; 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* will be used in POLYGON_STENCIL and POLYGON_FILL */ 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org matrix_mult(&mvp, modelview); 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_mvp(renderer, &mvp); 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_target(renderer, dst, renderer->g3d.fb.zsbuf, VG_FALSE); 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_blend(renderer, ~0); 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_fs(renderer, RENDERER_FS_WHITE); 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set internal dirty flags (hacky!) */ 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer->dirty = FRAMEBUFFER_DIRTY | BLEND_DIRTY; 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_copy_surface(struct renderer *ctx, 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *src, 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int srcX0, int srcY0, 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int srcX1, int srcY1, 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *dst, 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dstX0, int dstY0, 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dstX1, int dstY1, 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float z, unsigned filter) 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->pipe; 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_screen *screen = pipe->screen; 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view view_templ; 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *view; 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_box src_box; 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource texTemp, *tex; 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_framebuffer_state *fb = &ctx->g3d.fb; 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int srcW = abs(srcX1 - srcX0); 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int srcH = abs(srcY1 - srcY0); 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int srcLeft = MIN2(srcX0, srcX1); 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int srcTop = MIN2(srcY0, srcY1); 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(filter == PIPE_TEX_MIPFILTER_NEAREST || 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org filter == PIPE_TEX_MIPFILTER_LINEAR); 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcLeft != srcX0) { 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* left-right flip */ 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int tmp = dstX0; 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstX0 = dstX1; 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstX1 = tmp; 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcTop != srcY0) { 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* up-down flip */ 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int tmp = dstY0; 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstY0 = dstY1; 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstY1 = tmp; 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(screen->is_format_supported(screen, src->format, PIPE_TEXTURE_2D, 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, PIPE_BIND_SAMPLER_VIEW)); 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(screen->is_format_supported(screen, dst->format, PIPE_TEXTURE_2D, 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, PIPE_BIND_SAMPLER_VIEW)); 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(screen->is_format_supported(screen, dst->format, PIPE_TEXTURE_2D, 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, PIPE_BIND_RENDER_TARGET)); 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX for now we're always creating a temporary texture. 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Strictly speaking that's not always needed. 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* create temp texture */ 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&texTemp, 0, sizeof(texTemp)); 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texTemp.target = PIPE_TEXTURE_2D; 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texTemp.format = src->format; 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texTemp.last_level = 0; 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texTemp.width0 = srcW; 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texTemp.height0 = srcH; 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texTemp.depth0 = 1; 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texTemp.array_size = 1; 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texTemp.bind = PIPE_BIND_SAMPLER_VIEW; 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex = screen->resource_create(screen, &texTemp); 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tex) 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_sampler_view_default_template(&view_templ, tex, tex->format); 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view = pipe->create_sampler_view(pipe, tex, &view_templ); 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!view) 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_box_2d_zslice(srcLeft, srcTop, src->u.tex.first_layer, srcW, srcH, &src_box); 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->resource_copy_region(pipe, 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex, 0, 0, 0, 0, /* dest */ 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->texture, 0, &src_box); 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(floatsEqual(z, 0.0f)); 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* draw */ 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fb->cbufs[0] == dst) { 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* transform back to surface coordinates */ 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstY0 = dst->height - dstY0; 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstY1 = dst->height - dstY1; 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (renderer_drawtex_begin(ctx, view)) { 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_drawtex(ctx, 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0, 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, view->texture->width0, view->texture->height0); 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_drawtex_end(ctx); 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (renderer_copy_begin(ctx, dst, VG_TRUE, view)) { 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_copy(ctx, 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0, 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, view->texture->width0, view->texture->height0); 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_copy_end(ctx); 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_texture_quad(struct renderer *r, 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *tex, 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat x1offset, VGfloat y1offset, 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat x2offset, VGfloat y2offset, 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat x1, VGfloat y1, 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat x2, VGfloat y2, 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat x3, VGfloat y3, 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat x4, VGfloat y4) 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const VGfloat z = 0.0f; 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(r->state == RENDERER_STATE_INIT); 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(tex->width0 != 0); 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(tex->height0 != 0); 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_save_vertex_shader(r->cso); 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_vs(r, RENDERER_VS_TEXTURE); 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* manually set up positions */ 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[0][0][0] = x1; 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[0][0][1] = y1; 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[0][0][2] = z; 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[1][0][0] = x2; 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[1][0][1] = y2; 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[1][0][2] = z; 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[2][0][0] = x3; 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[2][0][1] = y3; 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[2][0][2] = z; 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[3][0][0] = x4; 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[3][0][1] = y4; 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->vertices[3][0][2] = z; 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* texcoords */ 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_texcoord(r, x1offset, y1offset, 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x2offset, y2offset, tex->width0, tex->height0); 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_quad_draw(r); 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_restore_vertex_shader(r->cso); 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1559