/** * svga_reemit_fs_bindings - Reemit the fragment shader bindings */ enum pipe_error svga_reemit_fs_bindings(struct svga_context *svga) { enum pipe_error ret; assert(svga->rebind.flags.fs); assert(svga_have_gb_objects(svga)); if (!svga->state.hw_draw.fs) return PIPE_OK; if (!svga_need_to_rebind_resources(svga)) { ret = svga->swc->resource_rebind(svga->swc, NULL, svga->state.hw_draw.fs->gb_shader, SVGA_RELOC_READ); goto out; } if (svga_have_vgpu10(svga)) ret = SVGA3D_vgpu10_SetShader(svga->swc, SVGA3D_SHADERTYPE_PS, svga->state.hw_draw.fs->gb_shader, svga->state.hw_draw.fs->id); else ret = SVGA3D_SetGBShader(svga->swc, SVGA3D_SHADERTYPE_PS, svga->state.hw_draw.fs->gb_shader); out: if (ret != PIPE_OK) return ret; svga->rebind.flags.fs = FALSE; return PIPE_OK; }
/** * svga_reemit_vs_bindings - Reemit the vertex shader bindings */ enum pipe_error svga_reemit_vs_bindings(struct svga_context *svga) { enum pipe_error ret; struct svga_winsys_gb_shader *gbshader = NULL; SVGA3dShaderId shaderId = SVGA3D_INVALID_ID; assert(svga->rebind.flags.vs); assert(svga_have_gb_objects(svga)); if (svga->state.hw_draw.vs) { gbshader = svga->state.hw_draw.vs->gb_shader; shaderId = svga->state.hw_draw.vs->id; } if (!svga_need_to_rebind_resources(svga)) { ret = svga->swc->resource_rebind(svga->swc, NULL, gbshader, SVGA_RELOC_READ); goto out; } if (svga_have_vgpu10(svga)) ret = SVGA3D_vgpu10_SetShader(svga->swc, SVGA3D_SHADERTYPE_VS, gbshader, shaderId); else ret = SVGA3D_SetGBShader(svga->swc, SVGA3D_SHADERTYPE_VS, gbshader); out: if (ret != PIPE_OK) return ret; svga->rebind.flags.vs = FALSE; return PIPE_OK; }
static enum pipe_error emit_hw_fs(struct svga_context *svga, unsigned dirty) { struct svga_shader_variant *variant = NULL; enum pipe_error ret = PIPE_OK; struct svga_fragment_shader *fs = svga->curr.fs; struct svga_fs_compile_key key; /* SVGA_NEW_BLEND * SVGA_NEW_TEXTURE_BINDING * SVGA_NEW_RAST * SVGA_NEW_NEED_SWTNL * SVGA_NEW_SAMPLER * SVGA_NEW_FRAME_BUFFER */ ret = make_fs_key( svga, fs, &key ); if (ret != PIPE_OK) return ret; variant = search_fs_key( fs, &key ); if (!variant) { ret = compile_fs( svga, fs, &key, &variant ); if (ret != PIPE_OK) return ret; } assert(variant); if (variant != svga->state.hw_draw.fs) { if (svga_have_gb_objects(svga)) { /* * Bind is necessary here only because pipebuffer_fenced may move * the shader contents around.... */ ret = SVGA3D_BindGBShader(svga->swc, variant->gb_shader); if (ret != PIPE_OK) return ret; ret = SVGA3D_SetGBShader(svga->swc, SVGA3D_SHADERTYPE_PS, variant->gb_shader); if (ret != PIPE_OK) return ret; svga->rebind.fs = FALSE; } else { ret = SVGA3D_SetShader(svga->swc, SVGA3D_SHADERTYPE_PS, variant->id); if (ret != PIPE_OK) return ret; } svga->dirty |= SVGA_NEW_FS_VARIANT; svga->state.hw_draw.fs = variant; } return PIPE_OK; }
/** * svga_reemit_fs_bindings - Reemit the fragment shader bindings */ enum pipe_error svga_reemit_fs_bindings(struct svga_context *svga) { enum pipe_error ret; assert(svga->rebind.fs); assert(svga_have_gb_objects(svga)); if (!svga->state.hw_draw.fs) return PIPE_OK; ret = SVGA3D_SetGBShader(svga->swc, SVGA3D_SHADERTYPE_PS, svga->state.hw_draw.fs->gb_shader); if (ret != PIPE_OK) return ret; svga->rebind.fs = FALSE; return PIPE_OK; }