freedreno/a3xx/compiler: refactor trans_samp()
[mesa.git] / src / gallium / drivers / freedreno / freedreno_draw.c
index d80f35656143eeb5d0853633a23b249d8ec85838..e3c8cc8e5a0c89b79ca64a06599fcffd5b2a7dcd 100644 (file)
@@ -36,6 +36,7 @@
 #include "freedreno_context.h"
 #include "freedreno_state.h"
 #include "freedreno_resource.h"
+#include "freedreno_query_hw.h"
 #include "freedreno_util.h"
 
 
@@ -70,7 +71,7 @@ fd_draw_emit(struct fd_context *ctx, struct fd_ringbuffer *ring,
                idx_bo = fd_resource(idx->buffer)->bo;
                idx_type = size2indextype(idx->index_size);
                idx_size = idx->index_size * info->count;
-               idx_offset = idx->offset;
+               idx_offset = idx->offset + (info->start * idx->index_size);
                src_sel = DI_SRC_SEL_DMA;
        } else {
                idx_bo = NULL;
@@ -128,7 +129,12 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
                ctx->gmem_reason |= FD_GMEM_LOGICOP_ENABLED;
 
        for (i = 0; i < pfb->nr_cbufs; i++) {
-               struct pipe_resource *surf = pfb->cbufs[i]->texture;
+               struct pipe_resource *surf;
+
+               if (!pfb->cbufs[i])
+                       continue;
+
+               surf = pfb->cbufs[i]->texture;
 
                fd_resource(surf)->dirty = true;
                buffers |= FD_BUFFER_COLOR;
@@ -142,11 +148,16 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
 
        ctx->num_draws++;
 
+       ctx->stats.draw_calls++;
+       ctx->stats.prims_emitted +=
+               u_reduced_prims_for_vertices(info->mode, info->count);
+
        /* any buffers that haven't been cleared, we need to restore: */
        ctx->restore |= buffers & (FD_BUFFER_ALL & ~ctx->cleared);
        /* and any buffers used, need to be resolved: */
        ctx->resolve |= buffers;
 
+       fd_hw_query_set_stage(ctx, ctx->ring, FD_STAGE_DRAW);
        ctx->draw(ctx, info);
 }
 
@@ -179,6 +190,8 @@ fd_clear(struct pipe_context *pctx, unsigned buffers,
                util_format_short_name(pipe_surface_format(pfb->cbufs[0])),
                util_format_short_name(pipe_surface_format(pfb->zsbuf)));
 
+       fd_hw_query_set_stage(ctx, ctx->ring, FD_STAGE_CLEAR);
+
        ctx->clear(ctx, buffers, color, depth, stencil);
 
        ctx->dirty |= FD_DIRTY_ZSA |