X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgallium%2Fwinsys%2Fsvga%2Fdrm%2Fvmw_context.c;h=da7506e779702def2bb4304ca86da50c0d9f76bf;hb=b54afde3ad631b33b42812c9ebf2225d9c53e38e;hp=addb58d165ac5357fed7b6331a001e2963ccffa2;hpb=fb6d09764d8169662a4d24380c51f9edff1a9afd;p=mesa.git diff --git a/src/gallium/winsys/svga/drm/vmw_context.c b/src/gallium/winsys/svga/drm/vmw_context.c index addb58d165a..da7506e7797 100644 --- a/src/gallium/winsys/svga/drm/vmw_context.c +++ b/src/gallium/winsys/svga/drm/vmw_context.c @@ -65,6 +65,7 @@ #define VMW_MAX_SURF_MEM_FACTOR 2 + struct vmw_buffer_relocation { struct pb_buffer *buffer; @@ -95,7 +96,7 @@ struct vmw_svga_winsys_context struct svga_winsys_context base; struct vmw_winsys_screen *vws; - struct util_hash_table *hash; + struct hash_table *hash; #ifdef DEBUG boolean must_flush; @@ -260,7 +261,7 @@ vmw_swc_flush(struct svga_winsys_context *swc, vmw_svga_winsys_surface_reference(&isurf->vsurf, NULL); } - util_hash_table_clear(vswc->hash); + _mesa_hash_table_clear(vswc->hash, NULL); vswc->surface.used = 0; vswc->surface.reserved = 0; @@ -370,24 +371,15 @@ vmw_swc_add_validate_buffer(struct vmw_svga_winsys_context *vswc, struct pb_buffer *pb_buf, unsigned flags) { - enum pipe_error ret; + ASSERTED enum pipe_error ret; unsigned translated_flags; + boolean already_present; - /* - * TODO: Update pb_validate to provide a similar functionality - * (Check buffer already present before adding) - */ - if (util_hash_table_get(vswc->hash, pb_buf) != pb_buf) { - translated_flags = vmw_translate_to_pb_flags(flags); - ret = pb_validate_add_buffer(vswc->validate, pb_buf, translated_flags); - /* TODO: Update pipebuffer to reserve buffers and not fail here */ - assert(ret == PIPE_OK); - (void)ret; - (void)util_hash_table_set(vswc->hash, pb_buf, pb_buf); - return TRUE; - } - - return FALSE; + translated_flags = vmw_translate_to_pb_flags(flags); + ret = pb_validate_add_buffer(vswc->validate, pb_buf, translated_flags, + vswc->hash, &already_present); + assert(ret == PIPE_OK); + return !already_present; } static void @@ -513,12 +505,8 @@ vmw_swc_surface_only_relocation(struct svga_winsys_context *swc, isrf = &vswc->surface.items[vswc->surface.used + vswc->surface.staged]; vmw_svga_winsys_surface_reference(&isrf->vsurf, vsurf); isrf->referenced = FALSE; - /* - * Note that a failure here may just fall back to unhashed behavior - * and potentially cause unnecessary flushing, so ignore the - * return code. - */ - (void) util_hash_table_set(vswc->hash, vsurf, isrf); + + _mesa_hash_table_insert(vswc->hash, vsurf, isrf); ++vswc->surface.staged; vswc->seen_surfaces += vsurf->size; @@ -609,12 +597,8 @@ vmw_swc_shader_relocation(struct svga_winsys_context *swc, ishader = &vswc->shader.items[vswc->shader.used + vswc->shader.staged]; vmw_svga_winsys_shader_reference(&ishader->vshader, vshader); ishader->referenced = FALSE; - /* - * Note that a failure here may just fall back to unhashed behavior - * and potentially cause unnecessary flushing, so ignore the - * return code. - */ - (void) util_hash_table_set(vswc->hash, vshader, ishader); + + _mesa_hash_table_insert(vswc->hash, vshader, ishader); ++vswc->shader.staged; } @@ -691,7 +675,7 @@ vmw_swc_destroy(struct svga_winsys_context *swc) vmw_svga_winsys_shader_reference(&ishader->vshader, NULL); } - util_hash_table_destroy(vswc->hash); + _mesa_hash_table_destroy(vswc->hash, NULL); pb_validate_destroy(vswc->validate); vmw_ioctl_context_destroy(vswc->vws, swc->cid); #ifdef DEBUG @@ -700,17 +684,6 @@ vmw_swc_destroy(struct svga_winsys_context *swc) FREE(vswc); } -static unsigned vmw_hash_ptr(void *p) -{ - return (unsigned)(unsigned long)p; -} - -static int vmw_ptr_compare(void *key1, void *key2) -{ - return (key1 == key2) ? 0 : 1; -} - - /** * vmw_svga_winsys_vgpu10_shader_screate - The winsys shader_crate callback * @@ -729,20 +702,19 @@ vmw_svga_winsys_vgpu10_shader_create(struct svga_winsys_context *swc, uint32 shaderId, SVGA3dShaderType shaderType, const uint32 *bytecode, - uint32 bytecodeLen) + uint32 bytecodeLen, + const SVGA3dDXShaderSignatureHeader *sgnInfo, + uint32 sgnLen) { struct vmw_svga_winsys_context *vswc = vmw_svga_winsys_context(swc); struct vmw_svga_winsys_shader *shader; - struct svga_winsys_gb_shader *gb_shader = - vmw_svga_winsys_shader_create(&vswc->vws->base, shaderType, bytecode, - bytecodeLen); - if (!gb_shader) + shader = vmw_svga_shader_create(&vswc->vws->base, shaderType, bytecode, + bytecodeLen, sgnInfo, sgnLen); + if (!shader) return NULL; - shader = vmw_svga_winsys_shader(gb_shader); shader->shid = shaderId; - - return gb_shader; + return svga_winsys_shader(shader); } /** @@ -853,7 +825,7 @@ vmw_svga_winsys_context_create(struct svga_winsys_screen *sws) if(!vswc->validate) goto out_no_validate; - vswc->hash = util_hash_table_create(vmw_hash_ptr, vmw_ptr_compare); + vswc->hash = util_hash_table_create_ptr_keys(); if (!vswc->hash) goto out_no_hash; @@ -861,6 +833,7 @@ vmw_svga_winsys_context_create(struct svga_winsys_screen *sws) vswc->fctx = debug_flush_ctx_create(TRUE, VMW_DEBUG_FLUSH_STACK); #endif + vswc->base.force_coherent = vws->force_coherent; return &vswc->base; out_no_hash: