1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2011 Lauri Kasanen 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 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 THE AUTHORS 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 "pipe/p_compiler.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "postprocess/filters.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_blit.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "cso_cache/cso_context.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Initialize the post-processing queue. */ 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pp_queue_t * 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpp_init(struct pipe_screen *pscreen, const unsigned int *enabled) 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int curpos = 0, i, tmp_req = 0; 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pp_queue_t *ppq; 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_func *tmp_q; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_debug("Initializing the post-processing queue.\n"); 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* How many filters were requested? */ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < PP_FILTERS; i++) { 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (enabled[i]) 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org curpos++; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!curpos) 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq = CALLOC(1, sizeof(struct pp_queue_t)); 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_q = CALLOC(curpos, sizeof(pp_func)); 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->shaders = CALLOC(curpos, sizeof(void *)); 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->verts = CALLOC(curpos, sizeof(unsigned int)); 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tmp_q || !ppq || !ppq->shaders || !ppq->verts) 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->p = pp_init_prog(ppq, pscreen); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ppq->p) 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Add the enabled filters to the queue, in order */ 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org curpos = 0; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->pp_queue = tmp_q; 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < PP_FILTERS; i++) { 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (enabled[i]) { 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->pp_queue[curpos] = pp_filters[i].main; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_req = MAX2(tmp_req, pp_filters[i].inner_tmps); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pp_filters[i].shaders) { 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->shaders[curpos] = 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CALLOC(pp_filters[i].shaders + 1, sizeof(void *)); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->verts[curpos] = pp_filters[i].verts; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ppq->shaders[curpos]) 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_filters[i].init(ppq, curpos, enabled[i]); 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org curpos++; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->p->blitctx = util_create_blit(ppq->p->pipe, ppq->p->cso); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ppq->p->blitctx) 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->n_filters = curpos; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->n_tmp = (curpos > 2 ? 2 : 1); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->n_inner_tmp = tmp_req; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->fbos_init = false; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < curpos; i++) 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->shaders[i][0] = ppq->p->passvs; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_debug("Queue successfully allocated. %u filter(s).\n", curpos); 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ppq; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error: 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_debug("Error setting up pp\n"); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ppq) 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(ppq->p); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(ppq); 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(tmp_q); 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Free any allocated FBOs (temp buffers). Called after resizing for example. */ 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpp_free_fbos(struct pp_queue_t *ppq) 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int i; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ppq->fbos_init) 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ppq->n_tmp; i++) { 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&ppq->tmps[i], NULL); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&ppq->tmp[i], NULL); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ppq->n_inner_tmp; i++) { 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&ppq->inner_tmps[i], NULL); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&ppq->inner_tmp[i], NULL); 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&ppq->stencils, NULL); 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&ppq->stencil, NULL); 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->fbos_init = false; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Free the pp queue. Called on context termination. */ 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpp_free(struct pp_queue_t *ppq) 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int i, j; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_free_fbos(ppq); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_destroy_blit(ppq->p->blitctx); 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_sampler_views(ppq->p->cso, PIPE_SHADER_FRAGMENT, 0, NULL); 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_release_all(ppq->p->cso); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ppq->n_filters; i++) { 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < PP_MAX_PASSES && ppq->shaders[i][j]; j++) { 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j >= ppq->verts[i]) { 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->p->pipe->delete_fs_state(ppq->p->pipe, ppq->shaders[i][j]); 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->shaders[i][j] = NULL; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ppq->shaders[i][j] != ppq->p->passvs) { 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->p->pipe->delete_vs_state(ppq->p->pipe, ppq->shaders[i][j]); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->shaders[i][j] = NULL; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_destroy_context(ppq->p->cso); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->p->pipe->destroy(ppq->p->pipe); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(ppq->p); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(ppq->pp_queue); 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(ppq); 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_debug("Queue taken down.\n"); 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Internal debug function. Should be available to final users. */ 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpp_debug(const char *fmt, ...) 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va_list ap; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!debug_get_bool_option("PP_DEBUG", FALSE)) 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va_start(ap, fmt); 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _debug_vprintf(fmt, ap); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org va_end(ap); 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Allocate the temp FBOs. Called on makecurrent and resize. */ 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpp_init_fbos(struct pp_queue_t *ppq, unsigned int w, 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int h) 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct program *p = ppq->p; /* The lazy will inherit the earth */ 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int i; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource tmp_res; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ppq->fbos_init) 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_debug("Initializing FBOs, size %ux%u\n", w, h); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_debug("Requesting %u temps and %u inner temps\n", ppq->n_tmp, 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->n_inner_tmp); 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&tmp_res, 0, sizeof(tmp_res)); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_res.target = PIPE_TEXTURE_2D; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_res.format = p->surf.format = PIPE_FORMAT_B8G8R8A8_UNORM; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_res.width0 = w; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_res.height0 = h; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_res.depth0 = 1; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_res.array_size = 1; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_res.last_level = 0; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_res.bind = p->surf.usage = PIPE_BIND_RENDER_TARGET; 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!p->screen->is_format_supported(p->screen, tmp_res.format, 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_res.target, 1, tmp_res.bind)) 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_debug("Temp buffers' format fail\n"); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ppq->n_tmp; i++) { 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->tmp[i] = p->screen->resource_create(p->screen, &tmp_res); 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->tmps[i] = p->pipe->create_surface(p->pipe, ppq->tmp[i], &p->surf); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ppq->tmp[i] || !ppq->tmps[i]) 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ppq->n_inner_tmp; i++) { 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->inner_tmp[i] = p->screen->resource_create(p->screen, &tmp_res); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->inner_tmps[i] = p->pipe->create_surface(p->pipe, 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->inner_tmp[i], 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &p->surf); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ppq->inner_tmp[i] || !ppq->inner_tmps[i]) 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_res.bind = p->surf.usage = PIPE_BIND_DEPTH_STENCIL; 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_res.format = p->surf.format = PIPE_FORMAT_S8_UINT_Z24_UNORM; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!p->screen->is_format_supported(p->screen, tmp_res.format, 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_res.target, 1, tmp_res.bind)) { 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_res.format = p->surf.format = PIPE_FORMAT_Z24_UNORM_S8_UINT; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!p->screen->is_format_supported(p->screen, tmp_res.format, 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp_res.target, 1, tmp_res.bind)) 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_debug("Temp Sbuffer format fail\n"); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->stencil = p->screen->resource_create(p->screen, &tmp_res); 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->stencils = p->pipe->create_surface(p->pipe, ppq->stencil, &p->surf); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ppq->stencil || !ppq->stencils) 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->framebuffer.width = w; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->framebuffer.height = h; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->viewport.scale[0] = p->viewport.translate[0] = (float) w / 2.0; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->viewport.scale[1] = p->viewport.translate[1] = (float) h / 2.0; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->viewport.scale[3] = 1.0f; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->viewport.translate[3] = 0.0f; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppq->fbos_init = true; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error: 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_debug("Failed to allocate temp buffers!\n"); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 280