static struct vg_shader * setup_lookup_single(struct vg_context *ctx, void *user_data) { char buffer[1024]; VGImageChannel channel = (VGImageChannel)(user_data); struct vg_shader *shader; switch(channel) { case VG_RED: util_snprintf(buffer, 1023, lookup_single_asm, "xxxx"); break; case VG_GREEN: util_snprintf(buffer, 1023, lookup_single_asm, "yyyy"); break; case VG_BLUE: util_snprintf(buffer, 1023, lookup_single_asm, "zzzz"); break; case VG_ALPHA: util_snprintf(buffer, 1023, lookup_single_asm, "wwww"); break; default: debug_assert(!"Unknown color channel"); } shader = shader_create_from_text(ctx->pipe, buffer, 200, PIPE_SHADER_FRAGMENT); return shader; }
static struct vg_shader * setup_color_matrix(struct vg_context *ctx, void *user_data) { struct vg_shader *shader = shader_create_from_text(ctx->pipe, color_matrix_asm, 200, PIPE_SHADER_FRAGMENT); return shader; }
void * vg_texture_vs(struct vg_context *ctx) { if (!ctx->texture_vs) { ctx->texture_vs = shader_create_from_text(ctx->pipe, vs_texture_asm, 200, PIPE_SHADER_VERTEX); } return ctx->texture_vs->driver; }
static struct vg_shader * setup_convolution(struct vg_context *ctx, void *user_data) { char buffer[1024]; VGint num_consts = (VGint)(long)(user_data); struct vg_shader *shader; util_snprintf(buffer, 1023, convolution_asm, num_consts, num_consts / 2 + 1); shader = shader_create_from_text(ctx->pipe, buffer, 200, PIPE_SHADER_FRAGMENT); return shader; }
static void update_clip_state(struct vg_context *ctx) { struct pipe_depth_stencil_alpha_state *dsa = &ctx->state.g3d.dsa; struct vg_state *state = &ctx->state.vg; memset(dsa, 0, sizeof(struct pipe_depth_stencil_alpha_state)); if (state->scissoring) { struct pipe_blend_state *blend = &ctx->state.g3d.blend; struct pipe_framebuffer_state *fb = &ctx->state.g3d.fb; int i; dsa->depth.writemask = 1;/*glDepthMask(TRUE);*/ dsa->depth.func = PIPE_FUNC_ALWAYS; dsa->depth.enabled = 1; cso_save_blend(ctx->cso_context); cso_save_fragment_shader(ctx->cso_context); /* set a passthrough shader */ if (!ctx->pass_through_depth_fs) ctx->pass_through_depth_fs = shader_create_from_text(ctx->pipe, pass_through_depth_asm, 40, PIPE_SHADER_FRAGMENT); cso_set_fragment_shader_handle(ctx->cso_context, ctx->pass_through_depth_fs->driver); cso_set_depth_stencil_alpha(ctx->cso_context, dsa); ctx->pipe->clear(ctx->pipe, PIPE_CLEAR_DEPTHSTENCIL, NULL, 1.0, 0); /* disable color writes */ blend->rt[0].colormask = 0; /*disable colorwrites*/ cso_set_blend(ctx->cso_context, blend); /* enable scissoring */ for (i = 0; i < state->scissor_rects_num; ++i) { const float x = state->scissor_rects[i * 4 + 0].f; const float y = state->scissor_rects[i * 4 + 1].f; const float width = state->scissor_rects[i * 4 + 2].f; const float height = state->scissor_rects[i * 4 + 3].f; VGfloat minx, miny, maxx, maxy; minx = 0; miny = 0; maxx = fb->width; maxy = fb->height; if (x > minx) minx = x; if (y > miny) miny = y; if (x + width < maxx) maxx = x + width; if (y + height < maxy) maxy = y + height; /* check for null space */ if (minx >= maxx || miny >= maxy) minx = miny = maxx = maxy = 0; /*glClear(GL_DEPTH_BUFFER_BIT);*/ renderer_draw_quad(ctx->renderer, minx, miny, maxx, maxy, 0.0f); } cso_restore_blend(ctx->cso_context); cso_restore_fragment_shader(ctx->cso_context); dsa->depth.enabled = 1; /* glEnable(GL_DEPTH_TEST); */ dsa->depth.writemask = 0;/*glDepthMask(FALSE);*/ dsa->depth.func = PIPE_FUNC_GEQUAL; } }