1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/********************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009-2011 VMware, Inc. All rights reserved. 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * obtaining a copy of this software and associated documentation 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * files (the "Software"), to deal in the Software without 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * restriction, including without limitation the rights to use, copy, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * modify, merge, publish, distribute, sublicense, and/or sell copies 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software, and to permit persons to whom the Software is 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * furnished to do so, subject to the following conditions: 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * included in all copies or substantial portions of the Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ********************************************************* 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Zack Rusin <zackr-at-vmware-dot-com> 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Thomas Hellstrom <thellstrom-at-vmware-dot-com> 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xa_context.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xa_priv.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "cso_cache/cso_context.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_rect.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_surface.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXA_EXPORT struct xa_context * 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_context_default(struct xa_tracker *xa) 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return xa->default_ctx; 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXA_EXPORT struct xa_context * 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_context_create(struct xa_tracker *xa) 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xa_context *ctx = calloc(1, sizeof(*ctx)); 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->xa = xa; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe = xa->screen->context_create(xa->screen, NULL); 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cso = cso_create_context(ctx->pipe); 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shaders = xa_shaders_create(ctx); 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_init_state(ctx); 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXA_EXPORT void 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_context_destroy(struct xa_context *r) 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource **vsbuf = &r->vs_const_buffer; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource **fsbuf = &r->fs_const_buffer; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*vsbuf) 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(vsbuf, NULL); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*fsbuf) 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(fsbuf, NULL); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r->shaders) { 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xa_shaders_destroy(r->shaders); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->shaders = NULL; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xa_ctx_sampler_views_destroy(r); 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r->cso) { 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_release_all(r->cso); 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_destroy_context(r->cso); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->cso = NULL; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r->pipe->destroy(r->pipe); 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXA_EXPORT int 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_surface_dma(struct xa_context *ctx, 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xa_surface *srf, 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *data, 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int pitch, 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int to_surface, struct xa_box *boxes, unsigned int num_boxes) 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *map; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int w, h, i; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_transfer_usage transfer_direction; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->pipe; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer_direction = (to_surface ? PIPE_TRANSFER_WRITE : 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_READ); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_boxes; ++i, ++boxes) { 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org w = boxes->x2 - boxes->x1; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org h = boxes->y2 - boxes->y1; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer = pipe_get_transfer(pipe, srf->tex, 0, 0, 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer_direction, boxes->x1, boxes->y1, 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org w, h); 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!transfer) 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -XA_ERR_NORES; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map = pipe_transfer_map(ctx->pipe, transfer); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!map) 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_no_map; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (to_surface) { 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_copy_rect(map, srf->tex->format, transfer->stride, 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, w, h, data, pitch, boxes->x1, boxes->y1); 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_copy_rect(data, srf->tex->format, pitch, 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boxes->x1, boxes->y1, w, h, map, transfer->stride, 0, 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0); 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_unmap(pipe, transfer); 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_destroy(pipe, transfer); 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (to_surface) 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->flush(pipe, &ctx->last_fence); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return XA_ERR_NONE; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out_no_map: 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_destroy(pipe, transfer); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -XA_ERR_NORES; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXA_EXPORT void * 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_surface_map(struct xa_context *ctx, 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xa_surface *srf, unsigned int usage) 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *map; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int transfer_direction = 0; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = ctx->pipe; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A surface may only have a single map. 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srf->transfer) 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (usage & XA_MAP_READ) 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer_direction = PIPE_TRANSFER_READ; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (usage & XA_MAP_WRITE) 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer_direction = PIPE_TRANSFER_WRITE; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!transfer_direction) 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srf->transfer = pipe_get_transfer(pipe, srf->tex, 0, 0, 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer_direction, 0, 0, 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srf->tex->width0, srf->tex->height0); 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!srf->transfer) 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map = pipe_transfer_map(pipe, srf->transfer); 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!map) 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_destroy(pipe, srf->transfer); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srf->mapping_pipe = pipe; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return map; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXA_EXPORT void 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_surface_unmap(struct xa_surface *srf) 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srf->transfer) { 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = srf->mapping_pipe; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_unmap(pipe, srf->transfer); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_destroy(pipe, srf->transfer); 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srf->transfer = NULL; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_ctx_srf_create(struct xa_context *ctx, struct xa_surface *dst) 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_screen *screen = ctx->pipe->screen; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface srf_templ; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->srf) 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -XA_ERR_INVAL; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!screen->is_format_supported(screen, dst->tex->format, 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TEXTURE_2D, 0, 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_RENDER_TARGET)) 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -XA_ERR_INVAL; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_surface_default_template(&srf_templ, dst->tex, 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_RENDER_TARGET); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->srf = ctx->pipe->create_surface(ctx->pipe, dst->tex, &srf_templ); 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->srf) 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -XA_ERR_NORES; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return XA_ERR_NONE; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_ctx_srf_destroy(struct xa_context *ctx) 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&ctx->srf, NULL); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXA_EXPORT int 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_copy_prepare(struct xa_context *ctx, 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xa_surface *dst, struct xa_surface *src) 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src == dst || ctx->srf != NULL) 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -XA_ERR_INVAL; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src->tex->format != dst->tex->format) { 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ret = xa_ctx_srf_create(ctx, dst); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret != XA_ERR_NONE) 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ret; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_copy_prepare(ctx, ctx->srf, src->tex, 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src->fdesc.xa_format, 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->fdesc.xa_format); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->simple_copy = 0; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->simple_copy = 1; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->src = src; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->dst = dst; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xa_ctx_srf_destroy(ctx); 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXA_EXPORT void 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_copy(struct xa_context *ctx, 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dx, int dy, int sx, int sy, int width, int height) 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_box src_box; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->simple_copy) { 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_box_2d(sx, sy, width, height, &src_box); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->resource_copy_region(ctx->pipe, 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->dst->tex, 0, dx, dy, 0, 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->src->tex, 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, &src_box); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_copy(ctx, dx, dy, sx, sy, width, height, 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (float) ctx->src->tex->width0, 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (float) ctx->src->tex->height0); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXA_EXPORT void 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_copy_done(struct xa_context *ctx) 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->simple_copy) { 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_draw_flush(ctx); 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->flush(ctx->pipe, &ctx->last_fence); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->flush(ctx->pipe, &ctx->last_fence); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbind_solid_blend_state(struct xa_context *ctx) 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_blend_state blend; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&blend, 0, sizeof(struct pipe_blend_state)); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].blend_enable = 0; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].colormask = PIPE_MASK_RGBA; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_blend(ctx->cso, &blend); 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXA_EXPORT int 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_solid_prepare(struct xa_context *ctx, struct xa_surface *dst, 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t fg) 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned vs_traits, fs_traits; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xa_shader shader; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int width, height; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ret; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = xa_ctx_srf_create(ctx, dst); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret != XA_ERR_NONE) 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ret; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->srf->format == PIPE_FORMAT_L8_UNORM) 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xa_pixel_to_float4_a8(fg, ctx->solid_color); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xa_pixel_to_float4(fg, ctx->solid_color); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->has_solid_color = 1; 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->dst = dst; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width = ctx->srf->width; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height = ctx->srf->height; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Color Pixel=(%d, %d, %d, %d), RGBA=(%f, %f, %f, %f)\n", 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (fg >> 24) & 0xff, (fg >> 16) & 0xff, 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (fg >> 8) & 0xff, (fg >> 0) & 0xff, 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exa->solid_color[0], exa->solid_color[1], 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exa->solid_color[2], exa->solid_color[3]); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_traits = VS_SOLID_FILL; 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fs_traits = FS_SOLID_FILL; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_bind_destination(ctx, ctx->srf, width, height); 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind_solid_blend_state(ctx); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_samplers(ctx->cso, PIPE_SHADER_FRAGMENT, 0, NULL); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_sampler_views(ctx->cso, PIPE_SHADER_FRAGMENT, 0, NULL); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader = xa_shaders_get(ctx->shaders, vs_traits, fs_traits); 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_vertex_shader_handle(ctx->cso, shader.vs); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_fragment_shader_handle(ctx->cso, shader.fs); 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_begin_solid(ctx); 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xa_ctx_srf_destroy(ctx); 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return XA_ERR_NONE; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXA_EXPORT void 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_solid(struct xa_context *ctx, int x, int y, int width, int height) 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_solid(ctx, x, y, x + width, y + height, ctx->solid_color); 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXA_EXPORT void 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_solid_done(struct xa_context *ctx) 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_draw_flush(ctx); 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->pipe->flush(ctx->pipe, &ctx->last_fence); 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->comp = NULL; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->has_solid_color = FALSE; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->num_bound_samplers = 0; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXA_EXPORT struct xa_fence * 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_fence_get(struct xa_context *ctx) 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xa_fence *fence = calloc(1, sizeof(*fence)); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_screen *screen = ctx->xa->screen; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!fence) 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fence->xa = ctx->xa; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->last_fence == NULL) 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fence->pipe_fence = NULL; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->fence_reference(screen, &fence->pipe_fence, ctx->last_fence); 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return fence; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXA_EXPORT int 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_fence_wait(struct xa_fence *fence, uint64_t timeout) 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!fence) 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return XA_ERR_NONE; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fence->pipe_fence) { 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_screen *screen = fence->xa->screen; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean timed_out; 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org timed_out = !screen->fence_finish(screen, fence->pipe_fence, timeout); 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (timed_out) 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -XA_ERR_BUSY; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->fence_reference(screen, &fence->pipe_fence, NULL); 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return XA_ERR_NONE; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXA_EXPORT void 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_fence_destroy(struct xa_fence *fence) 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!fence) 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fence->pipe_fence) { 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_screen *screen = fence->xa->screen; 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->fence_reference(screen, &fence->pipe_fence, NULL); 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(fence); 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxa_ctx_sampler_views_destroy(struct xa_context *ctx) 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->num_bound_samplers; ++i) 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&ctx->bound_sampler_views[i], NULL); 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->num_bound_samplers = 0; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 410