nvc0/ir: fix TargetNVC0::insnCanLoadOffset()
[mesa.git] / src / gallium / drivers / virgl / virgl_query.c
index ea50f2f9341516543c72ec526325be932c4026fe..a75b29c7c9b86856bbabfa9ab985fb84f55e744c 100644 (file)
 
 #include "util/u_memory.h"
 #include "util/u_inlines.h"
-#include "virgl_resource.h"
 #include "virgl_context.h"
 #include "virgl_encode.h"
+#include "virgl_protocol.h"
+#include "virgl_resource.h"
 
 struct virgl_query {
    uint32_t handle;
@@ -36,14 +37,54 @@ struct virgl_query {
    unsigned result_size;
    unsigned result_gotten_sent;
 };
+#define VIRGL_QUERY_OCCLUSION_COUNTER     0
+#define VIRGL_QUERY_OCCLUSION_PREDICATE   1
+#define VIRGL_QUERY_TIMESTAMP             2
+#define VIRGL_QUERY_TIMESTAMP_DISJOINT    3
+#define VIRGL_QUERY_TIME_ELAPSED          4
+#define VIRGL_QUERY_PRIMITIVES_GENERATED  5
+#define VIRGL_QUERY_PRIMITIVES_EMITTED    6
+#define VIRGL_QUERY_SO_STATISTICS         7
+#define VIRGL_QUERY_SO_OVERFLOW_PREDICATE 8
+#define VIRGL_QUERY_GPU_FINISHED          9
+#define VIRGL_QUERY_PIPELINE_STATISTICS  10
+#define VIRGL_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE 11
+#define VIRGL_QUERY_SO_OVERFLOW_ANY_PREDICATE 12
+
+static const int pquery_map[] =
+{
+   VIRGL_QUERY_OCCLUSION_COUNTER,
+   VIRGL_QUERY_OCCLUSION_PREDICATE,
+   VIRGL_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE,
+   VIRGL_QUERY_TIMESTAMP,
+   VIRGL_QUERY_TIMESTAMP_DISJOINT,
+   VIRGL_QUERY_TIME_ELAPSED,
+   VIRGL_QUERY_PRIMITIVES_GENERATED,
+   VIRGL_QUERY_PRIMITIVES_EMITTED,
+   VIRGL_QUERY_SO_STATISTICS,
+   VIRGL_QUERY_SO_OVERFLOW_PREDICATE,
+   VIRGL_QUERY_SO_OVERFLOW_ANY_PREDICATE,
+   VIRGL_QUERY_GPU_FINISHED,
+   VIRGL_QUERY_PIPELINE_STATISTICS,
+};
+
+static int pipe_to_virgl_query(enum pipe_query_type ptype)
+{
+   return pquery_map[ptype];
+}
+
+static inline struct virgl_query *virgl_query(struct pipe_query *q)
+{
+   return (struct virgl_query *)q;
+}
 
 static void virgl_render_condition(struct pipe_context *ctx,
                                   struct pipe_query *q,
                                   boolean condition,
-                                  uint mode)
+                                  enum pipe_render_cond_flag mode)
 {
    struct virgl_context *vctx = virgl_context(ctx);
-   struct virgl_query *query = (struct virgl_query *)q;
+   struct virgl_query *query = virgl_query(q);
    uint32_t handle = 0;
    if (q)
       handle = query->handle;
@@ -69,11 +110,11 @@ static struct pipe_query *virgl_create_query(struct pipe_context *ctx,
    }
 
    handle = virgl_object_assign_handle();
-   query->type = query_type;
+   query->type = pipe_to_virgl_query(query_type);
    query->index = index;
    query->handle = handle;
    query->buf->clean = FALSE;
-   virgl_encoder_create_query(vctx, handle, query_type, index, query->buf, 0);
+   virgl_encoder_create_query(vctx, handle, query->type, index, query->buf, 0);
 
    return (struct pipe_query *)query;
 }
@@ -82,7 +123,7 @@ static void virgl_destroy_query(struct pipe_context *ctx,
                         struct pipe_query *q)
 {
    struct virgl_context *vctx = virgl_context(ctx);
-   struct virgl_query *query = (struct virgl_query *)q;
+   struct virgl_query *query = virgl_query(q);
 
    virgl_encode_delete_object(vctx, query->handle, VIRGL_OBJECT_QUERY);
 
@@ -94,18 +135,18 @@ static boolean virgl_begin_query(struct pipe_context *ctx,
                              struct pipe_query *q)
 {
    struct virgl_context *vctx = virgl_context(ctx);
-   struct virgl_query *query = (struct virgl_query *)q;
+   struct virgl_query *query = virgl_query(q);
 
    query->buf->clean = FALSE;
    virgl_encoder_begin_query(vctx, query->handle);
    return true;
 }
 
-static void virgl_end_query(struct pipe_context *ctx,
+static bool virgl_end_query(struct pipe_context *ctx,
                            struct pipe_query *q)
 {
    struct virgl_context *vctx = virgl_context(ctx);
-   struct virgl_query *query = (struct virgl_query *)q;
+   struct virgl_query *query = virgl_query(q);
    struct pipe_box box;
 
    uint32_t qs = VIRGL_QUERY_STATE_WAIT_HOST;
@@ -115,6 +156,7 @@ static void virgl_end_query(struct pipe_context *ctx,
 
 
    virgl_encoder_end_query(vctx, query->handle);
+   return true;
 }
 
 static boolean virgl_get_query_result(struct pipe_context *ctx,
@@ -123,7 +165,7 @@ static boolean virgl_get_query_result(struct pipe_context *ctx,
                                      union pipe_query_result *result)
 {
    struct virgl_context *vctx = virgl_context(ctx);
-   struct virgl_query *query = (struct virgl_query *)q;
+   struct virgl_query *query = virgl_query(q);
    struct pipe_transfer *transfer;
    struct virgl_host_query_state *host_state;
 
@@ -158,6 +200,11 @@ static boolean virgl_get_query_result(struct pipe_context *ctx,
    return TRUE;
 }
 
+static void
+virgl_set_active_query_state(struct pipe_context *pipe, boolean enable)
+{
+}
+
 void virgl_init_query_functions(struct virgl_context *vctx)
 {
    vctx->base.render_condition = virgl_render_condition;
@@ -166,4 +213,5 @@ void virgl_init_query_functions(struct virgl_context *vctx)
    vctx->base.begin_query = virgl_begin_query;
    vctx->base.end_query = virgl_end_query;
    vctx->base.get_query_result = virgl_get_query_result;
+   vctx->base.set_active_query_state = virgl_set_active_query_state;
 }