svga_context.c revision 6235846cb779bce470bc903f8cfc701bc0343d73
13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/********************************************************** 23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2008-2009 VMware, Inc. All rights reserved. 33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person 53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation 63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without 73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy, 83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies 93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is 103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions: 113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be 133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software. 143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE. 233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/ 253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_cmd.h" 273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_defines.h" 2928486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_screen.h" 313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_memory.h" 32cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca#include "util/u_bitmask.h" 333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_upload_mgr.h" 343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h" 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_screen.h" 370ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca#include "svga_surface.h" 38287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "svga_resource_texture.h" 39287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "svga_resource_buffer.h" 40287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "svga_resource.h" 413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_winsys.h" 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_swtnl.h" 433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_draw.h" 443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_debug.h" 453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_state.h" 463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 47daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob BornecrantzDEBUG_GET_ONCE_BOOL_OPTION(no_swtnl, "SVGA_NO_SWTNL", FALSE) 48daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob BornecrantzDEBUG_GET_ONCE_BOOL_OPTION(force_swtnl, "SVGA_FORCE_SWTNL", FALSE); 49daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob BornecrantzDEBUG_GET_ONCE_BOOL_OPTION(use_min_mipmap, "SVGA_USE_MIN_MIPMAP", FALSE); 50daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob BornecrantzDEBUG_GET_ONCE_NUM_OPTION(disable_shader, "SVGA_DISABLE_SHADER", ~0); 51c523f31f4a35f8396ab35859c70fb041c210cedbJakob BornecrantzDEBUG_GET_ONCE_BOOL_OPTION(no_line_width, "SVGA_NO_LINE_WIDTH", FALSE); 52c523f31f4a35f8396ab35859c70fb041c210cedbJakob BornecrantzDEBUG_GET_ONCE_BOOL_OPTION(force_hw_line_stipple, "SVGA_FORCE_HW_LINE_STIPPLE", FALSE); 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void svga_destroy( struct pipe_context *pipe ) 553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_context *svga = svga_context( pipe ); 573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned shader; 583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_cleanup_framebuffer( svga ); 603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_cleanup_tss_binding( svga ); 613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_hwtnl_destroy( svga->hwtnl ); 633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_cleanup_vertex_state(svga); 653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->swc->destroy(svga->swc); 673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_destroy_swtnl( svga ); 693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz u_upload_destroy( svga->upload_vb ); 713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz u_upload_destroy( svga->upload_ib ); 723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 73cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca util_bitmask_destroy( svga->vs_bm ); 74cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca util_bitmask_destroy( svga->fs_bm ); 75cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca 763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for(shader = 0; shader < PIPE_SHADER_TYPES; ++shader) 77287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference( &svga->curr.cb[shader], NULL ); 783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz FREE( svga ); 803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 847f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwellstruct pipe_context *svga_context_create( struct pipe_screen *screen, 857f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell void *priv ) 863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_screen *svgascreen = svga_screen(screen); 883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_context *svga = NULL; 893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz enum pipe_error ret; 903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga = CALLOC_STRUCT(svga_context); 923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga == NULL) 93da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonseca goto no_svga; 943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.winsys = screen->winsys; 963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.screen = screen; 977f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell svga->pipe.priv = priv; 983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.destroy = svga_destroy; 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.clear = svga_clear; 1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->swc = svgascreen->sws->context_create(svgascreen->sws); 1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(!svga->swc) 103da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonseca goto no_swc; 1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 105287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell svga_init_resource_functions(svga); 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_blend_functions(svga); 1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_blit_functions(svga); 1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_depth_stencil_functions(svga); 1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_draw_functions(svga); 1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_flush_functions(svga); 1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_misc_functions(svga); 1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_rasterizer_functions(svga); 1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_sampler_functions(svga); 1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_fs_functions(svga); 1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_vs_functions(svga); 1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_vertex_functions(svga); 1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_constbuffer_functions(svga); 1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_query_functions(svga); 1194c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger svga_init_surface_functions(svga); 1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 12113a13fcb8054ed2d1138f6754fc67b014cc5cd5dMichel Dänzer 1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* debug */ 123daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob Bornecrantz svga->debug.no_swtnl = debug_get_option_no_swtnl(); 124daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob Bornecrantz svga->debug.force_swtnl = debug_get_option_force_swtnl(); 125daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob Bornecrantz svga->debug.use_min_mipmap = debug_get_option_use_min_mipmap(); 126daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob Bornecrantz svga->debug.disable_shader = debug_get_option_disable_shader(); 127c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz svga->debug.no_line_width = debug_get_option_no_line_width(); 128c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz svga->debug.force_hw_line_stipple = debug_get_option_force_hw_line_stipple(); 1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 130cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca svga->fs_bm = util_bitmask_create(); 131cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if (svga->fs_bm == NULL) 132cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca goto no_fs_bm; 133cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca 134cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca svga->vs_bm = util_bitmask_create(); 135cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if (svga->vs_bm == NULL) 136cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca goto no_vs_bm; 137cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca 138287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell svga->upload_ib = u_upload_create( &svga->pipe, 1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 32 * 1024, 1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 16, 141287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_INDEX_BUFFER ); 1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->upload_ib == NULL) 143da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonseca goto no_upload_ib; 1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 145287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell svga->upload_vb = u_upload_create( &svga->pipe, 1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 128 * 1024, 1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 16, 148287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_VERTEX_BUFFER ); 1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->upload_vb == NULL) 150da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonseca goto no_upload_vb; 1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->hwtnl = svga_hwtnl_create( svga, 1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->upload_ib, 1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->swc ); 1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->hwtnl == NULL) 156da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonseca goto no_hwtnl; 1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1580cb6329e8941dc7937c8aeea4b2e83c77881bd3aJosé Fonseca if (!svga_init_swtnl(svga)) 1590cb6329e8941dc7937c8aeea4b2e83c77881bd3aJosé Fonseca goto no_swtnl; 1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = svga_emit_initial_state( svga ); 1625f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul if (ret != PIPE_OK) 163da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonseca goto no_state; 1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Avoid shortcircuiting state with initial value of zero. 1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memset(&svga->state.hw_clear, 0xcd, sizeof(svga->state.hw_clear)); 1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memset(&svga->state.hw_clear.framebuffer, 0x0, 1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sizeof(svga->state.hw_clear.framebuffer)); 1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memset(&svga->state.hw_draw, 0xcd, sizeof(svga->state.hw_draw)); 1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memset(&svga->state.hw_draw.views, 0x0, sizeof(svga->state.hw_draw.views)); 1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->state.hw_draw.num_views = 0; 1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->dirty = ~0; 1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz LIST_INITHEAD(&svga->dirty_buffers); 1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return &svga->pipe; 1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 181da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonsecano_state: 1820cb6329e8941dc7937c8aeea4b2e83c77881bd3aJosé Fonseca svga_destroy_swtnl(svga); 1830cb6329e8941dc7937c8aeea4b2e83c77881bd3aJosé Fonsecano_swtnl: 1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_hwtnl_destroy( svga->hwtnl ); 185da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonsecano_hwtnl: 1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz u_upload_destroy( svga->upload_vb ); 187da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonsecano_upload_vb: 1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz u_upload_destroy( svga->upload_ib ); 189da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonsecano_upload_ib: 190cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca util_bitmask_destroy( svga->vs_bm ); 191cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonsecano_vs_bm: 192cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca util_bitmask_destroy( svga->fs_bm ); 193cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonsecano_fs_bm: 1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->swc->destroy(svga->swc); 195da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonsecano_swc: 1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz FREE(svga); 197da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonsecano_svga: 1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return NULL; 1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid svga_context_flush( struct svga_context *svga, 2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_fence_handle **pfence ) 2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_screen *svgascreen = svga_screen(svga->pipe.screen); 206b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca struct pipe_fence_handle *fence = NULL; 207b84b7f19dfdc0ac02175847065b39110db7ad98fKeith Whitwell 208b84b7f19dfdc0ac02175847065b39110db7ad98fKeith Whitwell svga->curr.nr_fbs = 0; 209b84b7f19dfdc0ac02175847065b39110db7ad98fKeith Whitwell 2100277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom /* Flush the upload managers to ensure recycling of upload buffers 2110277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom * without throttling. This should really be conditioned on 2120277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom * pipe_buffer_map_range not supporting PIPE_TRANSFER_UNSYNCHRONIZED. 2130277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom */ 2140277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom 2150277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom u_upload_flush(svga->upload_vb); 2160277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom u_upload_flush(svga->upload_ib); 2170277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom 218b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca /* Ensure that texture dma uploads are processed 2193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * before submitting commands. 2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_context_flush_buffers(svga); 2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Flush pending commands to hardware: 2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 225b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca svga->swc->flush(svga->swc, &fence); 226b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca 227b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca svga_screen_cache_flush(svgascreen, fence); 2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2296b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca /* To force the re-emission of rendertargets and texture sampler bindings on 2306b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca * the next command buffer. 231369ece170257ef687ca609cacd1d66d186274eb3José Fonseca */ 2326b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca svga->rebind.rendertargets = TRUE; 2336b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca svga->rebind.texture_samplers = TRUE; 234369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (SVGA_DEBUG & DEBUG_SYNC) { 236b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca if (fence) 237bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšák svga->pipe.screen->fence_finish( svga->pipe.screen, fence, 238b39bccbd4ed71e9585da4cf5acf7b887b2e90899Marek Olšák PIPE_TIMEOUT_INFINITE); 2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 240b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca 241b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca if(pfence) 2426235846cb779bce470bc903f8cfc701bc0343d73Thomas Hellstrom svgascreen->sws->fence_reference(svgascreen->sws, pfence, fence); 2436235846cb779bce470bc903f8cfc701bc0343d73Thomas Hellstrom 2446235846cb779bce470bc903f8cfc701bc0343d73Thomas Hellstrom svgascreen->sws->fence_reference(svgascreen->sws, &fence, NULL); 2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid svga_hwtnl_flush_retry( struct svga_context *svga ) 2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz enum pipe_error ret = PIPE_OK; 2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = svga_hwtnl_flush( svga->hwtnl ); 2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (ret == PIPE_ERROR_OUT_OF_MEMORY) { 2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_context_flush( svga, NULL ); 2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = svga_hwtnl_flush( svga->hwtnl ); 2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(ret == 0); 2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2610ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca 2620ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca/* Emit all operations pending on host surfaces. 2630ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca */ 2640ced789a0b56256891a2a26342befe645f4fa46dJosé Fonsecavoid svga_surfaces_flush(struct svga_context *svga) 2650ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca{ 2660ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca unsigned i; 2670ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca 2680ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca /* Emit buffered drawing commands. 2690ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca */ 2700ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca svga_hwtnl_flush_retry( svga ); 2710ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca 2720ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca /* Emit back-copy from render target view to texture. 2730ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca */ 2740ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { 2750ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca if (svga->curr.framebuffer.cbufs[i]) 2760ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca svga_propagate_surface(svga, svga->curr.framebuffer.cbufs[i]); 2770ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca } 2780ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca 2790ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca if (svga->curr.framebuffer.zsbuf) 2800ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca svga_propagate_surface(svga, svga->curr.framebuffer.zsbuf); 2810ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca 2820ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca} 2830ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca 2840ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca 285cd151effe654c460c46ba55780eb89b3072077c0Thomas Hellstromstruct svga_winsys_context * 286cd151effe654c460c46ba55780eb89b3072077c0Thomas Hellstromsvga_winsys_context( struct pipe_context *pipe ) 287cd151effe654c460c46ba55780eb89b3072077c0Thomas Hellstrom{ 288cd151effe654c460c46ba55780eb89b3072077c0Thomas Hellstrom return svga_context( pipe )->swc; 289cd151effe654c460c46ba55780eb89b3072077c0Thomas Hellstrom} 290