diff --git a/packages/graphics/Mesa/package.mk b/packages/graphics/Mesa/package.mk index 5d1710a6e2..a58e097aea 100644 --- a/packages/graphics/Mesa/package.mk +++ b/packages/graphics/Mesa/package.mk @@ -17,12 +17,13 @@ ################################################################################ PKG_NAME="Mesa" -PKG_VERSION="10.1.3" +PKG_VERSION="10.2.0-rc2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="OSS" PKG_SITE="http://www.mesa3d.org/" -PKG_URL="ftp://freedesktop.org/pub/mesa/$PKG_VERSION/MesaLib-$PKG_VERSION.tar.bz2" +# PKG_URL="ftp://freedesktop.org/pub/mesa/$PKG_VERSION/MesaLib-$PKG_VERSION.tar.bz2" +PKG_URL="ftp://freedesktop.org/pub/mesa/10.2/MesaLib-$PKG_VERSION.tar.bz2" PKG_DEPENDS_TARGET="toolchain Python:host makedepend:host libxml2:host expat glproto dri2proto presentproto libdrm libXext libXdamage libXfixes libXxf86vm libxcb libX11 systemd dri3proto libxshmfence" PKG_PRIORITY="optional" PKG_SECTION="graphics" diff --git a/packages/graphics/Mesa/patches/Mesa-02-motion_adaptive_deinterlacer-v8.patch b/packages/graphics/Mesa/patches/Mesa-02-motion_adaptive_deinterlacer-v8.patch deleted file mode 100644 index 195b089b75..0000000000 --- a/packages/graphics/Mesa/patches/Mesa-02-motion_adaptive_deinterlacer-v8.patch +++ /dev/null @@ -1,828 +0,0 @@ -From 08155442aba570a9d2d351795c86fdea466d806d Mon Sep 17 00:00:00 2001 -From: Grigori Goronzy -Date: Sat, 2 Nov 2013 21:54:01 +0100 -Subject: [PATCH] WIP: st/vl, st/vdpau: motion adaptive deinterlacer - -v2: make it actually work -v3: fix motion detection, simplify -v4: use correct (field) semantics for past/future, - use 4-frame motion detection -v5: cleanup, move dest surface handling into filter -v6: implement skip_chroma -v7: tweak motion detection, further cleanup -v8: fix tgsi code, unbreaks with llvm ---- - src/gallium/auxiliary/Makefile.sources | 3 +- - src/gallium/auxiliary/vl/vl_deint_filter.c | 494 +++++++++++++++++++++++ - src/gallium/auxiliary/vl/vl_deint_filter.h | 78 ++++ - src/gallium/state_trackers/vdpau/mixer.c | 69 +++- - src/gallium/state_trackers/vdpau/query.c | 1 + - src/gallium/state_trackers/vdpau/vdpau_private.h | 7 + - 6 files changed, 647 insertions(+), 5 deletions(-) - create mode 100644 src/gallium/auxiliary/vl/vl_deint_filter.c - create mode 100644 src/gallium/auxiliary/vl/vl_deint_filter.h - -diff --git a/src/gallium/auxiliary/Makefile.sources b/src/gallium/auxiliary/Makefile.sources -index c89cbdd..19004e0 100644 ---- a/src/gallium/auxiliary/Makefile.sources -+++ b/src/gallium/auxiliary/Makefile.sources -@@ -155,7 +155,8 @@ C_SOURCES := \ - vl/vl_idct.c \ - vl/vl_mc.c \ - vl/vl_vertex_buffers.c \ -- vl/vl_video_buffer.c -+ vl/vl_video_buffer.c \ -+ vl/vl_deint_filter.c - - GENERATED_SOURCES := \ - indices/u_indices_gen.c \ -diff --git a/src/gallium/auxiliary/vl/vl_deint_filter.c b/src/gallium/auxiliary/vl/vl_deint_filter.c -new file mode 100644 -index 0000000..3b3cc6d ---- /dev/null -+++ b/src/gallium/auxiliary/vl/vl_deint_filter.c -@@ -0,0 +1,494 @@ -+/************************************************************************** -+ * -+ * Copyright 2013 Grigori Goronzy . -+ * 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 TUNGSTEN GRAPHICS 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. -+ * -+ **************************************************************************/ -+ -+/* -+ * References: -+ * -+ * Lin, S. F., Chang, Y. L., & Chen, L. G. (2003). -+ * Motion adaptive interpolation with horizontal motion detection for deinterlacing. -+ * Consumer Electronics, IEEE Transactions on, 49(4), 1256-1265. -+ * -+ * Pei-Yin, C. H. E. N., & Yao-Hsien, L. A. I. (2007). -+ * A low-complexity interpolation method for deinterlacing. -+ * IEICE transactions on information and systems, 90(2), 606-608. -+ * -+ */ -+ -+#include -+ -+#include "pipe/p_context.h" -+ -+#include "tgsi/tgsi_ureg.h" -+ -+#include "util/u_draw.h" -+#include "util/u_memory.h" -+#include "util/u_math.h" -+ -+#include "vl_types.h" -+#include "vl_video_buffer.h" -+#include "vl_vertex_buffers.h" -+#include "vl_deint_filter.h" -+ -+enum VS_OUTPUT -+{ -+ VS_O_VPOS = 0, -+ VS_O_VTEX = 0 -+}; -+ -+static void * -+create_vert_shader(struct vl_deint_filter *filter) -+{ -+ struct ureg_program *shader; -+ struct ureg_src i_vpos; -+ struct ureg_dst o_vpos, o_vtex; -+ -+ shader = ureg_create(TGSI_PROCESSOR_VERTEX); -+ if (!shader) -+ return NULL; -+ -+ i_vpos = ureg_DECL_vs_input(shader, 0); -+ o_vpos = ureg_DECL_output(shader, TGSI_SEMANTIC_POSITION, VS_O_VPOS); -+ o_vtex = ureg_DECL_output(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX); -+ -+ ureg_MOV(shader, o_vpos, i_vpos); -+ ureg_MOV(shader, o_vtex, i_vpos); -+ -+ ureg_END(shader); -+ -+ return ureg_create_shader_and_destroy(shader, filter->pipe); -+} -+ -+static void * -+create_copy_frag_shader(struct vl_deint_filter *filter, unsigned field) -+{ -+ struct ureg_program *shader; -+ struct ureg_src i_vtex; -+ struct ureg_src sampler; -+ struct ureg_dst o_fragment; -+ struct ureg_dst t_tex; -+ -+ shader = ureg_create(TGSI_PROCESSOR_FRAGMENT); -+ if (!shader) { -+ return NULL; -+ } -+ t_tex = ureg_DECL_temporary(shader); -+ -+ i_vtex = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX, TGSI_INTERPOLATE_LINEAR); -+ sampler = ureg_DECL_sampler(shader, 2); -+ o_fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0); -+ -+ ureg_MOV(shader, t_tex, i_vtex); -+ if (field) { -+ ureg_MOV(shader, ureg_writemask(t_tex, TGSI_WRITEMASK_ZW), -+ ureg_imm4f(shader, 0, 0, 1.0f, 0)); -+ } else { -+ ureg_MOV(shader, ureg_writemask(t_tex, TGSI_WRITEMASK_ZW), -+ ureg_imm1f(shader, 0)); -+ } -+ -+ ureg_TEX(shader, o_fragment, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_tex), sampler); -+ -+ ureg_release_temporary(shader, t_tex); -+ ureg_END(shader); -+ -+ return ureg_create_shader_and_destroy(shader, filter->pipe); -+} -+ -+static void * -+create_deint_frag_shader(struct vl_deint_filter *filter, unsigned field, -+ struct vertex2f *sizes, bool spatial_filter) -+{ -+ struct ureg_program *shader; -+ struct ureg_src i_vtex; -+ struct ureg_src sampler_cur; -+ struct ureg_src sampler_prevprev; -+ struct ureg_src sampler_prev; -+ struct ureg_src sampler_next; -+ struct ureg_dst o_fragment; -+ struct ureg_dst t_tex; -+ struct ureg_dst t_comp_top, t_comp_bot; -+ struct ureg_dst t_diff; -+ struct ureg_dst t_a, t_b; -+ struct ureg_dst t_weave, t_linear; -+ -+ shader = ureg_create(TGSI_PROCESSOR_FRAGMENT); -+ if (!shader) { -+ return NULL; -+ } -+ -+ t_tex = ureg_DECL_temporary(shader); -+ t_comp_top = ureg_DECL_temporary(shader); -+ t_comp_bot = ureg_DECL_temporary(shader); -+ t_diff = ureg_DECL_temporary(shader); -+ t_a = ureg_DECL_temporary(shader); -+ t_b = ureg_DECL_temporary(shader); -+ t_weave = ureg_DECL_temporary(shader); -+ t_linear = ureg_DECL_temporary(shader); -+ -+ i_vtex = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX, TGSI_INTERPOLATE_LINEAR); -+ sampler_prevprev = ureg_DECL_sampler(shader, 0); -+ sampler_prev = ureg_DECL_sampler(shader, 1); -+ sampler_cur = ureg_DECL_sampler(shader, 2); -+ sampler_next = ureg_DECL_sampler(shader, 3); -+ o_fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0); -+ -+ // we don't care about ZW interpolation (allows better optimization) -+ ureg_MOV(shader, t_tex, i_vtex); -+ ureg_MOV(shader, ureg_writemask(t_tex, TGSI_WRITEMASK_ZW), -+ ureg_imm1f(shader, 0)); -+ -+ // sample between texels for cheap lowpass -+ ureg_ADD(shader, t_comp_top, ureg_src(t_tex), -+ ureg_imm4f(shader, sizes->x * 0.5f, sizes->y * -0.5f, 0, 0)); -+ ureg_ADD(shader, t_comp_bot, ureg_src(t_tex), -+ ureg_imm4f(shader, sizes->x * -0.5f, sizes->y * 0.5f, 1.0f, 0)); -+ -+ if (field == 0) { -+ /* interpolating top field -> current field is a bottom field */ -+ // cur vs prev2 -+ ureg_TEX(shader, t_a, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_bot), sampler_cur); -+ ureg_TEX(shader, t_b, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_bot), sampler_prevprev); -+ ureg_SUB(shader, ureg_writemask(t_diff, TGSI_WRITEMASK_X), ureg_src(t_a), ureg_src(t_b)); -+ // prev vs next -+ ureg_TEX(shader, t_a, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_top), sampler_prev); -+ ureg_TEX(shader, t_b, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_top), sampler_next); -+ ureg_SUB(shader, ureg_writemask(t_diff, TGSI_WRITEMASK_Y), ureg_src(t_a), ureg_src(t_b)); -+ } else { -+ /* interpolating bottom field -> current field is a top field */ -+ // cur vs prev2 -+ ureg_TEX(shader, t_a, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_top), sampler_cur); -+ ureg_TEX(shader, t_b, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_top), sampler_prevprev); -+ ureg_SUB(shader, ureg_writemask(t_diff, TGSI_WRITEMASK_X), ureg_src(t_a), ureg_src(t_b)); -+ // prev vs next -+ ureg_TEX(shader, t_a, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_bot), sampler_prev); -+ ureg_TEX(shader, t_b, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_bot), sampler_next); -+ ureg_SUB(shader, ureg_writemask(t_diff, TGSI_WRITEMASK_Y), ureg_src(t_a), ureg_src(t_b)); -+ } -+ -+ // absolute maximum of differences -+ ureg_MAX(shader, ureg_writemask(t_diff, TGSI_WRITEMASK_X), ureg_abs(ureg_src(t_diff)), -+ ureg_scalar(ureg_abs(ureg_src(t_diff)), TGSI_SWIZZLE_Y)); -+ -+ if (field == 0) { -+ /* weave with prev top field */ -+ ureg_TEX(shader, t_weave, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_tex), sampler_prev); -+ /* get linear interpolation from current bottom field */ -+ ureg_ADD(shader, t_comp_top, ureg_src(t_tex), ureg_imm4f(shader, 0, sizes->y * -1.0f, 1.0f, 0)); -+ ureg_TEX(shader, t_linear, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_top), sampler_cur); -+ } else { -+ /* weave with prev bottom field */ -+ ureg_ADD(shader, t_comp_bot, ureg_src(t_tex), ureg_imm4f(shader, 0, 0, 1.0f, 0)); -+ ureg_TEX(shader, t_weave, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_bot), sampler_prev); -+ /* get linear interpolation from current top field */ -+ ureg_ADD(shader, t_comp_bot, ureg_src(t_tex), ureg_imm4f(shader, 0, sizes->y * 1.0f, 0, 0)); -+ ureg_TEX(shader, t_linear, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_bot), sampler_cur); -+ } -+ -+ // mix between weave and linear -+ // fully weave if diff < 6 (0.02353), fully interpolate if diff > 14 (0.05490) -+ ureg_ADD(shader, ureg_writemask(t_diff, TGSI_WRITEMASK_X), ureg_src(t_diff), -+ ureg_imm4f(shader, -0.02353f, 0, 0, 0)); -+ ureg_MUL(shader, ureg_saturate(ureg_writemask(t_diff, TGSI_WRITEMASK_X)), -+ ureg_src(t_diff), ureg_imm4f(shader, 31.8750f, 0, 0, 0)); -+ ureg_LRP(shader, ureg_writemask(o_fragment, TGSI_WRITEMASK_X), ureg_src(t_diff), -+ ureg_src(t_linear), ureg_src(t_weave)); -+ -+ ureg_release_temporary(shader, t_tex); -+ ureg_release_temporary(shader, t_comp_top); -+ ureg_release_temporary(shader, t_comp_bot); -+ ureg_release_temporary(shader, t_diff); -+ ureg_release_temporary(shader, t_a); -+ ureg_release_temporary(shader, t_b); -+ ureg_release_temporary(shader, t_weave); -+ ureg_release_temporary(shader, t_linear); -+ ureg_END(shader); -+ -+ return ureg_create_shader_and_destroy(shader, filter->pipe); -+} -+ -+bool -+vl_deint_filter_init(struct vl_deint_filter *filter, struct pipe_context *pipe, -+ unsigned video_width, unsigned video_height, -+ bool skip_chroma, bool spatial_filter) -+{ -+ struct pipe_rasterizer_state rs_state; -+ struct pipe_blend_state blend; -+ struct pipe_sampler_state sampler; -+ struct pipe_vertex_element ve; -+ struct vertex2f sizes; -+ struct pipe_video_buffer templ; -+ -+ assert(filter && pipe); -+ assert(video_width && video_height); -+ -+ memset(filter, 0, sizeof(*filter)); -+ filter->pipe = pipe; -+ filter->skip_chroma = skip_chroma; -+ filter->video_width = video_width; -+ filter->video_height = video_height; -+ -+ /* TODO: handle other than 4:2:0 subsampling */ -+ memset(&templ, 0, sizeof(templ)); -+ templ.buffer_format = PIPE_FORMAT_YV12; -+ templ.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420; -+ templ.width = video_width; -+ templ.height = video_height; -+ templ.interlaced = true; -+ filter->video_buffer = vl_video_buffer_create(pipe, &templ); -+ if (!filter->video_buffer) -+ goto error_video_buffer; -+ -+ memset(&rs_state, 0, sizeof(rs_state)); -+ rs_state.half_pixel_center = true; -+ rs_state.bottom_edge_rule = true; -+ rs_state.depth_clip = 1; -+ filter->rs_state = pipe->create_rasterizer_state(pipe, &rs_state); -+ if (!filter->rs_state) -+ goto error_rs_state; -+ -+ memset(&blend, 0, sizeof blend); -+ blend.rt[0].colormask = PIPE_MASK_RGBA; -+ filter->blend = pipe->create_blend_state(pipe, &blend); -+ if (!filter->blend) -+ goto error_blend; -+ -+ memset(&sampler, 0, sizeof(sampler)); -+ sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; -+ sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; -+ sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; -+ sampler.min_img_filter = PIPE_TEX_FILTER_LINEAR; -+ sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; -+ sampler.mag_img_filter = PIPE_TEX_FILTER_LINEAR; -+ sampler.normalized_coords = 1; -+ filter->sampler[0] = pipe->create_sampler_state(pipe, &sampler); -+ filter->sampler[1] = filter->sampler[2] = filter->sampler[3] = filter->sampler[0]; -+ if (!filter->sampler[0]) -+ goto error_sampler; -+ -+ filter->quad = vl_vb_upload_quads(pipe); -+ if(!filter->quad.buffer) -+ goto error_quad; -+ -+ memset(&ve, 0, sizeof(ve)); -+ ve.src_offset = 0; -+ ve.instance_divisor = 0; -+ ve.vertex_buffer_index = 0; -+ ve.src_format = PIPE_FORMAT_R32G32_FLOAT; -+ filter->ves = pipe->create_vertex_elements_state(pipe, 1, &ve); -+ if (!filter->ves) -+ goto error_ves; -+ -+ sizes.x = 1.0f / video_width; -+ sizes.y = 1.0f / video_height; -+ -+ filter->vs = create_vert_shader(filter); -+ if (!filter->vs) -+ goto error_vs; -+ -+ filter->fs_copy_top = create_copy_frag_shader(filter, 0); -+ if (!filter->fs_copy_top) -+ goto error_fs_copy_top; -+ -+ filter->fs_copy_bottom = create_copy_frag_shader(filter, 1); -+ if (!filter->fs_copy_bottom) -+ goto error_fs_copy_bottom; -+ -+ filter->fs_deint_top = create_deint_frag_shader(filter, 0, &sizes, spatial_filter); -+ if (!filter->fs_deint_top) -+ goto error_fs_deint_top; -+ -+ filter->fs_deint_bottom = create_deint_frag_shader(filter, 1, &sizes, spatial_filter); -+ if (!filter->fs_deint_bottom) -+ goto error_fs_deint_bottom; -+ -+ return true; -+ -+error_fs_deint_bottom: -+ pipe->delete_fs_state(pipe, filter->fs_deint_top); -+ -+error_fs_deint_top: -+ pipe->delete_fs_state(pipe, filter->fs_copy_bottom); -+ -+error_fs_copy_bottom: -+ pipe->delete_fs_state(pipe, filter->fs_copy_top); -+ -+error_fs_copy_top: -+ pipe->delete_vs_state(pipe, filter->vs); -+ -+error_vs: -+ pipe->delete_vertex_elements_state(pipe, filter->ves); -+ -+error_ves: -+ pipe_resource_reference(&filter->quad.buffer, NULL); -+ -+error_quad: -+ pipe->delete_sampler_state(pipe, filter->sampler); -+ -+error_sampler: -+ pipe->delete_blend_state(pipe, filter->blend); -+ -+error_blend: -+ pipe->delete_rasterizer_state(pipe, filter->rs_state); -+ -+error_rs_state: -+ filter->video_buffer->destroy(filter->video_buffer); -+ -+error_video_buffer: -+ return false; -+} -+ -+void -+vl_deint_filter_cleanup(struct vl_deint_filter *filter) -+{ -+ assert(filter); -+ -+ filter->pipe->delete_sampler_state(filter->pipe, filter->sampler[0]); -+ filter->pipe->delete_blend_state(filter->pipe, filter->blend); -+ filter->pipe->delete_rasterizer_state(filter->pipe, filter->rs_state); -+ filter->pipe->delete_vertex_elements_state(filter->pipe, filter->ves); -+ pipe_resource_reference(&filter->quad.buffer, NULL); -+ -+ filter->pipe->delete_vs_state(filter->pipe, filter->vs); -+ filter->pipe->delete_fs_state(filter->pipe, filter->fs_copy_top); -+ filter->pipe->delete_fs_state(filter->pipe, filter->fs_copy_bottom); -+ filter->pipe->delete_fs_state(filter->pipe, filter->fs_deint_top); -+ filter->pipe->delete_fs_state(filter->pipe, filter->fs_deint_bottom); -+ -+ filter->video_buffer->destroy(filter->video_buffer); -+} -+ -+bool -+vl_deint_filter_check_buffers(struct vl_deint_filter *filter, -+ struct pipe_video_buffer *prevprev, -+ struct pipe_video_buffer *prev, -+ struct pipe_video_buffer *cur, -+ struct pipe_video_buffer *next) -+{ -+ int i; -+ struct pipe_video_buffer *bufs[] = { prevprev, prev, cur, next }; -+ -+ for (i = 0; i < 4; i++) { -+ if (bufs[i]->chroma_format != PIPE_VIDEO_CHROMA_FORMAT_420) -+ return false; -+ if (bufs[i]->width < filter->video_width || -+ bufs[i]->height < filter->video_height) -+ return false; -+ if (!bufs[i]->interlaced) -+ return false; -+ } -+ -+ return true; -+} -+ -+void -+vl_deint_filter_render(struct vl_deint_filter *filter, -+ struct pipe_video_buffer *prevprev, -+ struct pipe_video_buffer *prev, -+ struct pipe_video_buffer *cur, -+ struct pipe_video_buffer *next, -+ unsigned field) -+{ -+ struct pipe_viewport_state viewport; -+ struct pipe_framebuffer_state fb_state; -+ struct pipe_sampler_view **cur_sv; -+ struct pipe_sampler_view **prevprev_sv; -+ struct pipe_sampler_view **prev_sv; -+ struct pipe_sampler_view **next_sv; -+ struct pipe_sampler_view *sampler_views[4]; -+ struct pipe_surface **dst_surfaces; -+ int j; -+ -+ assert(filter && prevprev && prev && cur && next && field <= 1); -+ -+ /* set up destination and source */ -+ dst_surfaces = filter->video_buffer->get_surfaces(filter->video_buffer); -+ cur_sv = cur->get_sampler_view_components(cur); -+ prevprev_sv = prevprev->get_sampler_view_components(prevprev); -+ prev_sv = prev->get_sampler_view_components(prev); -+ next_sv = next->get_sampler_view_components(next); -+ -+ /* set up pipe state */ -+ filter->pipe->bind_rasterizer_state(filter->pipe, filter->rs_state); -+ filter->pipe->bind_blend_state(filter->pipe, filter->blend); -+ filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, &filter->quad); -+ filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves); -+ filter->pipe->bind_vs_state(filter->pipe, filter->vs); -+ filter->pipe->bind_sampler_states(filter->pipe, PIPE_SHADER_FRAGMENT, -+ 0, 4, filter->sampler); -+ -+ /* prepare viewport */ -+ memset(&viewport, 0, sizeof(viewport)); -+ viewport.scale[2] = 1; -+ viewport.scale[3] = 1; -+ -+ /* prepare framebuffer */ -+ memset(&fb_state, 0, sizeof(fb_state)); -+ fb_state.nr_cbufs = 1; -+ -+ /* process each plane separately */ -+ for (j = 0; j < 3; j++) { -+ /* select correct YV12 surfaces */ -+ int k = j == 1 ? 2 : -+ j == 2 ? 1 : 0; -+ struct pipe_surface *blit_surf = dst_surfaces[2 * k + field]; -+ struct pipe_surface *dst_surf = dst_surfaces[2 * k + 1 - field]; -+ -+ /* update render target state */ -+ viewport.scale[0] = blit_surf->texture->width0; -+ viewport.scale[1] = blit_surf->texture->height0; -+ fb_state.width = blit_surf->texture->width0; -+ fb_state.height = blit_surf->texture->height0; -+ -+ /* update sampler view sources */ -+ sampler_views[0] = prevprev_sv[j]; -+ sampler_views[1] = prev_sv[j]; -+ sampler_views[2] = cur_sv[j]; -+ sampler_views[3] = next_sv[j]; -+ filter->pipe->set_sampler_views(filter->pipe, PIPE_SHADER_FRAGMENT, 0, 4, sampler_views); -+ -+ /* blit current field */ -+ fb_state.cbufs[0] = blit_surf; -+ filter->pipe->bind_fs_state(filter->pipe, field ? filter->fs_copy_bottom : filter->fs_copy_top); -+ filter->pipe->set_framebuffer_state(filter->pipe, &fb_state); -+ filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport); -+ util_draw_arrays(filter->pipe, PIPE_PRIM_QUADS, 0, 4); -+ -+ fb_state.cbufs[0] = dst_surf; -+ if (j > 0 && filter->skip_chroma) { -+ /* blit other field */ -+ filter->pipe->set_framebuffer_state(filter->pipe, &fb_state); -+ util_draw_arrays(filter->pipe, PIPE_PRIM_QUADS, 0, 4); -+ } else { -+ /* interpolate other field */ -+ filter->pipe->bind_fs_state(filter->pipe, field ? filter->fs_deint_top : filter->fs_deint_bottom); -+ filter->pipe->set_framebuffer_state(filter->pipe, &fb_state); -+ util_draw_arrays(filter->pipe, PIPE_PRIM_QUADS, 0, 4); -+ } -+ -+ } -+} -+ -diff --git a/src/gallium/auxiliary/vl/vl_deint_filter.h b/src/gallium/auxiliary/vl/vl_deint_filter.h -new file mode 100644 -index 0000000..5a21402 ---- /dev/null -+++ b/src/gallium/auxiliary/vl/vl_deint_filter.h -@@ -0,0 +1,78 @@ -+/************************************************************************** -+ * -+ * Copyright 2013 Grigori Goronzy -+ * 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 TUNGSTEN GRAPHICS 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. -+ * -+ **************************************************************************/ -+ -+/* motion adaptive deinterlacer implementation */ -+ -+#ifndef vl_deint_filter_h -+#define vl_deint_filter_h -+ -+#include "pipe/p_state.h" -+ -+struct vl_deint_filter -+{ -+ struct pipe_context *pipe; -+ struct pipe_vertex_buffer quad; -+ -+ void *rs_state; -+ void *blend; -+ void *sampler[4]; -+ void *ves; -+ void *vs; -+ void *fs_copy_top, *fs_copy_bottom; -+ void *fs_deint_top, *fs_deint_bottom; -+ -+ unsigned video_width, video_height; -+ bool skip_chroma; -+ -+ struct pipe_video_buffer *video_buffer; -+}; -+ -+bool -+vl_deint_filter_init(struct vl_deint_filter *filter, struct pipe_context *pipe, -+ unsigned video_width, unsigned video_height, -+ bool skip_chroma, bool spatial_filter); -+ -+void -+vl_deint_filter_cleanup(struct vl_deint_filter *filter); -+ -+bool -+vl_deint_filter_check_buffers(struct vl_deint_filter *filter, -+ struct pipe_video_buffer *prevprev, -+ struct pipe_video_buffer *prev, -+ struct pipe_video_buffer *cur, -+ struct pipe_video_buffer *next); -+ -+void -+vl_deint_filter_render(struct vl_deint_filter *filter, -+ struct pipe_video_buffer *prevprev, -+ struct pipe_video_buffer *prev, -+ struct pipe_video_buffer *cur, -+ struct pipe_video_buffer *next, -+ unsigned field); -+ -+#endif /* vl_deint_filter_h */ -+ -diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c -index f9b413e..74351c6 100644 ---- a/src/gallium/state_trackers/vdpau/mixer.c -+++ b/src/gallium/state_trackers/vdpau/mixer.c -@@ -80,7 +80,6 @@ - for (i = 0; i < feature_count; ++i) { - switch (features[i]) { - /* they are valid, but we doesn't support them */ -- case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL: - case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL: - case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1: - case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2: -@@ -95,6 +94,10 @@ - case VDP_VIDEO_MIXER_FEATURE_LUMA_KEY: - break; - -+ case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL: -+ vmixer->deint.supported = true; -+ break; -+ - case VDP_VIDEO_MIXER_FEATURE_SHARPNESS: - vmixer->sharpness.supported = true; - break; -@@ -181,6 +184,11 @@ - - vl_compositor_cleanup_state(&vmixer->cstate); - -+ if (vmixer->deint.filter) { -+ vl_deint_filter_cleanup(vmixer->deint.filter); -+ FREE(vmixer->deint.filter); -+ } -+ - if (vmixer->noise_reduction.filter) { - vl_median_filter_cleanup(vmixer->noise_reduction.filter); - FREE(vmixer->noise_reduction.filter); -@@ -219,6 +227,7 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, - enum vl_compositor_deinterlace deinterlace; - struct u_rect rect, clip, *prect; - unsigned i, layer = 0; -+ struct pipe_video_buffer *video_buffer; - - vlVdpVideoMixer *vmixer; - vlVdpSurface *surf; -@@ -233,6 +242,7 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, - compositor = &vmixer->device->compositor; - - surf = vlGetDataHTAB(video_surface_current); -+ video_buffer = surf->video_buffer; - if (!surf) - return VDP_STATUS_INVALID_HANDLE; - -@@ -283,6 +293,24 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, - pipe_mutex_unlock(vmixer->device->mutex); - return VDP_STATUS_INVALID_VIDEO_MIXER_PICTURE_STRUCTURE; - }; -+ -+ if (deinterlace != VL_COMPOSITOR_WEAVE && vmixer->deint.enabled && -+ video_surface_past_count > 1 && video_surface_future_count > 0) { -+ vlVdpSurface *prevprev = vlGetDataHTAB(video_surface_past[1]); -+ vlVdpSurface *prev = vlGetDataHTAB(video_surface_past[0]); -+ vlVdpSurface *next = vlGetDataHTAB(video_surface_future[0]); -+ if (prevprev && prev && next && -+ vl_deint_filter_check_buffers(vmixer->deint.filter, -+ prevprev->video_buffer, prev->video_buffer, surf->video_buffer, next->video_buffer)) { -+ vl_deint_filter_render(vmixer->deint.filter, prevprev->video_buffer, -+ prev->video_buffer, surf->video_buffer, -+ next->video_buffer, -+ deinterlace == VL_COMPOSITOR_BOB_BOTTOM); -+ deinterlace = VL_COMPOSITOR_WEAVE; -+ video_buffer = vmixer->deint.filter->video_buffer; -+ } -+ } -+ - prect = RectToPipe(video_source_rect, &rect); - if (!prect) { - rect.x0 = 0; -@@ -291,7 +319,7 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, - rect.y1 = surf->templat.height; - prect = ▭ - } -- vl_compositor_set_buffer_layer(&vmixer->cstate, compositor, layer, surf->video_buffer, prect, NULL, deinterlace); -+ vl_compositor_set_buffer_layer(&vmixer->cstate, compositor, layer, video_buffer, prect, NULL, deinterlace); - vl_compositor_set_layer_dst_area(&vmixer->cstate, layer++, RectToPipe(destination_video_rect, &rect)); - - for (i = 0; i < layer_count; ++i) { -@@ -332,6 +360,31 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, - return VDP_STATUS_OK; - } - -+static void -+vlVdpVideoMixerUpdateDeinterlaceFilter(vlVdpVideoMixer *vmixer) -+{ -+ struct pipe_context *pipe = vmixer->device->context; -+ assert(vmixer); -+ -+ /* remove existing filter */ -+ if (vmixer->deint.filter) { -+ vl_deint_filter_cleanup(vmixer->deint.filter); -+ FREE(vmixer->deint.filter); -+ vmixer->deint.filter = NULL; -+ } -+ -+ /* create a new filter if requested */ -+ if (vmixer->deint.enabled && vmixer->chroma_format == PIPE_VIDEO_CHROMA_FORMAT_420) { -+ vmixer->deint.filter = MALLOC(sizeof(struct vl_deint_filter)); -+ vmixer->deint.enabled = vl_deint_filter_init(vmixer->deint.filter, pipe, -+ vmixer->video_width, vmixer->video_height, -+ vmixer->skip_chroma_deint, vmixer->deint.spatial); -+ if (!vmixer->deint.enabled) { -+ FREE(vmixer->deint.filter); -+ } -+ } -+} -+ - /** - * Update the noise reduction setting - */ -@@ -424,7 +477,6 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, - for (i = 0; i < feature_count; ++i) { - switch (features[i]) { - /* they are valid, but we doesn't support them */ -- case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL: - case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL: - case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1: - case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2: -@@ -440,6 +492,10 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, - feature_supports[i] = false; - break; - -+ case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL: -+ feature_supports[i] = vmixer->deint.supported; -+ break; -+ - case VDP_VIDEO_MIXER_FEATURE_SHARPNESS: - feature_supports[i] = vmixer->sharpness.supported; - break; -@@ -479,7 +535,6 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, - for (i = 0; i < feature_count; ++i) { - switch (features[i]) { - /* they are valid, but we doesn't support them */ -- case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL: - case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL: - case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1: - case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2: -@@ -494,6 +549,11 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, - case VDP_VIDEO_MIXER_FEATURE_LUMA_KEY: - break; - -+ case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL: -+ vmixer->deint.enabled = feature_enables[i]; -+ vlVdpVideoMixerUpdateDeinterlaceFilter(vmixer); -+ break; -+ - case VDP_VIDEO_MIXER_FEATURE_SHARPNESS: - vmixer->sharpness.enabled = feature_enables[i]; - vlVdpVideoMixerUpdateSharpnessFilter(vmixer); -@@ -648,6 +708,7 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, - if (*(uint8_t*)attribute_values[i] > 1) - return VDP_STATUS_INVALID_VALUE; - vmixer->skip_chroma_deint = *(uint8_t*)attribute_values[i]; -+ vlVdpVideoMixerUpdateDeinterlaceFilter(vmixer); - break; - default: - pipe_mutex_unlock(vmixer->device->mutex); -diff --git a/src/gallium/state_trackers/vdpau/query.c b/src/gallium/state_trackers/vdpau/query.c -index 1d35252..aba65ee 100644 ---- a/src/gallium/state_trackers/vdpau/query.c -+++ b/src/gallium/state_trackers/vdpau/query.c -@@ -469,6 +469,7 @@ - switch (feature) { - case VDP_VIDEO_MIXER_FEATURE_SHARPNESS: - case VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION: -+ case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL: - *is_supported = VDP_TRUE; - break; - default: -diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h -index 60196ac..0811df6 100644 ---- a/src/gallium/state_trackers/vdpau/vdpau_private.h -+++ b/src/gallium/state_trackers/vdpau/vdpau_private.h -@@ -42,8 +42,10 @@ - #include "util/u_rect.h" - #include "os/os_thread.h" - -+#include "vl/vl_video_buffer.h" - #include "vl/vl_compositor.h" - #include "vl/vl_csc.h" -+#include "vl/vl_deint_filter.h" - #include "vl/vl_matrix_filter.h" - #include "vl/vl_median_filter.h" - #include "vl/vl_winsys.h" -@@ -351,6 +353,11 @@ - struct vl_compositor_state cstate; - - struct { -+ bool supported, enabled, spatial; -+ struct vl_deint_filter *filter; -+ } deint; -+ -+ struct { - bool supported, enabled; - unsigned level; - struct vl_median_filter *filter; --- -1.8.4 - diff --git a/packages/graphics/Mesa/patches/Mesa-99.01-Add_LLVM_VERSION_PATCH_to_DEFINES.patch b/packages/graphics/Mesa/patches/Mesa-99.01-Add_LLVM_VERSION_PATCH_to_DEFINES.patch deleted file mode 100644 index 06e51eea8b..0000000000 --- a/packages/graphics/Mesa/patches/Mesa-99.01-Add_LLVM_VERSION_PATCH_to_DEFINES.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff -Naur Mesa-10.1.3/configure.ac Mesa-10.1.3.patch/configure.ac ---- Mesa-10.1.3/configure.ac 2014-05-09 16:15:36.000000000 +0200 -+++ Mesa-10.1.3.patch/configure.ac 2014-05-12 11:20:15.124212119 +0200 -@@ -1602,6 +1602,13 @@ - - AC_COMPUTE_INT([LLVM_VERSION_MAJOR], [LLVM_VERSION_MAJOR], - [#include "${LLVM_INCLUDEDIR}/llvm/Config/llvm-config.h"]) -+ -+ dnl In LLVM 3.4.1 patch level was defined in config.h and not -+ dnl llvm-config.h -+ AC_COMPUTE_INT([LLVM_VERSION_PATCH], [LLVM_VERSION_PATCH], -+ [#include "${LLVM_INCLUDEDIR}/llvm/Config/config.h"], -+ LLVM_VERSION_PATCH=0) dnl Default if LLVM_VERSION_PATCH not found -+ - AC_COMPUTE_INT([LLVM_VERSION_MINOR], [LLVM_VERSION_MINOR], - [#include "${LLVM_INCLUDEDIR}/llvm/Config/llvm-config.h"]) - -@@ -1627,7 +1634,7 @@ - LLVM_COMPONENTS="${LLVM_COMPONENTS} option" - fi - fi -- DEFINES="${DEFINES} -DHAVE_LLVM=0x0$LLVM_VERSION_INT" -+ DEFINES="${DEFINES} -DHAVE_LLVM=0x0$LLVM_VERSION_INT -DLLVM_VERSION_PATCH=$LLVM_VERSION_PATCH" - MESA_LLVM=1 - - dnl Check for Clang internal headers diff --git a/packages/graphics/Mesa/patches/Mesa-99.02-radeonsi-Enable_geometry_shaders_with_LLVM-3.4.1.patch b/packages/graphics/Mesa/patches/Mesa-99.02-radeonsi-Enable_geometry_shaders_with_LLVM-3.4.1.patch deleted file mode 100644 index 841d92ac37..0000000000 --- a/packages/graphics/Mesa/patches/Mesa-99.02-radeonsi-Enable_geometry_shaders_with_LLVM-3.4.1.patch +++ /dev/null @@ -1,119 +0,0 @@ -From 93c2ebbd83604263fa46351a7efcde382322024b Mon Sep 17 00:00:00 2001 -From: Tom Stellard -Date: Fri, 09 May 2014 08:24:42 +0000 -Subject: radeonsi: Enable geometry shaders with LLVM 3.4.1 - -Reviewed-by: Michel Dänzer - -CC: "10.1 10.2" ---- -diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c -index e0b211f..38ad077 100644 ---- a/src/gallium/drivers/radeonsi/si_descriptors.c -+++ b/src/gallium/drivers/radeonsi/si_descriptors.c -@@ -152,7 +152,7 @@ static void si_update_descriptors(struct si_context *sctx, - 7 + /* copy */ - (4 + desc->element_dw_size) * util_bitcount(desc->dirty_mask) + /* update */ - 4; /* pointer update */ --#if HAVE_LLVM >= 0x0305 -+#if LLVM_SUPPORTS_GEOM_SHADERS - if (desc->shader_userdata_reg >= R_00B130_SPI_SHADER_USER_DATA_VS_0 && - desc->shader_userdata_reg < R_00B230_SPI_SHADER_USER_DATA_GS_0) - desc->atom.num_dw += 4; /* second pointer update */ -@@ -177,7 +177,7 @@ static void si_emit_shader_pointer(struct si_context *sctx, - radeon_emit(cs, va); - radeon_emit(cs, va >> 32); - --#if HAVE_LLVM >= 0x0305 -+#if LLVM_SUPPORTS_GEOM_SHADERS - if (desc->shader_userdata_reg >= R_00B130_SPI_SHADER_USER_DATA_VS_0 && - desc->shader_userdata_reg < R_00B230_SPI_SHADER_USER_DATA_GS_0) { - radeon_emit(cs, PKT3(PKT3_SET_SH_REG, 2, 0)); -diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c -index e5d0a95..07c00cf 100644 ---- a/src/gallium/drivers/radeonsi/si_pipe.c -+++ b/src/gallium/drivers/radeonsi/si_pipe.c -@@ -225,7 +225,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param) - return 4; - - case PIPE_CAP_GLSL_FEATURE_LEVEL: -- return HAVE_LLVM >= 0x0305 ? 330 : 140; -+ return (LLVM_SUPPORTS_GEOM_SHADERS) ? 330 : 140; - - case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE: - return MIN2(sscreen->b.info.vram_size, 0xFFFFFFFF); -@@ -309,7 +309,7 @@ static int si_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enu - case PIPE_SHADER_VERTEX: - break; - case PIPE_SHADER_GEOMETRY: --#if HAVE_LLVM < 0x0305 -+#if !(LLVM_SUPPORTS_GEOM_SHADERS) - return 0; - #endif - break; -diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h -index 1601a4b..de42477 100644 ---- a/src/gallium/drivers/radeonsi/si_pipe.h -+++ b/src/gallium/drivers/radeonsi/si_pipe.h -@@ -39,6 +39,10 @@ - - #define SI_MAX_DRAW_CS_DWORDS 18 - -+#define LLVM_SUPPORTS_GEOM_SHADERS \ -+ ((HAVE_LLVM >= 0x0305) || \ -+ (HAVE_LLVM == 0x0304 && LLVM_VERSION_PATCH >= 1)) -+ - struct si_pipe_compute; - - struct si_screen { -diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c -index 9d048c5..a98be24 100644 ---- a/src/gallium/drivers/radeonsi/si_state.c -+++ b/src/gallium/drivers/radeonsi/si_state.c -@@ -2174,7 +2174,7 @@ static void *si_create_fs_state(struct pipe_context *ctx, - return si_create_shader_state(ctx, state, PIPE_SHADER_FRAGMENT); - } - --#if HAVE_LLVM >= 0x0305 -+#if LLVM_SUPPORTS_GEOM_SHADERS - - static void *si_create_gs_state(struct pipe_context *ctx, - const struct pipe_shader_state *state) -@@ -2204,7 +2204,7 @@ static void si_bind_vs_shader(struct pipe_context *ctx, void *state) - sctx->vs_shader = sel; - } - --#if HAVE_LLVM >= 0x0305 -+#if LLVM_SUPPORTS_GEOM_SHADERS - - static void si_bind_gs_shader(struct pipe_context *ctx, void *state) - { -@@ -2272,7 +2272,7 @@ static void si_delete_vs_shader(struct pipe_context *ctx, void *state) - si_delete_shader_selector(ctx, sel); - } - --#if HAVE_LLVM >= 0x0305 -+#if LLVM_SUPPORTS_GEOM_SHADERS - - static void si_delete_gs_shader(struct pipe_context *ctx, void *state) - { -@@ -2769,7 +2769,7 @@ static void si_bind_vs_sampler_states(struct pipe_context *ctx, unsigned count, - si_set_sampler_states(sctx, pm4, count, states, - &sctx->samplers[PIPE_SHADER_VERTEX], - R_00B130_SPI_SHADER_USER_DATA_VS_0); --#if HAVE_LLVM >= 0x0305 -+#if LLVM_SUPPORTS_GEOM_SHADERS - si_set_sampler_states(sctx, pm4, count, states, - &sctx->samplers[PIPE_SHADER_VERTEX], - R_00B330_SPI_SHADER_USER_DATA_ES_0); -@@ -3001,7 +3001,7 @@ void si_init_state_functions(struct si_context *sctx) - sctx->b.b.bind_fs_state = si_bind_ps_shader; - sctx->b.b.delete_vs_state = si_delete_vs_shader; - sctx->b.b.delete_fs_state = si_delete_ps_shader; --#if HAVE_LLVM >= 0x0305 -+#if LLVM_SUPPORTS_GEOM_SHADERS - sctx->b.b.create_gs_state = si_create_gs_state; - sctx->b.b.bind_gs_state = si_bind_gs_shader; - sctx->b.b.delete_gs_state = si_delete_gs_shader; --- -cgit v0.9.0.2-2-gbebe