Lines Matching refs:shader

27 #include "shader.h"
44 struct shader {
64 struct shader * shader_create(struct vg_context *ctx)
66 struct shader *shader = 0;
68 shader = CALLOC_STRUCT(shader);
69 shader->context = ctx;
71 return shader;
74 void shader_destroy(struct shader *shader)
76 FREE(shader);
79 void shader_set_color_transform(struct shader *shader, VGboolean set)
81 shader->color_transform = set;
84 void shader_set_masking(struct shader *shader, VGboolean set)
86 shader->masking = set;
89 VGboolean shader_is_masking(struct shader *shader)
91 return shader->masking;
94 void shader_set_paint(struct shader *shader, struct vg_paint *paint)
96 shader->paint = paint;
99 struct vg_paint * shader_paint(struct shader *shader)
101 return shader->paint;
104 static VGint setup_constant_buffer(struct shader *shader)
106 const struct vg_state *state = &shader->context->state.vg;
107 VGint param_bytes = paint_constant_buffer_size(shader->paint);
111 assert(param_bytes <= sizeof(shader->constants));
116 shader->constants[i] =
121 memset(shader->constants, 0, sizeof(VGfloat) * 8);
124 paint_fill_constant_buffer(shader->paint,
125 &shader->paint_matrix, shader->constants + 8);
130 static VGboolean blend_use_shader(struct shader *shader)
132 struct vg_context *ctx = shader->context;
149 if (!advanced_blending && shader->drawing_image) {
151 util_format_has_alpha(shader->image->sampler_view->format);
164 static VGint blend_bind_samplers(struct shader *shader,
168 if (blend_use_shader(shader)) {
169 struct vg_context *ctx = shader->context;
188 static VGint setup_samplers(struct shader *shader,
211 num += paint_bind_samplers(shader->paint, samplers, sampler_views);
213 num += blend_bind_samplers(shader, samplers, sampler_views);
214 if (shader->drawing_image && shader->image)
215 num += image_bind_samplers(shader->image, samplers, sampler_views);
220 static INLINE VGboolean is_format_bw(struct shader *shader)
223 struct vg_context *ctx = shader->context;
227 if (shader->drawing_image && shader->image) {
228 if (shader->image->format == VG_BW_1)
235 static void setup_shader_program(struct shader *shader)
237 struct vg_context *ctx = shader->context;
240 VGboolean black_white = is_format_bw(shader);
243 if (!shader->drawing_image ||
244 (shader->image_mode == VG_DRAW_IMAGE_MULTIPLY || shader->image_mode == VG_DRAW_IMAGE_STENCIL)) {
245 switch(paint_type(shader->paint)) {
263 if (paint_is_degenerate(shader->paint))
268 if (shader->drawing_image) {
269 switch(shader->image_mode) {
284 if (shader->color_transform)
287 if (blend_use_shader(shader)) {
288 if (shader->drawing_image && shader->image_mode == VG_DRAW_IMAGE_STENCIL)
331 if (shader->drawing_image && shader->image_mode == VG_DRAW_IMAGE_STENCIL)
335 if (shader->masking)
341 shader->fs = shaders_cache_fill(ctx->sc, shader_id);
345 void shader_bind(struct shader *shader)
347 struct vg_context *ctx = shader->context;
353 paint_resolve_type(shader->paint);
355 num_samplers = setup_samplers(shader, samplers, sampler_views);
356 param_bytes = setup_constant_buffer(shader);
357 setup_shader_program(shader);
362 &shader->modelview,
363 shader->fs, (const void *) shader->constants, param_bytes);
366 void shader_set_image_mode(struct shader *shader, VGImageMode image_mode)
368 shader->image_mode = image_mode;
371 VGImageMode shader_image_mode(struct shader *shader)
373 return shader->image_mode;
376 void shader_set_drawing_image(struct shader *shader, VGboolean drawing_image)
378 shader->drawing_image = drawing_image;
381 VGboolean shader_drawing_image(struct shader *shader)
383 return shader->drawing_image;
386 void shader_set_image(struct shader *shader, struct vg_image *img)
388 shader->image = img;
394 void shader_set_surface_matrix(struct shader *shader,
397 shader->modelview = *mat;
403 void shader_set_paint_matrix(struct shader *shader, const struct matrix *mat)
405 const struct st_framebuffer *stfb = shader->context->draw_buffer;
408 memcpy(&shader->paint_matrix, mat, sizeof(*mat));
411 matrix_translate(&shader->paint_matrix, px_center_offset,
413 matrix_scale(&shader->paint_matrix, 1.0f, -1.0f);