mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 18:18:06 +02:00
freedreno/a3xx: occlusion query support
Signed-off-by: Rob Clark <robclark@freedesktop.org>
This commit is contained in:
parent
b8f78e1890
commit
f999c13176
5 changed files with 185 additions and 3 deletions
|
|
@ -40,6 +40,7 @@ a3xx_SOURCES := \
|
|||
a3xx/fd3_emit.c \
|
||||
a3xx/fd3_gmem.c \
|
||||
a3xx/fd3_program.c \
|
||||
a3xx/fd3_query.c \
|
||||
a3xx/fd3_rasterizer.c \
|
||||
a3xx/fd3_screen.c \
|
||||
a3xx/fd3_texture.c \
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
#include "fd3_emit.h"
|
||||
#include "fd3_gmem.h"
|
||||
#include "fd3_program.h"
|
||||
#include "fd3_query.h"
|
||||
#include "fd3_rasterizer.h"
|
||||
#include "fd3_texture.h"
|
||||
#include "fd3_zsa.h"
|
||||
|
|
@ -134,5 +135,7 @@ fd3_context_create(struct pipe_screen *pscreen, void *priv)
|
|||
fd3_ctx->solid_vbuf = create_solid_vertexbuf(pctx);
|
||||
fd3_ctx->blit_texcoord_vbuf = create_blit_texcoord_vertexbuf(pctx);
|
||||
|
||||
fd3_query_context_init(pctx);
|
||||
|
||||
return pctx;
|
||||
}
|
||||
|
|
|
|||
139
src/gallium/drivers/freedreno/a3xx/fd3_query.c
Normal file
139
src/gallium/drivers/freedreno/a3xx/fd3_query.c
Normal file
|
|
@ -0,0 +1,139 @@
|
|||
/* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2014 Rob Clark <robclark@freedesktop.org>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Rob Clark <robclark@freedesktop.org>
|
||||
*/
|
||||
|
||||
#include "freedreno_query_hw.h"
|
||||
#include "freedreno_context.h"
|
||||
#include "freedreno_util.h"
|
||||
|
||||
#include "fd3_query.h"
|
||||
#include "fd3_util.h"
|
||||
|
||||
|
||||
struct fd_rb_samp_ctrs {
|
||||
uint64_t ctr[16];
|
||||
};
|
||||
|
||||
/*
|
||||
* Occlusion Query:
|
||||
*
|
||||
* OCCLUSION_COUNTER and OCCLUSION_PREDICATE differ only in how they
|
||||
* interpret results
|
||||
*/
|
||||
|
||||
static struct fd_hw_sample *
|
||||
occlusion_get_sample(struct fd_context *ctx, struct fd_ringbuffer *ring)
|
||||
{
|
||||
struct fd_hw_sample *samp =
|
||||
fd_hw_sample_init(ctx, sizeof(struct fd_rb_samp_ctrs));
|
||||
|
||||
/* Set RB_SAMPLE_COUNT_ADDR to samp->offset plus value of
|
||||
* HW_QUERY_BASE_REG register:
|
||||
*/
|
||||
OUT_PKT3(ring, CP_SET_CONSTANT, 3);
|
||||
OUT_RING(ring, CP_REG(REG_A3XX_RB_SAMPLE_COUNT_ADDR) | 0x80000000);
|
||||
OUT_RING(ring, HW_QUERY_BASE_REG);
|
||||
OUT_RING(ring, samp->offset);
|
||||
|
||||
OUT_PKT0(ring, REG_A3XX_RB_SAMPLE_COUNT_CONTROL, 1);
|
||||
OUT_RING(ring, A3XX_RB_SAMPLE_COUNT_CONTROL_COPY);
|
||||
|
||||
OUT_PKT3(ring, CP_DRAW_INDX, 3);
|
||||
OUT_RING(ring, 0x00000000);
|
||||
OUT_RING(ring, DRAW(DI_PT_POINTLIST_A2XX, DI_SRC_SEL_AUTO_INDEX,
|
||||
INDEX_SIZE_IGN, USE_VISIBILITY));
|
||||
OUT_RING(ring, 0); /* NumIndices */
|
||||
|
||||
OUT_PKT3(ring, CP_EVENT_WRITE, 1);
|
||||
OUT_RING(ring, ZPASS_DONE);
|
||||
|
||||
OUT_PKT0(ring, REG_A3XX_RBBM_PERFCTR_CTL, 1);
|
||||
OUT_RING(ring, A3XX_RBBM_PERFCTR_CTL_ENABLE);
|
||||
|
||||
OUT_PKT0(ring, REG_A3XX_VBIF_PERF_CNT_EN, 1);
|
||||
OUT_RING(ring, A3XX_VBIF_PERF_CNT_EN_CNT0 |
|
||||
A3XX_VBIF_PERF_CNT_EN_CNT1 |
|
||||
A3XX_VBIF_PERF_CNT_EN_PWRCNT0 |
|
||||
A3XX_VBIF_PERF_CNT_EN_PWRCNT1 |
|
||||
A3XX_VBIF_PERF_CNT_EN_PWRCNT2);
|
||||
|
||||
return samp;
|
||||
}
|
||||
|
||||
static uint64_t
|
||||
count_samples(const struct fd_rb_samp_ctrs *start,
|
||||
const struct fd_rb_samp_ctrs *end)
|
||||
{
|
||||
uint64_t n = 0;
|
||||
unsigned i;
|
||||
|
||||
/* not quite sure what all of these are, possibly different
|
||||
* counters for each MRT render target:
|
||||
*/
|
||||
for (i = 0; i < 16; i += 4)
|
||||
n += end->ctr[i] - start->ctr[i];
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static void
|
||||
occlusion_counter_accumulate_result(struct fd_context *ctx,
|
||||
const void *start, const void *end,
|
||||
union pipe_query_result *result)
|
||||
{
|
||||
uint64_t n = count_samples(start, end);
|
||||
result->u64 += n;
|
||||
}
|
||||
|
||||
static void
|
||||
occlusion_predicate_accumulate_result(struct fd_context *ctx,
|
||||
const void *start, const void *end,
|
||||
union pipe_query_result *result)
|
||||
{
|
||||
uint64_t n = count_samples(start, end);
|
||||
result->b |= (n > 0);
|
||||
}
|
||||
|
||||
static const struct fd_hw_sample_provider occlusion_counter = {
|
||||
.query_type = PIPE_QUERY_OCCLUSION_COUNTER,
|
||||
.active = FD_STAGE_DRAW, /* | FD_STAGE_CLEAR ??? */
|
||||
.get_sample = occlusion_get_sample,
|
||||
.accumulate_result = occlusion_counter_accumulate_result,
|
||||
};
|
||||
|
||||
static const struct fd_hw_sample_provider occlusion_predicate = {
|
||||
.query_type = PIPE_QUERY_OCCLUSION_PREDICATE,
|
||||
.active = FD_STAGE_DRAW, /* | FD_STAGE_CLEAR ??? */
|
||||
.get_sample = occlusion_get_sample,
|
||||
.accumulate_result = occlusion_predicate_accumulate_result,
|
||||
};
|
||||
|
||||
void fd3_query_context_init(struct pipe_context *pctx)
|
||||
{
|
||||
fd_hw_query_register_provider(pctx, &occlusion_counter);
|
||||
fd_hw_query_register_provider(pctx, &occlusion_predicate);
|
||||
}
|
||||
36
src/gallium/drivers/freedreno/a3xx/fd3_query.h
Normal file
36
src/gallium/drivers/freedreno/a3xx/fd3_query.h
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
/* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2014 Rob Clark <robclark@freedesktop.org>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Rob Clark <robclark@freedesktop.org>
|
||||
*/
|
||||
|
||||
#ifndef FD3_QUERY_H_
|
||||
#define FD3_QUERY_H_
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
|
||||
void fd3_query_context_init(struct pipe_context *pctx);
|
||||
|
||||
#endif /* FD3_QUERY_H_ */
|
||||
|
|
@ -143,6 +143,8 @@ tables for things that differ if the delta is not too much..
|
|||
static int
|
||||
fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
||||
{
|
||||
struct fd_screen *screen = fd_screen(pscreen);
|
||||
|
||||
/* this is probably not totally correct.. but it's a start: */
|
||||
switch (param) {
|
||||
/* Supported features (boolean caps). */
|
||||
|
|
@ -236,11 +238,12 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||
case PIPE_CAP_MAX_RENDER_TARGETS:
|
||||
return 1;
|
||||
|
||||
/* Timer queries. */
|
||||
/* Queries. */
|
||||
case PIPE_CAP_QUERY_TIME_ELAPSED:
|
||||
case PIPE_CAP_OCCLUSION_QUERY:
|
||||
case PIPE_CAP_QUERY_TIMESTAMP:
|
||||
return 0;
|
||||
case PIPE_CAP_OCCLUSION_QUERY:
|
||||
return (screen->gpu_id >= 300) ? 1: 0;
|
||||
|
||||
case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
|
||||
case PIPE_CAP_MIN_TEXEL_OFFSET:
|
||||
|
|
@ -253,7 +256,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||
case PIPE_CAP_ENDIANNESS:
|
||||
return PIPE_ENDIAN_LITTLE;
|
||||
|
||||
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
|
||||
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
|
||||
return 64;
|
||||
|
||||
default:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue