1c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors/* 2c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * Copyright (c) 2012-2015 Etnaviv Project 3c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * 4c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * Permission is hereby granted, free of charge, to any person obtaining a 5c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * copy of this software and associated documentation files (the "Software"), 6c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * to deal in the Software without restriction, including without limitation 7c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * the rights to use, copy, modify, merge, publish, distribute, sub license, 8c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * and/or sell copies of the Software, and to permit persons to whom the 9c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * Software is furnished to do so, subject to the following conditions: 10c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * 11c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * The above copyright notice and this permission notice (including the 12c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * next paragraph) shall be included in all copies or substantial portions 13c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * of the Software. 14c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * 15c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * DEALINGS IN THE SOFTWARE. 22c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * 23c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * Authors: 24c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * Wladimir J. van der Laan <laanwj@gmail.com> 25c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * Christian Gmeiner <christian.gmeiner@gmail.com> 26c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors */ 27c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 28c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_context.h" 29c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 30c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_blend.h" 31c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_clear_blit.h" 32c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_compiler.h" 33c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_debug.h" 34c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_emit.h" 35c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_fence.h" 36c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_query.h" 37c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_rasterizer.h" 38c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_screen.h" 39c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_shader.h" 40c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_state.h" 41c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_surface.h" 42c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_texture.h" 43c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_transfer.h" 44c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_translate.h" 45c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_zsa.h" 46c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 47c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "pipe/p_context.h" 48c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "pipe/p_state.h" 49c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "util/u_blitter.h" 50c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "util/u_memory.h" 51c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "util/u_prim.h" 52c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 53c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "hw/common.xml.h" 54c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 55c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void 56c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsetna_context_destroy(struct pipe_context *pctx) 57c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{ 58c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors struct etna_context *ctx = etna_context(pctx); 59c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 60c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (ctx->primconvert) 61c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors util_primconvert_destroy(ctx->primconvert); 62c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 63c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (ctx->blitter) 64c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors util_blitter_destroy(ctx->blitter); 65c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 66c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (ctx->stream) 67c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_cmd_stream_del(ctx->stream); 68c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 69c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors slab_destroy_child(&ctx->transfer_pool); 70c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 71c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors FREE(pctx); 72c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors} 73c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 74c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors/* Update render state where needed based on draw operation */ 75c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void 76c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsetna_update_state_for_draw(struct etna_context *ctx, const struct pipe_draw_info *info) 77c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{ 78c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* Handle primitive restart: 79c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * - If not an indexed draw, we don't care about the state of the primitive restart bit. 80c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * - Otherwise, set the bit in INDEX_STREAM_CONTROL in the index buffer state 81c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * accordingly 82c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * - If the value of the INDEX_STREAM_CONTROL register changed due to this, or 83c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * primitive restart is enabled and the restart index changed, mark the index 84c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * buffer state as dirty 85c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors */ 86c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 87c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (info->indexed) { 88c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors uint32_t new_control = ctx->index_buffer.FE_INDEX_STREAM_CONTROL; 89c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 90c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (info->primitive_restart) 91c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors new_control |= VIVS_FE_INDEX_STREAM_CONTROL_PRIMITIVE_RESTART; 92c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors else 93c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors new_control &= ~VIVS_FE_INDEX_STREAM_CONTROL_PRIMITIVE_RESTART; 94c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 95c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (ctx->index_buffer.FE_INDEX_STREAM_CONTROL != new_control || 96c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors (info->primitive_restart && ctx->index_buffer.FE_PRIMITIVE_RESTART_INDEX != info->restart_index)) { 97c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors ctx->index_buffer.FE_INDEX_STREAM_CONTROL = new_control; 98c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors ctx->index_buffer.FE_PRIMITIVE_RESTART_INDEX = info->restart_index; 99c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors ctx->dirty |= ETNA_DIRTY_INDEX_BUFFER; 100c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors } 101c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors } 102c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors} 103c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 104c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 105c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void 106c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsetna_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) 107c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{ 108c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors struct etna_context *ctx = etna_context(pctx); 109c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors struct pipe_framebuffer_state *pfb = &ctx->framebuffer_s; 110c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors uint32_t draw_mode; 111c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors unsigned i; 112c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 113c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (ctx->vertex_elements == NULL || ctx->vertex_elements->num_elements == 0) 114c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors return; /* Nothing to do */ 115c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 116c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (!(ctx->prim_hwsupport & (1 << info->mode))) { 117c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors struct primconvert_context *primconvert = ctx->primconvert; 118c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors util_primconvert_save_index_buffer(primconvert, &ctx->index_buffer.ib); 119c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors util_primconvert_save_rasterizer_state(primconvert, ctx->rasterizer); 120c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors util_primconvert_draw_vbo(primconvert, info); 121c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors return; 122c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors } 123c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 124c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors int prims = u_decomposed_prims_for_vertices(info->mode, info->count); 125c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (unlikely(prims <= 0)) { 126c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors DBG("Invalid draw primitive mode=%i or no primitives to be drawn", info->mode); 127c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors return; 128c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors } 129c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 130c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors draw_mode = translate_draw_mode(info->mode); 131c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (draw_mode == ETNA_NO_MATCH) { 132c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors BUG("Unsupported draw mode"); 133c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors return; 134c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors } 135c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 136c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (info->indexed && !ctx->index_buffer.FE_INDEX_STREAM_BASE_ADDR.bo) { 137c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors BUG("Unsupported or no index buffer"); 138c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors return; 139c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors } 140c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 141c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* Update any derived state */ 142c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (!etna_state_update(ctx)) 143c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors return; 144c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 145c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* 146c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * Figure out the buffers/features we need: 147c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors */ 148c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (etna_depth_enabled(ctx)) 149c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors resource_written(ctx, pfb->zsbuf->texture); 150c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 151c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (etna_stencil_enabled(ctx)) 152c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors resource_written(ctx, pfb->zsbuf->texture); 153c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 154c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors for (i = 0; i < pfb->nr_cbufs; i++) { 155c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors struct pipe_resource *surf; 156c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 157c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (!pfb->cbufs[i]) 158c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors continue; 159c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 160c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors surf = pfb->cbufs[i]->texture; 161c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors resource_written(ctx, surf); 162c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors } 163c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 164c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* Mark constant buffers as being read */ 165c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors resource_read(ctx, ctx->constant_buffer[PIPE_SHADER_VERTEX].buffer); 166c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors resource_read(ctx, ctx->constant_buffer[PIPE_SHADER_FRAGMENT].buffer); 167c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 168c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* Mark VBOs as being read */ 169c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors for (i = 0; i < ctx->vertex_buffer.count; i++) { 170c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors assert(!ctx->vertex_buffer.vb[i].user_buffer); 171c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors resource_read(ctx, ctx->vertex_buffer.vb[i].buffer); 172c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors } 173c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 174c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* Mark index buffer as being read */ 175c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors resource_read(ctx, ctx->index_buffer.ib.buffer); 176c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 177c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* Mark textures as being read */ 178c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors for (i = 0; i < PIPE_MAX_SAMPLERS; i++) 179c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (ctx->sampler_view[i]) 180c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors resource_read(ctx, ctx->sampler_view[i]->texture); 181c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 182c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors ctx->stats.prims_emitted += u_reduced_prims_for_vertices(info->mode, info->count); 183c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors ctx->stats.draw_calls++; 184c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 185c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* Update state for this draw operation */ 186c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_update_state_for_draw(ctx, info); 187c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 188c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* First, sync state, then emit DRAW_PRIMITIVES or DRAW_INDEXED_PRIMITIVES */ 189c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_emit_state(ctx); 190c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 191c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (info->indexed) 192c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_draw_indexed_primitives(ctx->stream, draw_mode, info->start, prims, info->index_bias); 193c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors else 194c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_draw_primitives(ctx->stream, draw_mode, info->start, prims); 195c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 196c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (DBG_ENABLED(ETNA_DBG_DRAW_STALL)) { 197c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* Stall the FE after every draw operation. This allows better 198c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * debug of GPU hang conditions, as the FE will indicate which 199c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * draw op has caused the hang. */ 200c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_stall(ctx->stream, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); 201c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors } 202c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 203c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (DBG_ENABLED(ETNA_DBG_FLUSH_ALL)) 204c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors pctx->flush(pctx, NULL, 0); 205c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 206c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (ctx->framebuffer.cbuf) 207c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_resource(ctx->framebuffer.cbuf->texture)->seqno++; 208c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (ctx->framebuffer.zsbuf) 209c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_resource(ctx->framebuffer.zsbuf->texture)->seqno++; 210c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors} 211c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 212c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void 213c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsetna_flush(struct pipe_context *pctx, struct pipe_fence_handle **fence, 214c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors enum pipe_flush_flags flags) 215c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{ 216c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors struct etna_context *ctx = etna_context(pctx); 217c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 218c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_cmd_stream_flush(ctx->stream); 219c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 220c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (fence) 221c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors *fence = etna_fence_create(pctx); 222c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors} 223c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 224c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void 225c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsetna_cmd_stream_reset_notify(struct etna_cmd_stream *stream, void *priv) 226c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{ 227c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors struct etna_context *ctx = priv; 228c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors struct etna_resource *rsc, *rsc_tmp; 229c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 230c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_set_state(stream, VIVS_GL_API_MODE, VIVS_GL_API_MODE_OPENGL); 231c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_set_state(stream, VIVS_GL_VERTEX_ELEMENT_CONFIG, 0x00000001); 232c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_set_state(stream, VIVS_RA_EARLY_DEPTH, 0x00000031); 233c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_set_state(stream, VIVS_PA_W_CLIP_LIMIT, 0x34000001); 234c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 235c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors ctx->dirty = ~0L; 236c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 237c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* go through all the used resources and clear their status flag */ 238c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors LIST_FOR_EACH_ENTRY_SAFE(rsc, rsc_tmp, &ctx->used_resources, list) 239c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors { 240c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors debug_assert(rsc->status != 0); 241c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors rsc->status = 0; 242c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors rsc->pending_ctx = NULL; 243c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors list_delinit(&rsc->list); 244c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors } 245c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 246c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors assert(LIST_IS_EMPTY(&ctx->used_resources)); 247c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors} 248c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 249c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstruct pipe_context * 250c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsetna_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) 251c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{ 252c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors struct etna_context *ctx = CALLOC_STRUCT(etna_context); 253c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors struct etna_screen *screen; 2546e3da9c81c2112e72829ed45ac34c0916de71a47Christian Gmeiner struct pipe_context *pctx; 255c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 256c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (ctx == NULL) 257c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors return NULL; 258c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 2596e3da9c81c2112e72829ed45ac34c0916de71a47Christian Gmeiner pctx = &ctx->base; 2606e3da9c81c2112e72829ed45ac34c0916de71a47Christian Gmeiner pctx->priv = ctx; 2616e3da9c81c2112e72829ed45ac34c0916de71a47Christian Gmeiner pctx->screen = pscreen; 2626e3da9c81c2112e72829ed45ac34c0916de71a47Christian Gmeiner 263c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors screen = etna_screen(pscreen); 264c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors ctx->stream = etna_cmd_stream_new(screen->pipe, 0x2000, &etna_cmd_stream_reset_notify, ctx); 265c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (ctx->stream == NULL) 266c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors goto fail; 267c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 268c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* context ctxate setup */ 269c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors ctx->specs = screen->specs; 270c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors ctx->screen = screen; 271c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* need some sane default in case state tracker doesn't set some state: */ 272c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors ctx->sample_mask = 0xffff; 273c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 274c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors list_inithead(&ctx->used_resources); 275c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 276c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* Set sensible defaults for state */ 277c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_cmd_stream_reset_notify(ctx->stream, ctx); 278c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 279c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors pctx->destroy = etna_context_destroy; 280c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors pctx->draw_vbo = etna_draw_vbo; 281c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors pctx->flush = etna_flush; 282c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 283c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* creation of compile states */ 284c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors pctx->create_blend_state = etna_blend_state_create; 285c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors pctx->create_rasterizer_state = etna_rasterizer_state_create; 286c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors pctx->create_depth_stencil_alpha_state = etna_zsa_state_create; 287c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 288c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_clear_blit_init(pctx); 289c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_query_context_init(pctx); 290c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_state_init(pctx); 291c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_surface_init(pctx); 292c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_shader_init(pctx); 293c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_texture_init(pctx); 294c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors etna_transfer_init(pctx); 295c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 296c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors ctx->blitter = util_blitter_create(pctx); 297c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (!ctx->blitter) 298c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors goto fail; 299c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 300c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors /* Generate the bitmask of supported draw primitives. */ 301c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors ctx->prim_hwsupport = 1 << PIPE_PRIM_POINTS | 302c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 1 << PIPE_PRIM_LINES | 303c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 1 << PIPE_PRIM_LINE_STRIP | 304c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 1 << PIPE_PRIM_TRIANGLES | 305c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 1 << PIPE_PRIM_TRIANGLE_STRIP | 306c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 1 << PIPE_PRIM_TRIANGLE_FAN; 307c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 308c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (VIV_FEATURE(ctx->screen, chipMinorFeatures2, LINE_LOOP)) 309c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors ctx->prim_hwsupport |= 1 << PIPE_PRIM_LINE_LOOP; 310c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 311c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors ctx->primconvert = util_primconvert_create(pctx, ctx->prim_hwsupport); 312c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors if (!ctx->primconvert) 313c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors goto fail; 314c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 315c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors slab_create_child(&ctx->transfer_pool, &screen->transfer_pool); 316c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 317c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors return pctx; 318c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 319c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsfail: 320c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors pctx->destroy(pctx); 321c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors 322c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors return NULL; 323c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors} 324