Brian Paul | c9b5583 | 2009-12-31 14:47:21 -0700 | [diff] [blame] | 1 | /************************************************************************** |
| 2 | * |
| 3 | * Copyright 2009 VMware, Inc. |
| 4 | * All Rights Reserved. |
| 5 | * |
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a |
| 7 | * copy of this software and associated documentation files (the |
| 8 | * "Software"), to deal in the Software without restriction, including |
| 9 | * without limitation the rights to use, copy, modify, merge, publish, |
| 10 | * distribute, sub license, and/or sell copies of the Software, and to |
| 11 | * permit persons to whom the Software is furnished to do so, subject to |
| 12 | * the following conditions: |
| 13 | * |
| 14 | * The above copyright notice and this permission notice (including the |
| 15 | * next paragraph) shall be included in all copies or substantial portions |
| 16 | * of the Software. |
| 17 | * |
| 18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| 19 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| 20 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
| 21 | * IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR |
| 22 | * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
| 23 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
| 24 | * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| 25 | * |
| 26 | **************************************************************************/ |
| 27 | |
| 28 | |
| 29 | /** |
| 30 | * glBegin/EndCondtionalRender functions |
| 31 | * |
| 32 | * \author Brian Paul |
| 33 | */ |
| 34 | |
| 35 | |
| 36 | #include "main/imports.h" |
| 37 | #include "main/context.h" |
| 38 | |
| 39 | #include "pipe/p_context.h" |
| 40 | #include "pipe/p_defines.h" |
Marek Olšák | eae9674 | 2012-12-07 19:52:00 +0100 | [diff] [blame] | 41 | #include "cso_cache/cso_context.h" |
Brian Paul | c9b5583 | 2009-12-31 14:47:21 -0700 | [diff] [blame] | 42 | #include "st_context.h" |
| 43 | #include "st_cb_queryobj.h" |
| 44 | #include "st_cb_condrender.h" |
Vadim Girlin | 4f4855b | 2011-07-13 09:01:04 +0400 | [diff] [blame] | 45 | #include "st_cb_bitmap.h" |
Brian Paul | c9b5583 | 2009-12-31 14:47:21 -0700 | [diff] [blame] | 46 | |
| 47 | |
| 48 | /** |
| 49 | * Called via ctx->Driver.BeginConditionalRender() |
| 50 | */ |
| 51 | static void |
Kristian Høgsberg | f9995b3 | 2010-10-12 12:26:10 -0400 | [diff] [blame] | 52 | st_BeginConditionalRender(struct gl_context *ctx, struct gl_query_object *q, |
Brian Paul | c9b5583 | 2009-12-31 14:47:21 -0700 | [diff] [blame] | 53 | GLenum mode) |
| 54 | { |
| 55 | struct st_query_object *stq = st_query_object(q); |
Marek Olšák | 1c95c3e | 2011-05-29 15:35:25 +0200 | [diff] [blame] | 56 | struct st_context *st = st_context(ctx); |
Brian Paul | c9b5583 | 2009-12-31 14:47:21 -0700 | [diff] [blame] | 57 | uint m; |
Tobias Klausmann | 7a48858 | 2014-08-18 00:41:12 +0200 | [diff] [blame] | 58 | /* Don't invert the condition for rendering by default */ |
| 59 | boolean inverted = FALSE; |
Brian Paul | c9b5583 | 2009-12-31 14:47:21 -0700 | [diff] [blame] | 60 | |
Vadim Girlin | 4f4855b | 2011-07-13 09:01:04 +0400 | [diff] [blame] | 61 | st_flush_bitmap_cache(st); |
| 62 | |
Brian Paul | c9b5583 | 2009-12-31 14:47:21 -0700 | [diff] [blame] | 63 | switch (mode) { |
| 64 | case GL_QUERY_WAIT: |
| 65 | m = PIPE_RENDER_COND_WAIT; |
| 66 | break; |
| 67 | case GL_QUERY_NO_WAIT: |
| 68 | m = PIPE_RENDER_COND_NO_WAIT; |
| 69 | break; |
| 70 | case GL_QUERY_BY_REGION_WAIT: |
| 71 | m = PIPE_RENDER_COND_BY_REGION_WAIT; |
| 72 | break; |
| 73 | case GL_QUERY_BY_REGION_NO_WAIT: |
| 74 | m = PIPE_RENDER_COND_BY_REGION_NO_WAIT; |
| 75 | break; |
Tobias Klausmann | 7a48858 | 2014-08-18 00:41:12 +0200 | [diff] [blame] | 76 | case GL_QUERY_WAIT_INVERTED: |
| 77 | m = PIPE_RENDER_COND_WAIT; |
| 78 | inverted = TRUE; |
| 79 | break; |
| 80 | case GL_QUERY_NO_WAIT_INVERTED: |
| 81 | m = PIPE_RENDER_COND_NO_WAIT; |
| 82 | inverted = TRUE; |
| 83 | break; |
| 84 | case GL_QUERY_BY_REGION_WAIT_INVERTED: |
| 85 | m = PIPE_RENDER_COND_BY_REGION_WAIT; |
| 86 | inverted = TRUE; |
| 87 | break; |
| 88 | case GL_QUERY_BY_REGION_NO_WAIT_INVERTED: |
| 89 | m = PIPE_RENDER_COND_BY_REGION_NO_WAIT; |
| 90 | inverted = TRUE; |
| 91 | break; |
Brian Paul | c9b5583 | 2009-12-31 14:47:21 -0700 | [diff] [blame] | 92 | default: |
| 93 | assert(0 && "bad mode in st_BeginConditionalRender"); |
Vinson Lee | 1187a3c | 2010-01-26 16:37:10 -0800 | [diff] [blame] | 94 | m = PIPE_RENDER_COND_WAIT; |
Brian Paul | c9b5583 | 2009-12-31 14:47:21 -0700 | [diff] [blame] | 95 | } |
| 96 | |
Tobias Klausmann | 7a48858 | 2014-08-18 00:41:12 +0200 | [diff] [blame] | 97 | cso_set_render_condition(st->cso_context, stq->pq, inverted, m); |
Brian Paul | c9b5583 | 2009-12-31 14:47:21 -0700 | [diff] [blame] | 98 | } |
| 99 | |
| 100 | |
| 101 | /** |
Roland Scheidegger | 793e8e3 | 2013-06-14 19:48:57 +0200 | [diff] [blame] | 102 | * Called via ctx->Driver.EndConditionalRender() |
Brian Paul | c9b5583 | 2009-12-31 14:47:21 -0700 | [diff] [blame] | 103 | */ |
| 104 | static void |
Kristian Høgsberg | f9995b3 | 2010-10-12 12:26:10 -0400 | [diff] [blame] | 105 | st_EndConditionalRender(struct gl_context *ctx, struct gl_query_object *q) |
Brian Paul | c9b5583 | 2009-12-31 14:47:21 -0700 | [diff] [blame] | 106 | { |
Marek Olšák | 1c95c3e | 2011-05-29 15:35:25 +0200 | [diff] [blame] | 107 | struct st_context *st = st_context(ctx); |
Brian Paul | c9b5583 | 2009-12-31 14:47:21 -0700 | [diff] [blame] | 108 | (void) q; |
Marek Olšák | 1c95c3e | 2011-05-29 15:35:25 +0200 | [diff] [blame] | 109 | |
Vadim Girlin | 4f4855b | 2011-07-13 09:01:04 +0400 | [diff] [blame] | 110 | st_flush_bitmap_cache(st); |
| 111 | |
Roland Scheidegger | 793e8e3 | 2013-06-14 19:48:57 +0200 | [diff] [blame] | 112 | cso_set_render_condition(st->cso_context, NULL, FALSE, 0); |
Brian Paul | c9b5583 | 2009-12-31 14:47:21 -0700 | [diff] [blame] | 113 | } |
| 114 | |
| 115 | |
| 116 | |
| 117 | void st_init_cond_render_functions(struct dd_function_table *functions) |
| 118 | { |
| 119 | functions->BeginConditionalRender = st_BeginConditionalRender; |
| 120 | functions->EndConditionalRender = st_EndConditionalRender; |
| 121 | } |