{
unsigned codeLen = variant->nr_tokens * sizeof(variant->tokens[0]);
- {
+ if (svga_have_gb_objects(svga)) {
+ struct svga_winsys_screen *sws = svga_screen(svga->pipe.screen)->sws;
+ enum pipe_error ret;
+
+ variant->gb_shader = sws->shader_create(sws, type,
+ variant->tokens, codeLen);
+ if (!variant->gb_shader)
+ return PIPE_ERROR_OUT_OF_MEMORY;
+
+ ret = SVGA3D_BindGBShader(svga->swc, variant->gb_shader);
+ if (ret != PIPE_OK) {
+ sws->shader_destroy(sws, variant->gb_shader);
+ variant->gb_shader = NULL;
+ }
+
+ return ret;
+ }
+ else {
enum pipe_error ret;
/* Allocate an integer ID for the shader */
{
enum pipe_error ret = PIPE_OK;
+ if (svga_have_gb_objects(svga)) {
+ struct svga_winsys_screen *sws = svga_screen(svga->pipe.screen)->sws;
+
+ sws->shader_destroy(sws, variant->gb_shader);
+ variant->gb_shader = NULL;
+ goto end;
+ }
+
/* first try */
if (variant->id != UTIL_BITMASK_INVALID_INDEX) {
ret = SVGA3D_DestroyShader(svga->swc, variant->id, type);
util_bitmask_clear(svga->shader_id_bm, variant->id);
}
+end:
FREE((unsigned *)variant->tokens);
FREE(variant);