st/mesa: check return value of begin/end_query
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 20 Apr 2016 14:37:06 +0000 (09:37 -0500)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 22 Apr 2016 03:33:03 +0000 (22:33 -0500)
They can only indicate out of memory conditions, since the other error
conditions are caught earlier.

v2: fix error message in EndQuery

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
src/mesa/state_tracker/st_cb_queryobj.c

index cdb9efc762b271a506082f45cf9d6a4be29dd68a..24896762340c64a26809fbb64a0e1ada384301fa 100644 (file)
@@ -61,13 +61,9 @@ st_NewQueryObject(struct gl_context *ctx, GLuint id)
 }
 
 
-
 static void
-st_DeleteQuery(struct gl_context *ctx, struct gl_query_object *q)
+free_queries(struct pipe_context *pipe, struct st_query_object *stq)
 {
-   struct pipe_context *pipe = st_context(ctx)->pipe;
-   struct st_query_object *stq = st_query_object(q);
-
    if (stq->pq) {
       pipe->destroy_query(pipe, stq->pq);
       stq->pq = NULL;
@@ -77,6 +73,16 @@ st_DeleteQuery(struct gl_context *ctx, struct gl_query_object *q)
       pipe->destroy_query(pipe, stq->pq_begin);
       stq->pq_begin = NULL;
    }
+}
+
+
+static void
+st_DeleteQuery(struct gl_context *ctx, struct gl_query_object *q)
+{
+   struct pipe_context *pipe = st_context(ctx)->pipe;
+   struct st_query_object *stq = st_query_object(q);
+
+   free_queries(pipe, stq);
 
    free(stq);
 }
@@ -89,6 +95,7 @@ st_BeginQuery(struct gl_context *ctx, struct gl_query_object *q)
    struct pipe_context *pipe = st->pipe;
    struct st_query_object *stq = st_query_object(q);
    unsigned type;
+   bool ret = false;
 
    st_flush_bitmap_cache(st_context(ctx));
 
@@ -133,14 +140,7 @@ st_BeginQuery(struct gl_context *ctx, struct gl_query_object *q)
 
    if (stq->type != type) {
       /* free old query of different type */
-      if (stq->pq) {
-         pipe->destroy_query(pipe, stq->pq);
-         stq->pq = NULL;
-      }
-      if (stq->pq_begin) {
-         pipe->destroy_query(pipe, stq->pq_begin);
-         stq->pq_begin = NULL;
-      }
+      free_queries(pipe, stq);
       stq->type = PIPE_QUERY_TYPES; /* an invalid value */
    }
 
@@ -151,20 +151,25 @@ st_BeginQuery(struct gl_context *ctx, struct gl_query_object *q)
          stq->pq_begin = pipe->create_query(pipe, type, 0);
          stq->type = type;
       }
-      pipe->end_query(pipe, stq->pq_begin);
+      if (stq->pq_begin)
+         ret = pipe->end_query(pipe, stq->pq_begin);
    } else {
       if (!stq->pq) {
          stq->pq = pipe->create_query(pipe, type, q->Stream);
          stq->type = type;
       }
-      if (stq->pq) {
-         pipe->begin_query(pipe, stq->pq);
-      }
-      else {
-         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBeginQuery");
-         return;
-      }
+      if (stq->pq)
+         ret = pipe->begin_query(pipe, stq->pq);
    }
+
+   if (!ret) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBeginQuery");
+
+      free_queries(pipe, stq);
+      q->Active = GL_FALSE;
+      return;
+   }
+
    assert(stq->type == type);
 }
 
@@ -174,6 +179,7 @@ st_EndQuery(struct gl_context *ctx, struct gl_query_object *q)
 {
    struct pipe_context *pipe = st_context(ctx)->pipe;
    struct st_query_object *stq = st_query_object(q);
+   bool ret = false;
 
    st_flush_bitmap_cache(st_context(ctx));
 
@@ -185,7 +191,12 @@ st_EndQuery(struct gl_context *ctx, struct gl_query_object *q)
    }
 
    if (stq->pq)
-      pipe->end_query(pipe, stq->pq);
+      ret = pipe->end_query(pipe, stq->pq);
+
+   if (!ret) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glEndQuery");
+      return;
+   }
 }