r300_context.c revision 4a49301e
1/* 2 * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com> 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * on the rights to use, copy, modify, merge, publish, distribute, sub 8 * license, and/or sell copies of the Software, and to permit persons to whom 9 * the Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21 * USE OR OTHER DEALINGS IN THE SOFTWARE. */ 22 23#include "draw/draw_context.h" 24 25#include "tgsi/tgsi_scan.h" 26 27#include "util/u_hash_table.h" 28#include "util/u_memory.h" 29#include "util/u_simple_list.h" 30 31#include "r300_clear.h" 32#include "r300_context.h" 33#include "r300_flush.h" 34#include "r300_query.h" 35#include "r300_render.h" 36#include "r300_screen.h" 37#include "r300_state_derived.h" 38#include "r300_state_invariant.h" 39#include "r300_winsys.h" 40 41static enum pipe_error r300_clear_hash_table(void* key, void* value, 42 void* data) 43{ 44 FREE(key); 45 FREE(value); 46 return PIPE_OK; 47} 48 49static void r300_destroy_context(struct pipe_context* context) 50{ 51 struct r300_context* r300 = r300_context(context); 52 struct r300_query* query, * temp; 53 54 util_hash_table_foreach(r300->shader_hash_table, r300_clear_hash_table, 55 NULL); 56 util_hash_table_destroy(r300->shader_hash_table); 57 58 draw_destroy(r300->draw); 59 60 /* Free the OQ BO. */ 61 context->screen->buffer_destroy(r300->oqbo); 62 63 /* If there are any queries pending or not destroyed, remove them now. */ 64 foreach_s(query, temp, &r300->query_list) { 65 remove_from_list(query); 66 FREE(query); 67 } 68 69 FREE(r300->blend_color_state); 70 FREE(r300->rs_block); 71 FREE(r300->scissor_state); 72 FREE(r300->viewport_state); 73 FREE(r300); 74} 75 76static unsigned int 77r300_is_texture_referenced(struct pipe_context *pipe, 78 struct pipe_texture *texture, 79 unsigned face, unsigned level) 80{ 81 struct pipe_buffer* buf = 0; 82 83 r300_get_texture_buffer(texture, &buf, NULL); 84 85 return pipe->is_buffer_referenced(pipe, buf); 86} 87 88static unsigned int 89r300_is_buffer_referenced(struct pipe_context *pipe, 90 struct pipe_buffer *buf) 91{ 92 /* This only checks to see whether actual hardware buffers are 93 * referenced. Since we use managed BOs and transfers, it's actually not 94 * possible for pipe_buffers to ever reference the actual hardware, so 95 * buffers are never referenced. */ 96 return 0; 97} 98 99static void r300_flush_cb(void *data) 100{ 101 struct r300_context* const cs_context_copy = data; 102 103 cs_context_copy->context.flush(&cs_context_copy->context, 0, NULL); 104} 105 106struct pipe_context* r300_create_context(struct pipe_screen* screen, 107 struct r300_winsys* r300_winsys) 108{ 109 struct r300_context* r300 = CALLOC_STRUCT(r300_context); 110 struct r300_screen* r300screen = r300_screen(screen); 111 112 if (!r300) 113 return NULL; 114 115 r300->winsys = r300_winsys; 116 117 r300->context.winsys = (struct pipe_winsys*)r300_winsys; 118 r300->context.screen = screen; 119 120 r300_init_debug(r300); 121 122 r300->context.destroy = r300_destroy_context; 123 124 r300->context.clear = r300_clear; 125 126 if (r300screen->caps->has_tcl) 127 { 128 r300->context.draw_arrays = r300_draw_arrays; 129 r300->context.draw_elements = r300_draw_elements; 130 r300->context.draw_range_elements = r300_draw_range_elements; 131 } 132 else 133 { 134 assert(0); 135 } 136 137 r300->context.is_texture_referenced = r300_is_texture_referenced; 138 r300->context.is_buffer_referenced = r300_is_buffer_referenced; 139 140 r300->shader_hash_table = util_hash_table_create(r300_shader_key_hash, 141 r300_shader_key_compare); 142 143 r300->blend_color_state = CALLOC_STRUCT(r300_blend_color_state); 144 r300->rs_block = CALLOC_STRUCT(r300_rs_block); 145 r300->scissor_state = CALLOC_STRUCT(r300_scissor_state); 146 r300->viewport_state = CALLOC_STRUCT(r300_viewport_state); 147 148 /* Create a Draw. This is used for vert collation and SW TCL. */ 149 r300->draw = draw_create(); 150 /* Enable our renderer. */ 151 draw_set_rasterize_stage(r300->draw, r300_draw_stage(r300)); 152 /* Disable Draw's clipping if TCL is present. */ 153 draw_set_driver_clipping(r300->draw, r300_screen(screen)->caps->has_tcl); 154 /* Force Draw to never do viewport transform, since (again) we can do 155 * transform in hardware, always. */ 156 draw_set_viewport_state(r300->draw, &r300_viewport_identity); 157 158 /* Open up the OQ BO. */ 159 r300->oqbo = screen->buffer_create(screen, 4096, 160 PIPE_BUFFER_USAGE_VERTEX, 4096); 161 make_empty_list(&r300->query_list); 162 163 r300_init_flush_functions(r300); 164 165 r300_init_query_functions(r300); 166 167 /* r300_init_surface_functions(r300); */ 168 169 r300_init_state_functions(r300); 170 171 r300_emit_invariant_state(r300); 172 173 r300->winsys->set_flush_cb(r300->winsys, r300_flush_cb, r300); 174 r300->dirty_state = R300_NEW_KITCHEN_SINK; 175 r300->dirty_hw++; 176 return &r300->context; 177} 178