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