summaryrefslogtreecommitdiff
path: root/src/gallium/state_trackers/vega/api_filters.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/state_trackers/vega/api_filters.c')
-rw-r--r--src/gallium/state_trackers/vega/api_filters.c705
1 files changed, 0 insertions, 705 deletions
diff --git a/src/gallium/state_trackers/vega/api_filters.c b/src/gallium/state_trackers/vega/api_filters.c
deleted file mode 100644
index 480ced16c51..00000000000
--- a/src/gallium/state_trackers/vega/api_filters.c
+++ /dev/null
@@ -1,705 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "VG/openvg.h"
-
-#include "vg_context.h"
-#include "image.h"
-#include "api.h"
-#include "handle.h"
-#include "renderer.h"
-#include "shaders_cache.h"
-
-#include "pipe/p_context.h"
-#include "pipe/p_state.h"
-#include "util/u_inlines.h"
-#include "pipe/p_screen.h"
-
-#include "util/u_format.h"
-#include "util/u_sampler.h"
-#include "util/u_string.h"
-
-#include "asm_filters.h"
-
-
-struct filter_info {
- struct vg_image *dst;
- struct vg_image *src;
- struct vg_shader * (*setup_shader)(struct vg_context *, void *);
- void *user_data;
- const void *const_buffer;
- VGint const_buffer_len;
- VGTilingMode tiling_mode;
- struct pipe_sampler_view *extra_texture_view;
-};
-
-static INLINE struct pipe_resource *create_texture_1d(struct vg_context *ctx,
- const VGuint *color_data,
- const VGint color_data_len)
-{
- struct pipe_context *pipe = ctx->pipe;
- struct pipe_screen *screen = pipe->screen;
- struct pipe_resource *tex = 0;
- struct pipe_resource templ;
-
- memset(&templ, 0, sizeof(templ));
- templ.target = PIPE_TEXTURE_1D;
- templ.format = PIPE_FORMAT_B8G8R8A8_UNORM;
- templ.last_level = 0;
- templ.width0 = color_data_len;
- templ.height0 = 1;
- templ.depth0 = 1;
- templ.array_size = 1;
- templ.bind = PIPE_BIND_SAMPLER_VIEW;
-
- tex = screen->resource_create(screen, &templ);
-
- { /* upload color_data */
- struct pipe_transfer *transfer;
- void *map =
- pipe_transfer_map(pipe, tex,
- 0, 0,
- PIPE_TRANSFER_READ_WRITE ,
- 0, 0, tex->width0, tex->height0,
- &transfer);
- memcpy(map, color_data, sizeof(VGint)*color_data_len);
- pipe->transfer_unmap(pipe, transfer);
- }
-
- return tex;
-}
-
-static INLINE struct pipe_sampler_view *create_texture_1d_view(struct vg_context *ctx,
- const VGuint *color_data,
- const VGint color_data_len)
-{
- struct pipe_context *pipe = ctx->pipe;
- struct pipe_resource *texture;
- struct pipe_sampler_view view_templ;
- struct pipe_sampler_view *view;
-
- texture = create_texture_1d(ctx, color_data, color_data_len);
-
- if (!texture)
- return NULL;
-
- u_sampler_view_default_template(&view_templ, texture, texture->format);
- view = pipe->create_sampler_view(pipe, texture, &view_templ);
- /* want the texture to go away if the view is freed */
- pipe_resource_reference(&texture, NULL);
-
- return view;
-}
-
-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;
-}
-
-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 struct vg_shader * setup_lookup(struct vg_context *ctx, void *user_data)
-{
- struct vg_shader *shader =
- shader_create_from_text(ctx->pipe, lookup_asm,
- 200, PIPE_SHADER_FRAGMENT);
-
- return shader;
-}
-
-
-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 void execute_filter(struct vg_context *ctx,
- struct filter_info *info)
-{
- struct vg_shader *shader;
- const struct pipe_sampler_state *samplers[2];
- struct pipe_sampler_view *views[2];
- struct pipe_sampler_state sampler;
- uint tex_wrap;
-
- memset(&sampler, 0, sizeof(sampler));
- sampler.min_img_filter = PIPE_TEX_FILTER_LINEAR;
- sampler.mag_img_filter = PIPE_TEX_FILTER_LINEAR;
- sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
- sampler.normalized_coords = 1;
-
- switch (info->tiling_mode) {
- case VG_TILE_FILL:
- tex_wrap = PIPE_TEX_WRAP_CLAMP_TO_BORDER;
- /* copy border color */
- memcpy(sampler.border_color.f, ctx->state.vg.tile_fill_color,
- sizeof(sampler.border_color));
- break;
- case VG_TILE_PAD:
- tex_wrap = PIPE_TEX_WRAP_CLAMP_TO_EDGE;;
- break;
- case VG_TILE_REPEAT:
- tex_wrap = PIPE_TEX_WRAP_REPEAT;;
- break;
- case VG_TILE_REFLECT:
- tex_wrap = PIPE_TEX_WRAP_MIRROR_REPEAT;
- break;
- default:
- debug_assert(!"Unknown tiling mode");
- tex_wrap = 0;
- break;
- }
-
- sampler.wrap_s = tex_wrap;
- sampler.wrap_t = tex_wrap;
- sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
-
- samplers[0] = samplers[1] = &sampler;
- views[0] = info->src->sampler_view;
- views[1] = info->extra_texture_view;
-
- shader = info->setup_shader(ctx, info->user_data);
-
- if (renderer_filter_begin(ctx->renderer,
- info->dst->sampler_view->texture, VG_TRUE,
- ctx->state.vg.filter_channel_mask,
- samplers, views, (info->extra_texture_view) ? 2 : 1,
- shader->driver, info->const_buffer, info->const_buffer_len)) {
- renderer_filter(ctx->renderer,
- info->dst->x, info->dst->y, info->dst->width, info->dst->height,
- info->src->x, info->src->y, info->src->width, info->src->height);
- renderer_filter_end(ctx->renderer);
- }
-
- vg_shader_destroy(ctx, shader);
-}
-
-void vegaColorMatrix(VGImage dst, VGImage src,
- const VGfloat * matrix)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *d, *s;
- struct filter_info info;
-
- if (dst == VG_INVALID_HANDLE || src == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (!matrix || !is_aligned(matrix)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- d = handle_to_image(dst);
- s = handle_to_image(src);
-
- if (vg_image_overlaps(d, s)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- info.dst = d;
- info.src = s;
- info.setup_shader = &setup_color_matrix;
- info.user_data = NULL;
- info.const_buffer = matrix;
- info.const_buffer_len = 20 * sizeof(VGfloat);
- info.tiling_mode = VG_TILE_PAD;
- info.extra_texture_view = NULL;
- execute_filter(ctx, &info);
-}
-
-static VGfloat texture_offset(VGfloat width, VGint kernelSize, VGint current, VGint shift)
-{
- VGfloat diff = (VGfloat) (current - shift);
-
- return diff / width;
-}
-
-void vegaConvolve(VGImage dst, VGImage src,
- VGint kernelWidth, VGint kernelHeight,
- VGint shiftX, VGint shiftY,
- const VGshort * kernel,
- VGfloat scale,
- VGfloat bias,
- VGTilingMode tilingMode)
-{
- struct vg_context *ctx = vg_current_context();
- VGfloat *buffer;
- VGint buffer_len;
- VGint i, j;
- VGint idx = 0;
- struct vg_image *d, *s;
- VGint kernel_size = kernelWidth * kernelHeight;
- struct filter_info info;
- const VGint max_kernel_size = vegaGeti(VG_MAX_KERNEL_SIZE);
-
- if (dst == VG_INVALID_HANDLE || src == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (kernelWidth <= 0 || kernelHeight <= 0 ||
- kernelWidth > max_kernel_size || kernelHeight > max_kernel_size) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (!kernel || !is_aligned_to(kernel, 2)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (tilingMode < VG_TILE_FILL ||
- tilingMode > VG_TILE_REFLECT) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- d = handle_to_image(dst);
- s = handle_to_image(src);
-
- if (vg_image_overlaps(d, s)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- vg_validate_state(ctx);
-
- buffer_len = 8 + 2 * 4 * kernel_size;
- buffer = malloc(buffer_len * sizeof(VGfloat));
-
- buffer[0] = 0.f;
- buffer[1] = 1.f;
- buffer[2] = 2.f; /*unused*/
- buffer[3] = 4.f; /*unused*/
-
- buffer[4] = (VGfloat) (kernelWidth * kernelHeight);
- buffer[5] = scale;
- buffer[6] = bias;
- buffer[7] = 0.f;
-
- idx = 8;
- for (j = 0; j < kernelHeight; ++j) {
- for (i = 0; i < kernelWidth; ++i) {
- VGint index = j * kernelWidth + i;
- VGfloat x, y;
-
- x = (VGfloat) texture_offset(s->width, kernelWidth, i, shiftX);
- y = (VGfloat) texture_offset(s->height, kernelHeight, j, shiftY);
-
- buffer[idx + index*4 + 0] = x;
- buffer[idx + index*4 + 1] = y;
- buffer[idx + index*4 + 2] = 0.f;
- buffer[idx + index*4 + 3] = 0.f;
- }
- }
- idx += kernel_size * 4;
-
- for (j = 0; j < kernelHeight; ++j) {
- for (i = 0; i < kernelWidth; ++i) {
- /* transpose the kernel */
- VGint index = j * kernelWidth + i;
- VGint kindex = (kernelWidth - i - 1) * kernelHeight + (kernelHeight - j - 1);
- buffer[idx + index*4 + 0] = kernel[kindex];
- buffer[idx + index*4 + 1] = kernel[kindex];
- buffer[idx + index*4 + 2] = kernel[kindex];
- buffer[idx + index*4 + 3] = kernel[kindex];
- }
- }
-
- info.dst = d;
- info.src = s;
- info.setup_shader = &setup_convolution;
- info.user_data = (void*)(long)(buffer_len/4);
- info.const_buffer = buffer;
- info.const_buffer_len = buffer_len * sizeof(VGfloat);
- info.tiling_mode = tilingMode;
- info.extra_texture_view = NULL;
- execute_filter(ctx, &info);
-
- free(buffer);
-}
-
-void vegaSeparableConvolve(VGImage dst, VGImage src,
- VGint kernelWidth,
- VGint kernelHeight,
- VGint shiftX, VGint shiftY,
- const VGshort * kernelX,
- const VGshort * kernelY,
- VGfloat scale,
- VGfloat bias,
- VGTilingMode tilingMode)
-{
- struct vg_context *ctx = vg_current_context();
- VGshort *kernel;
- VGint i, j, idx = 0;
- const VGint max_kernel_size = vegaGeti(VG_MAX_SEPARABLE_KERNEL_SIZE);
-
- if (dst == VG_INVALID_HANDLE || src == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (kernelWidth <= 0 || kernelHeight <= 0 ||
- kernelWidth > max_kernel_size || kernelHeight > max_kernel_size) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (!kernelX || !kernelY ||
- !is_aligned_to(kernelX, 2) || !is_aligned_to(kernelY, 2)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if (tilingMode < VG_TILE_FILL ||
- tilingMode > VG_TILE_REFLECT) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- kernel = malloc(sizeof(VGshort)*kernelWidth*kernelHeight);
- for (i = 0; i < kernelWidth; ++i) {
- for (j = 0; j < kernelHeight; ++j) {
- kernel[idx] = kernelX[i] * kernelY[j];
- ++idx;
- }
- }
- vegaConvolve(dst, src, kernelWidth, kernelHeight, shiftX, shiftY,
- kernel, scale, bias, tilingMode);
- free(kernel);
-}
-
-static INLINE VGfloat compute_gaussian_componenet(VGfloat x, VGfloat y,
- VGfloat stdDeviationX,
- VGfloat stdDeviationY)
-{
- VGfloat mult = 1 / ( 2 * M_PI * stdDeviationX * stdDeviationY);
- VGfloat e = exp( - ( pow(x, 2)/(2*pow(stdDeviationX, 2)) +
- pow(y, 2)/(2*pow(stdDeviationY, 2)) ) );
- return mult * e;
-}
-
-static INLINE VGint compute_kernel_size(VGfloat deviation)
-{
- VGint size = ceil(2.146 * deviation);
- if (size > 11)
- return 11;
- return size;
-}
-
-static void compute_gaussian_kernel(VGfloat *kernel,
- VGint width, VGint height,
- VGfloat stdDeviationX,
- VGfloat stdDeviationY)
-{
- VGint i, j;
- VGfloat scale = 0.0f;
-
- for (j = 0; j < height; ++j) {
- for (i = 0; i < width; ++i) {
- VGint idx = (height - j -1) * width + (width - i -1);
- kernel[idx] = compute_gaussian_componenet(i-(ceil(width/2))-1,
- j-ceil(height/2)-1,
- stdDeviationX, stdDeviationY);
- scale += kernel[idx];
- }
- }
-
- for (j = 0; j < height; ++j) {
- for (i = 0; i < width; ++i) {
- VGint idx = j * width + i;
- kernel[idx] /= scale;
- }
- }
-}
-
-void vegaGaussianBlur(VGImage dst, VGImage src,
- VGfloat stdDeviationX,
- VGfloat stdDeviationY,
- VGTilingMode tilingMode)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *d, *s;
- VGfloat *buffer, *kernel;
- VGint kernel_width, kernel_height, kernel_size;
- VGint buffer_len;
- VGint idx, i, j;
- struct filter_info info;
-
- if (dst == VG_INVALID_HANDLE || src == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (stdDeviationX <= 0 || stdDeviationY <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (tilingMode < VG_TILE_FILL ||
- tilingMode > VG_TILE_REFLECT) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- d = handle_to_image(dst);
- s = handle_to_image(src);
-
- if (vg_image_overlaps(d, s)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- kernel_width = compute_kernel_size(stdDeviationX);
- kernel_height = compute_kernel_size(stdDeviationY);
- kernel_size = kernel_width * kernel_height;
- kernel = malloc(sizeof(VGfloat)*kernel_size);
- compute_gaussian_kernel(kernel, kernel_width, kernel_height,
- stdDeviationX, stdDeviationY);
-
- buffer_len = 8 + 2 * 4 * kernel_size;
- buffer = malloc(buffer_len * sizeof(VGfloat));
-
- buffer[0] = 0.f;
- buffer[1] = 1.f;
- buffer[2] = 2.f; /*unused*/
- buffer[3] = 4.f; /*unused*/
-
- buffer[4] = kernel_width * kernel_height;
- buffer[5] = 1.f;/*scale*/
- buffer[6] = 0.f;/*bias*/
- buffer[7] = 0.f;
-
- idx = 8;
- for (j = 0; j < kernel_height; ++j) {
- for (i = 0; i < kernel_width; ++i) {
- VGint index = j * kernel_width + i;
- VGfloat x, y;
-
- x = texture_offset(s->width, kernel_width, i, kernel_width/2);
- y = texture_offset(s->height, kernel_height, j, kernel_height/2);
-
- buffer[idx + index*4 + 0] = x;
- buffer[idx + index*4 + 1] = y;
- buffer[idx + index*4 + 2] = 0.f;
- buffer[idx + index*4 + 3] = 0.f;
- }
- }
- idx += kernel_size * 4;
-
- for (j = 0; j < kernel_height; ++j) {
- for (i = 0; i < kernel_width; ++i) {
- /* transpose the kernel */
- VGint index = j * kernel_width + i;
- VGint kindex = (kernel_width - i - 1) * kernel_height + (kernel_height - j - 1);
- buffer[idx + index*4 + 0] = kernel[kindex];
- buffer[idx + index*4 + 1] = kernel[kindex];
- buffer[idx + index*4 + 2] = kernel[kindex];
- buffer[idx + index*4 + 3] = kernel[kindex];
- }
- }
-
- info.dst = d;
- info.src = s;
- info.setup_shader = &setup_convolution;
- info.user_data = (void*)(long)(buffer_len/4);
- info.const_buffer = buffer;
- info.const_buffer_len = buffer_len * sizeof(VGfloat);
- info.tiling_mode = tilingMode;
- info.extra_texture_view = NULL;
- execute_filter(ctx, &info);
-
- free(buffer);
- free(kernel);
-}
-
-void vegaLookup(VGImage dst, VGImage src,
- const VGubyte * redLUT,
- const VGubyte * greenLUT,
- const VGubyte * blueLUT,
- const VGubyte * alphaLUT,
- VGboolean outputLinear,
- VGboolean outputPremultiplied)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *d, *s;
- VGuint color_data[256];
- VGint i;
- struct pipe_sampler_view *lut_texture_view;
- VGfloat buffer[4];
- struct filter_info info;
-
- if (dst == VG_INVALID_HANDLE || src == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (!redLUT || !greenLUT || !blueLUT || !alphaLUT) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- d = handle_to_image(dst);
- s = handle_to_image(src);
-
- if (vg_image_overlaps(d, s)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- for (i = 0; i < 256; ++i) {
- color_data[i] = blueLUT[i] << 24 | greenLUT[i] << 16 |
- redLUT[i] << 8 | alphaLUT[i];
- }
- lut_texture_view = create_texture_1d_view(ctx, color_data, 255);
-
- buffer[0] = 0.f;
- buffer[1] = 0.f;
- buffer[2] = 1.f;
- buffer[3] = 1.f;
-
- info.dst = d;
- info.src = s;
- info.setup_shader = &setup_lookup;
- info.user_data = NULL;
- info.const_buffer = buffer;
- info.const_buffer_len = 4 * sizeof(VGfloat);
- info.tiling_mode = VG_TILE_PAD;
- info.extra_texture_view = lut_texture_view;
-
- execute_filter(ctx, &info);
-
- pipe_sampler_view_reference(&lut_texture_view, NULL);
-}
-
-void vegaLookupSingle(VGImage dst, VGImage src,
- const VGuint * lookupTable,
- VGImageChannel sourceChannel,
- VGboolean outputLinear,
- VGboolean outputPremultiplied)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *d, *s;
- struct pipe_sampler_view *lut_texture_view;
- VGfloat buffer[4];
- struct filter_info info;
- VGuint color_data[256];
- VGint i;
-
- if (dst == VG_INVALID_HANDLE || src == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (!lookupTable || !is_aligned(lookupTable)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (sourceChannel != VG_RED && sourceChannel != VG_GREEN &&
- sourceChannel != VG_BLUE && sourceChannel != VG_ALPHA) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- d = handle_to_image(dst);
- s = handle_to_image(src);
-
- if (vg_image_overlaps(d, s)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- vg_validate_state(ctx);
-
- for (i = 0; i < 256; ++i) {
- VGuint rgba = lookupTable[i];
- VGubyte blue, green, red, alpha;
- red = (rgba & 0xff000000)>>24;
- green = (rgba & 0x00ff0000)>>16;
- blue = (rgba & 0x0000ff00)>> 8;
- alpha = (rgba & 0x000000ff)>> 0;
- color_data[i] = blue << 24 | green << 16 |
- red << 8 | alpha;
- }
- lut_texture_view = create_texture_1d_view(ctx, color_data, 256);
-
- buffer[0] = 0.f;
- buffer[1] = 0.f;
- buffer[2] = 1.f;
- buffer[3] = 1.f;
-
- info.dst = d;
- info.src = s;
- info.setup_shader = &setup_lookup_single;
- info.user_data = (void*)sourceChannel;
- info.const_buffer = buffer;
- info.const_buffer_len = 4 * sizeof(VGfloat);
- info.tiling_mode = VG_TILE_PAD;
- info.extra_texture_view = lut_texture_view;
-
- execute_filter(ctx, &info);
-
- pipe_sampler_view_reference(&lut_texture_view, NULL);
-}