summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>2015-10-22 15:50:49 +0100
committerSean V Kelley <seanvk@posteo.de>2015-11-09 14:19:06 -0800
commit318908e6c6f8e12d71096e7d5ab6e03ed4ca67bb (patch)
treebd2acaa4ee2fc939a911c7bda0e6b5ca66575b81
parent4640d06a8ccb0a12e91bbd00cc3e2423d17ee243 (diff)
downloadlibva-intel-driver-318908e6c6f8e12d71096e7d5ab6e03ed4ca67bb.tar.gz
render: extract out yuv->rgb coefs
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Zhao Yakui <yakui.zhao@intel.com> Reviewed-by: Sean V Kelley <seanvk@posteo.de>
-rwxr-xr-xsrc/Makefile.am2
-rw-r--r--src/gen8_render.c32
-rw-r--r--src/gen9_render.c32
-rw-r--r--src/i965_render.c32
-rw-r--r--src/i965_yuv_coefs.c73
-rw-r--r--src/i965_yuv_coefs.h36
6 files changed, 131 insertions, 76 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index a170aee1..f6db8873 100755
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -84,6 +84,7 @@ source_c = \
i965_media_mpeg2.c \
i965_gpe_utils.c \
i965_post_processing.c \
+ i965_yuv_coefs.c \
gen8_post_processing.c \
i965_render.c \
i965_vpp_avs.c \
@@ -128,6 +129,7 @@ source_h = \
i965_render.h \
i965_structs.h \
i965_vpp_avs.h \
+ i965_yuv_coefs.h \
intel_batchbuffer.h \
intel_batchbuffer_dump.h\
intel_compiler.h \
diff --git a/src/gen8_render.c b/src/gen8_render.c
index 45d55ea2..1bfe04cf 100644
--- a/src/gen8_render.c
+++ b/src/gen8_render.c
@@ -45,6 +45,7 @@
#include "i965_defines.h"
#include "i965_drv_video.h"
#include "i965_structs.h"
+#include "i965_yuv_coefs.h"
#include "i965_render.h"
@@ -124,25 +125,6 @@ static struct i965_kernel render_kernels_gen8[] = {
#define URB_CS_ENTRIES 4
#define URB_CS_ENTRY_SIZE 4
-static float yuv_to_rgb_bt601[3][4] = {
-{1.164, 0, 1.596, -0.06275,},
-{1.164, -0.392, -0.813, -0.50196,},
-{1.164, 2.017, 0, -0.50196,},
-};
-
-static float yuv_to_rgb_bt709[3][4] = {
-{1.164, 0, 1.793, -0.06275,},
-{1.164, -0.213, -0.533, -0.50196,},
-{1.164, 2.112, 0, -0.50196,},
-};
-
-static float yuv_to_rgb_smpte_240[3][4] = {
-{1.164, 0, 1.794, -0.06275,},
-{1.164, -0.258, -0.5425, -0.50196,},
-{1.164, 2.078, 0, -0.50196,},
-};
-
-
static void
gen8_render_set_surface_tiling(struct gen8_surface_state *ss, uint32_t tiling)
{
@@ -784,6 +766,8 @@ gen8_render_upload_constants(VADriverContextP ctx,
float saturation = (float)i965->saturation_attrib->value / DEFAULT_SATURATION;
float *yuv_to_rgb;
unsigned int color_flag;
+ const float* yuv_coefs;
+ size_t coefs_length;
dri_bo_map(render_state->dynamic_state.bo, 1);
assert(render_state->dynamic_state.bo->virtual);
@@ -820,12 +804,10 @@ gen8_render_upload_constants(VADriverContextP ctx,
color_flag = flags & VA_SRC_COLOR_MASK;
yuv_to_rgb = (float *)constant_buffer + 8;
- if (color_flag == VA_SRC_BT709)
- memcpy(yuv_to_rgb, yuv_to_rgb_bt709, sizeof(yuv_to_rgb_bt709));
- else if (color_flag == VA_SRC_SMPTE_240)
- memcpy(yuv_to_rgb, yuv_to_rgb_smpte_240, sizeof(yuv_to_rgb_smpte_240));
- else
- memcpy(yuv_to_rgb, yuv_to_rgb_bt601, sizeof(yuv_to_rgb_bt601));
+
+ yuv_coefs = i915_color_standard_to_coefs(i915_filter_to_color_standard(color_flag),
+ &coefs_length);
+ memcpy(yuv_to_rgb, yuv_coefs, coefs_length);
dri_bo_unmap(render_state->dynamic_state.bo);
}
diff --git a/src/gen9_render.c b/src/gen9_render.c
index fa48243f..b45543a2 100644
--- a/src/gen9_render.c
+++ b/src/gen9_render.c
@@ -45,6 +45,7 @@
#include "i965_defines.h"
#include "i965_drv_video.h"
#include "i965_structs.h"
+#include "i965_yuv_coefs.h"
#include "i965_render.h"
@@ -118,25 +119,6 @@ static struct i965_kernel render_kernels_gen9[] = {
#define URB_CS_ENTRIES 4
#define URB_CS_ENTRY_SIZE 4
-static float yuv_to_rgb_bt601[3][4] = {
-{1.164, 0, 1.596, -0.06275,},
-{1.164, -0.392, -0.813, -0.50196,},
-{1.164, 2.017, 0, -0.50196,},
-};
-
-static float yuv_to_rgb_bt709[3][4] = {
-{1.164, 0, 1.793, -0.06275,},
-{1.164, -0.213, -0.533, -0.50196,},
-{1.164, 2.112, 0, -0.50196,},
-};
-
-static float yuv_to_rgb_smpte_240[3][4] = {
-{1.164, 0, 1.794, -0.06275,},
-{1.164, -0.258, -0.5425, -0.50196,},
-{1.164, 2.078, 0, -0.50196,},
-};
-
-
static void
gen9_render_set_surface_tiling(struct gen8_surface_state *ss, uint32_t tiling)
{
@@ -775,6 +757,8 @@ gen9_render_upload_constants(VADriverContextP ctx,
float saturation = (float)i965->saturation_attrib->value / DEFAULT_SATURATION;
float *yuv_to_rgb;
unsigned int color_flag;
+ const float* yuv_coefs;
+ size_t coefs_length;
dri_bo_map(render_state->dynamic_state.bo, 1);
assert(render_state->dynamic_state.bo->virtual);
@@ -811,12 +795,10 @@ gen9_render_upload_constants(VADriverContextP ctx,
color_flag = flags & VA_SRC_COLOR_MASK;
yuv_to_rgb = (float *)constant_buffer + 8;
- if (color_flag == VA_SRC_BT709)
- memcpy(yuv_to_rgb, yuv_to_rgb_bt709, sizeof(yuv_to_rgb_bt709));
- else if (color_flag == VA_SRC_SMPTE_240)
- memcpy(yuv_to_rgb, yuv_to_rgb_smpte_240, sizeof(yuv_to_rgb_smpte_240));
- else
- memcpy(yuv_to_rgb, yuv_to_rgb_bt601, sizeof(yuv_to_rgb_bt601));
+
+ yuv_coefs = i915_color_standard_to_coefs(i915_filter_to_color_standard(color_flag),
+ &coefs_length);
+ memcpy(yuv_to_rgb, yuv_coefs, coefs_length);
dri_bo_unmap(render_state->dynamic_state.bo);
}
diff --git a/src/i965_render.c b/src/i965_render.c
index f941d1b2..2e24353b 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -44,6 +44,7 @@
#include "i965_defines.h"
#include "i965_drv_video.h"
#include "i965_structs.h"
+#include "i965_yuv_coefs.h"
#include "i965_render.h"
@@ -311,24 +312,6 @@ static struct i965_kernel render_kernels_gen7_haswell[] = {
#define URB_CS_ENTRIES 4
#define URB_CS_ENTRY_SIZE 4
-static float yuv_to_rgb_bt601[3][4] = {
-{1.164, 0, 1.596, -0.06275,},
-{1.164, -0.392, -0.813, -0.50196,},
-{1.164, 2.017, 0, -0.50196,},
-};
-
-static float yuv_to_rgb_bt709[3][4] = {
-{1.164, 0, 1.793, -0.06275,},
-{1.164, -0.213, -0.533, -0.50196,},
-{1.164, 2.112, 0, -0.50196,},
-};
-
-static float yuv_to_rgb_smpte_240[3][4] = {
-{1.164, 0, 1.794, -0.06275,},
-{1.164, -0.258, -0.5425, -0.50196,},
-{1.164, 2.078, 0, -0.50196,},
-};
-
static void
i965_render_vs_unit(VADriverContextP ctx)
{
@@ -1094,7 +1077,8 @@ i965_render_upload_constants(VADriverContextP ctx,
float hue = (float)i965->hue_attrib->value / 180 * PI;
float saturation = (float)i965->saturation_attrib->value / DEFAULT_SATURATION;
float *yuv_to_rgb;
- unsigned int color_flag;
+ const float* yuv_coefs;
+ size_t coefs_length;
dri_bo_map(render_state->curbe.bo, 1);
assert(render_state->curbe.bo->virtual);
@@ -1125,14 +1109,10 @@ i965_render_upload_constants(VADriverContextP ctx,
*color_balance_base++ = cos(hue) * contrast * saturation;
*color_balance_base++ = sin(hue) * contrast * saturation;
- color_flag = flags & VA_SRC_COLOR_MASK;
yuv_to_rgb = (float *)constant_buffer + 8;
- if (color_flag == VA_SRC_BT709)
- memcpy(yuv_to_rgb, yuv_to_rgb_bt709, sizeof(yuv_to_rgb_bt709));
- else if (color_flag == VA_SRC_SMPTE_240)
- memcpy(yuv_to_rgb, yuv_to_rgb_smpte_240, sizeof(yuv_to_rgb_smpte_240));
- else
- memcpy(yuv_to_rgb, yuv_to_rgb_bt601, sizeof(yuv_to_rgb_bt601));
+ yuv_coefs = i915_color_standard_to_coefs(i915_filter_to_color_standard(flags & VA_SRC_COLOR_MASK),
+ &coefs_length);
+ memcpy(yuv_to_rgb, yuv_coefs, coefs_length);
dri_bo_unmap(render_state->curbe.bo);
}
diff --git a/src/i965_yuv_coefs.c b/src/i965_yuv_coefs.c
new file mode 100644
index 00000000..db817b44
--- /dev/null
+++ b/src/i965_yuv_coefs.c
@@ -0,0 +1,73 @@
+/*
+ * Copyright © 2015 Intel Corporation
+ *
+ * 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 PRECISION INSIGHT 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 "i965_yuv_coefs.h"
+
+static const float yuv_to_rgb_bt601[] = {
+ 1.164, 0, 1.596, -0.06275,
+ 1.164, -0.392, -0.813, -0.50196,
+ 1.164, 2.017, 0, -0.50196,
+};
+
+static const float yuv_to_rgb_bt709[] = {
+ 1.164, 0, 1.793, -0.06275,
+ 1.164, -0.213, -0.533, -0.50196,
+ 1.164, 2.112, 0, -0.50196,
+};
+
+static const float yuv_to_rgb_smpte_240[] = {
+ 1.164, 0, 1.794, -0.06275,
+ 1.164, -0.258, -0.5425, -0.50196,
+ 1.164, 2.078, 0, -0.50196,
+};
+
+VAProcColorStandardType i915_filter_to_color_standard (unsigned int filter) {
+ switch (filter & VA_SRC_COLOR_MASK) {
+ case VA_SRC_BT601:
+ return VAProcColorStandardBT601;
+ case VA_SRC_BT709:
+ return VAProcColorStandardBT709;
+ case VA_SRC_SMPTE_240:
+ return VAProcColorStandardSMPTE240M;
+ default:
+ return VAProcColorStandardBT601;
+ }
+}
+
+const float *i915_color_standard_to_coefs (VAProcColorStandardType standard, size_t *length) {
+ switch (standard) {
+ case VAProcColorStandardBT601:
+ *length = sizeof(yuv_to_rgb_bt601);
+ return yuv_to_rgb_bt601;
+ case VAProcColorStandardBT709:
+ *length = sizeof(yuv_to_rgb_bt709);
+ return yuv_to_rgb_bt709;
+ case VAProcColorStandardSMPTE240M:
+ *length = sizeof(yuv_to_rgb_smpte_240);
+ return yuv_to_rgb_smpte_240;
+ default:
+ *length = sizeof(yuv_to_rgb_bt601);
+ return yuv_to_rgb_bt601;
+ }
+}
diff --git a/src/i965_yuv_coefs.h b/src/i965_yuv_coefs.h
new file mode 100644
index 00000000..f58f903b
--- /dev/null
+++ b/src/i965_yuv_coefs.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright © 2015 Intel Corporation
+ *
+ * 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 PRECISION INSIGHT 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.
+ */
+
+#ifndef __I965_YUV_COEFS_H__
+#define __I965_YUV_COEFS_H__
+
+#include "sysdeps.h"
+
+#include <va/va.h>
+#include <va/va_vpp.h>
+
+VAProcColorStandardType i915_filter_to_color_standard (unsigned int filter);
+const float *i915_color_standard_to_coefs (VAProcColorStandardType standard, size_t *length);
+
+#endif /* __I965_YUV_COEFS_H__ */