Mesa (master): gallium: Move sRGB <-> RGB handling to libmesautil

Jason Ekstrand jekstrand at kemper.freedesktop.org
Mon Aug 4 18:12:26 UTC 2014


Module: Mesa
Branch: master
Commit: 992e1ea8e4290cf14d59f89415bfd13e0920aad7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=992e1ea8e4290cf14d59f89415bfd13e0920aad7

Author: Jason Ekstrand <jason.ekstrand at intel.com>
Date:   Thu Jul 24 11:17:53 2014 -0700

gallium: Move sRGB <-> RGB handling to libmesautil

Signed-off-by: Jason Ekstrand <jason.ekstrand at intel.com>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>

---

 src/gallium/Automake.inc                           |    2 +
 src/gallium/auxiliary/Makefile.am                  |    4 -
 src/gallium/auxiliary/Makefile.sources             |    1 -
 src/gallium/auxiliary/SConscript                   |    8 +-
 src/gallium/auxiliary/util/u_format_pack.py        |    2 +-
 src/gallium/auxiliary/util/u_format_s3tc.c         |    2 +-
 src/gallium/drivers/llvmpipe/SConscript            |    2 +-
 src/gallium/drivers/nouveau/Makefile.am            |    1 +
 src/gallium/drivers/nouveau/nv50/nv50_state.c      |    2 +-
 src/gallium/targets/graw-gdi/SConscript            |    1 +
 src/gallium/targets/graw-null/SConscript           |    2 +-
 src/gallium/targets/graw-xlib/SConscript           |    1 +
 src/gallium/targets/pipe-loader/Makefile.am        |    2 +-
 src/gallium/tests/graw/SConscript                  |    2 +-
 src/gallium/tests/unit/SConscript                  |    2 +-
 src/util/Makefile.am                               |   11 ++-
 src/util/Makefile.sources                          |    3 +
 src/util/SConscript                                |   12 ++-
 .../util/u_format_srgb.h => util/format_srgb.h}    |   88 ++++++++------------
 .../util/u_format_srgb.py => util/format_srgb.py}  |    8 +-
 20 files changed, 79 insertions(+), 77 deletions(-)

diff --git a/src/gallium/Automake.inc b/src/gallium/Automake.inc
index 22ee166..74053eb 100644
--- a/src/gallium/Automake.inc
+++ b/src/gallium/Automake.inc
@@ -11,6 +11,7 @@ GALLIUM_CFLAGS = \
 # preprocessor is determined by the ordering of the -I flags.
 GALLIUM_DRIVER_CFLAGS = \
 	-I$(srcdir)/include \
+	-I$(top_srcdir)/src \
 	-I$(top_srcdir)/include \
 	-I$(top_srcdir)/src/gallium/include \
 	-I$(top_srcdir)/src/gallium/auxiliary \
@@ -20,6 +21,7 @@ GALLIUM_DRIVER_CFLAGS = \
 
 GALLIUM_DRIVER_CXXFLAGS = \
 	-I$(srcdir)/include \
+	-I$(top_srcdir)/src \
 	-I$(top_srcdir)/include \
 	-I$(top_srcdir)/src/gallium/include \
 	-I$(top_srcdir)/src/gallium/auxiliary \
diff --git a/src/gallium/auxiliary/Makefile.am b/src/gallium/auxiliary/Makefile.am
index 727ed1f..493d306 100644
--- a/src/gallium/auxiliary/Makefile.am
+++ b/src/gallium/auxiliary/Makefile.am
@@ -39,10 +39,6 @@ indices/u_unfilled_gen.c: $(srcdir)/indices/u_unfilled_gen.py
 	$(AM_V_at)$(MKDIR_P) indices
 	$(AM_V_GEN) $(PYTHON2) $< > $@
 
-util/u_format_srgb.c: $(srcdir)/util/u_format_srgb.py
-	$(AM_V_at)$(MKDIR_P) util
-	$(AM_V_GEN) $(PYTHON2) $< > $@
-
 util/u_format_table.c: $(srcdir)/util/u_format_table.py $(srcdir)/util/u_format_pack.py $(srcdir)/util/u_format_parse.py $(srcdir)/util/u_format.csv
 	$(AM_V_at)$(MKDIR_P) util
 	$(AM_V_GEN) $(PYTHON2) $(srcdir)/util/u_format_table.py $(srcdir)/util/u_format.csv > $@
diff --git a/src/gallium/auxiliary/Makefile.sources b/src/gallium/auxiliary/Makefile.sources
index 8919783..3eae9e5 100644
--- a/src/gallium/auxiliary/Makefile.sources
+++ b/src/gallium/auxiliary/Makefile.sources
@@ -162,7 +162,6 @@ C_SOURCES := \
 GENERATED_SOURCES := \
 	indices/u_indices_gen.c \
 	indices/u_unfilled_gen.c \
-	util/u_format_srgb.c \
 	util/u_format_table.c
 
 GALLIVM_SOURCES := \
diff --git a/src/gallium/auxiliary/SConscript b/src/gallium/auxiliary/SConscript
index 31dfed3..94041d2 100644
--- a/src/gallium/auxiliary/SConscript
+++ b/src/gallium/auxiliary/SConscript
@@ -3,6 +3,7 @@ Import('*')
 from sys import executable as python_cmd
 
 env.Append(CPPPATH = [
+    '#src',
     'indices',
     'util',
 ])
@@ -22,13 +23,6 @@ env.CodeGenerate(
 )
 
 env.CodeGenerate(
-    target = 'util/u_format_srgb.c', 
-    script = 'util/u_format_srgb.py', 
-    source = [],
-    command = python_cmd + ' $SCRIPT > $TARGET'
-)
-
-env.CodeGenerate(
     target = 'util/u_format_table.c',
     script = '#src/gallium/auxiliary/util/u_format_table.py',
     source = ['#src/gallium/auxiliary/util/u_format.csv'],
diff --git a/src/gallium/auxiliary/util/u_format_pack.py b/src/gallium/auxiliary/util/u_format_pack.py
index f9496de..a553e23 100644
--- a/src/gallium/auxiliary/util/u_format_pack.py
+++ b/src/gallium/auxiliary/util/u_format_pack.py
@@ -669,7 +669,7 @@ def generate(formats):
     print '#include "u_half.h"'
     print '#include "u_format.h"'
     print '#include "u_format_other.h"'
-    print '#include "u_format_srgb.h"'
+    print '#include "util/format_srgb.h"'
     print '#include "u_format_yuv.h"'
     print '#include "u_format_zs.h"'
     print
diff --git a/src/gallium/auxiliary/util/u_format_s3tc.c b/src/gallium/auxiliary/util/u_format_s3tc.c
index 11b4602..7e05989 100644
--- a/src/gallium/auxiliary/util/u_format_s3tc.c
+++ b/src/gallium/auxiliary/util/u_format_s3tc.c
@@ -27,7 +27,7 @@
 #include "u_math.h"
 #include "u_format.h"
 #include "u_format_s3tc.h"
-#include "u_format_srgb.h"
+#include "util/format_srgb.h"
 
 
 #if defined(_WIN32) || defined(WIN32)
diff --git a/src/gallium/drivers/llvmpipe/SConscript b/src/gallium/drivers/llvmpipe/SConscript
index 20500fd..1bea611 100644
--- a/src/gallium/drivers/llvmpipe/SConscript
+++ b/src/gallium/drivers/llvmpipe/SConscript
@@ -20,7 +20,7 @@ env.Alias('llvmpipe', llvmpipe)
 if not env['embedded']:
     env = env.Clone()
 
-    env.Prepend(LIBS = [llvmpipe] + gallium)
+    env.Prepend(LIBS = [llvmpipe, gallium, mesautil])
 
     tests = [
         'format',
diff --git a/src/gallium/drivers/nouveau/Makefile.am b/src/gallium/drivers/nouveau/Makefile.am
index ef48380..82741d2 100644
--- a/src/gallium/drivers/nouveau/Makefile.am
+++ b/src/gallium/drivers/nouveau/Makefile.am
@@ -49,4 +49,5 @@ nouveau_compiler_SOURCES = \
 nouveau_compiler_LDADD = \
 	libnouveau.la \
 	../../auxiliary/libgallium.la \
+	$(top_builddir)/src/util/libmesautil.la \
 	$(GALLIUM_COMMON_LIB_DEPS)
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state.c b/src/gallium/drivers/nouveau/nv50/nv50_state.c
index 915ee26..48bc079 100644
--- a/src/gallium/drivers/nouveau/nv50/nv50_state.c
+++ b/src/gallium/drivers/nouveau/nv50/nv50_state.c
@@ -24,7 +24,7 @@
 #include "util/u_helpers.h"
 #include "util/u_inlines.h"
 #include "util/u_transfer.h"
-#include "util/u_format_srgb.h"
+#include "util/format_srgb.h"
 
 #include "tgsi/tgsi_parse.h"
 
diff --git a/src/gallium/targets/graw-gdi/SConscript b/src/gallium/targets/graw-gdi/SConscript
index 352efe9..dc7b7f1 100644
--- a/src/gallium/targets/graw-gdi/SConscript
+++ b/src/gallium/targets/graw-gdi/SConscript
@@ -10,6 +10,7 @@ env.Append(CPPPATH = [
 ])
 
 env.Prepend(LIBS = [
+    mesautils,
     gallium,
     'gdi32',
     'user32',
diff --git a/src/gallium/targets/graw-null/SConscript b/src/gallium/targets/graw-null/SConscript
index ebac172..20c8b7d 100644
--- a/src/gallium/targets/graw-null/SConscript
+++ b/src/gallium/targets/graw-null/SConscript
@@ -16,7 +16,7 @@ sources = [
     graw_util,
 ]
 
-env.Prepend(LIBS = [gallium])
+env.Prepend(LIBS = [mesautil, gallium])
 
 # TODO: write a wrapper function http://www.scons.org/wiki/WrapperFunctions
 graw = env.SharedLibrary(
diff --git a/src/gallium/targets/graw-xlib/SConscript b/src/gallium/targets/graw-xlib/SConscript
index 76e4d4f..886811b 100644
--- a/src/gallium/targets/graw-xlib/SConscript
+++ b/src/gallium/targets/graw-xlib/SConscript
@@ -7,6 +7,7 @@ env = env.Clone()
 
 env.Prepend(LIBS = [
     ws_xlib,
+    mesautil,
     gallium,
 ])
 
diff --git a/src/gallium/targets/pipe-loader/Makefile.am b/src/gallium/targets/pipe-loader/Makefile.am
index a4e0407..ee93078 100644
--- a/src/gallium/targets/pipe-loader/Makefile.am
+++ b/src/gallium/targets/pipe-loader/Makefile.am
@@ -38,6 +38,7 @@ pipe_LTLIBRARIES =
 
 PIPE_LIBS = \
 	$(top_builddir)/src/gallium/auxiliary/libgallium.la \
+        $(top_builddir)/src/util/libmesautil.la \
 	$(top_builddir)/src/gallium/drivers/rbug/librbug.la \
 	$(top_builddir)/src/gallium/drivers/trace/libtrace.la \
 	$(top_builddir)/src/gallium/drivers/galahad/libgalahad.la \
@@ -96,7 +97,6 @@ nodist_EXTRA_pipe_r300_la_SOURCES = dummy.cpp
 pipe_r300_la_LIBADD = \
 	$(PIPE_LIBS) \
 	$(top_builddir)/src/gallium/winsys/radeon/drm/libradeonwinsys.la \
-        $(top_builddir)/src/util/libmesautil.la \
 	$(top_builddir)/src/gallium/drivers/r300/libr300-helper.la \
 	$(top_builddir)/src/gallium/drivers/r300/libr300.la \
 	$(LIBDRM_LIBS) \
diff --git a/src/gallium/tests/graw/SConscript b/src/gallium/tests/graw/SConscript
index 8723807..c5fa3fe 100644
--- a/src/gallium/tests/graw/SConscript
+++ b/src/gallium/tests/graw/SConscript
@@ -2,7 +2,7 @@ Import('*')
 
 env = env.Clone()
 
-env.Prepend(LIBS = [gallium])
+env.Prepend(LIBS = [mesautil, gallium])
 
 env.Prepend(LIBPATH = [graw.dir])
 env.Prepend(LIBS = ['graw'])
diff --git a/src/gallium/tests/unit/SConscript b/src/gallium/tests/unit/SConscript
index edc1e80..a816e2f 100644
--- a/src/gallium/tests/unit/SConscript
+++ b/src/gallium/tests/unit/SConscript
@@ -2,7 +2,7 @@ Import('*')
 
 env = env.Clone()
 
-env.Prepend(LIBS = [gallium])
+env.Prepend(LIBS = [mesautil, gallium])
 
 if env['platform'] in ('freebsd8', 'sunos'):
     env.Append(LIBS = ['m'])
diff --git a/src/util/Makefile.am b/src/util/Makefile.am
index a2aeafc..e738ab0 100644
--- a/src/util/Makefile.am
+++ b/src/util/Makefile.am
@@ -23,6 +23,10 @@ SUBDIRS = . tests
 
 include Makefile.sources
 
+BUILT_SOURCES = $(MESA_UTIL_GENERATED_FILES)
+
+CLEANFILES = $(BUILT_SOURCES)
+
 noinst_LTLIBRARIES = libmesautil.la
 
 libmesautil_la_CPPFLAGS = \
@@ -30,7 +34,12 @@ libmesautil_la_CPPFLAGS = \
 	-I$(top_srcdir)/include \
 	$(VISIBILITY_CFLAGS)
 
-libmesautil_la_SOURCES = $(MESA_UTIL_FILES)
+libmesautil_la_SOURCES = \
+	$(MESA_UTIL_FILES) \
+        $(MESA_UTIL_GENERATED_FILES)
+
+format_srgb.c: $(srcdir)/format_srgb.py
+	$(AM_V_GEN) $(PYTHON2) $< > $@
 
 ### Tests:
 
diff --git a/src/util/Makefile.sources b/src/util/Makefile.sources
index 5daa731..b99aa25 100644
--- a/src/util/Makefile.sources
+++ b/src/util/Makefile.sources
@@ -1,3 +1,6 @@
 MESA_UTIL_FILES :=	\
 	hash_table.c	\
 	ralloc.c
+
+MESA_UTIL_GENERATED_FILES = \
+	format_srgb.c
diff --git a/src/util/SConscript b/src/util/SConscript
index 8afeeda..84803c0 100644
--- a/src/util/SConscript
+++ b/src/util/SConscript
@@ -11,10 +11,20 @@ env.Prepend(CPPPATH = [
     '#src/util',
 ])
 
+env.CodeGenerate(
+    target = 'format_srgb.c',
+    script = 'format_srgb.py',
+    source = [],
+    command = python_cmd + ' $SCRIPT > $TARGET'
+)
+
 # parse Makefile.sources
 source_lists = env.ParseSourceList('Makefile.sources')
 
-mesautil_sources = source_lists['MESA_UTIL_FILES']
+mesautil_sources = (
+    source_lists['MESA_UTIL_FILES'] +
+    source_lists['MESA_UTIL_GENERATED_FILES']
+)
 
 mesautil = env.ConvenienceLibrary(
     target = 'mesautil',
diff --git a/src/gallium/auxiliary/util/u_format_srgb.h b/src/util/format_srgb.h
similarity index 65%
rename from src/gallium/auxiliary/util/u_format_srgb.h
rename to src/util/format_srgb.h
index 740a919..8e92c38 100644
--- a/src/gallium/auxiliary/util/u_format_srgb.h
+++ b/src/util/format_srgb.h
@@ -37,11 +37,7 @@
 #ifndef U_FORMAT_SRGB_H_
 #define U_FORMAT_SRGB_H_
 
-
-#include "pipe/p_compiler.h"
-#include "u_pack_color.h"
-#include "u_math.h"
-
+#include <stdint.h>
 
 extern const float
 util_format_srgb_8unorm_to_linear_float_table[256];
@@ -59,51 +55,41 @@ util_format_linear_to_srgb_helper_table[104];
 /**
  * Convert a unclamped linear float to srgb value in the [0,255].
  */
-static INLINE uint8_t
+static inline uint8_t
 util_format_linear_float_to_srgb_8unorm(float x)
 {
-   /* this would be exact but (probably much) slower */
-   if (0) {
-      if (x >= 1.0f)
-         return 255;
-      else if (x >= 0.0031308f)
-         return float_to_ubyte(1.055f * powf(x, 0.41666666f) - 0.055f);
-      else if (x > 0.0f)
-         return float_to_ubyte(12.92f * x);
-      else
-         return 0;
-   }
-   else {
-      /*
-       * This is taken from https://gist.github.com/rygorous/2203834
-       * Use LUT and do linear interpolation.
-       */
-      union fi almostone, minval, f;
-      unsigned tab, bias, scale, t;
-
-      almostone.ui = 0x3f7fffff;
-      minval.ui = (127-13) << 23;
-
-      /*
-       * Clamp to [2^(-13), 1-eps]; these two values map to 0 and 1, respectively.
-       * The tests are carefully written so that NaNs map to 0, same as in the
-       * reference implementation.
-       */
-      if (!(x > minval.f))
-         x = minval.f;
-      if (x > almostone.f)
-         x = almostone.f;
-
-      /* Do the table lookup and unpack bias, scale */
-      f.f = x;
-      tab = util_format_linear_to_srgb_helper_table[(f.ui - minval.ui) >> 20];
-      bias = (tab >> 16) << 9;
-      scale = tab & 0xffff;
-
-      /* Grab next-highest mantissa bits and perform linear interpolation */
-      t = (f.ui >> 12) & 0xff;
-      return (uint8_t) ((bias + scale*t) >> 16);
-   }
+   /*
+    * This is taken from https://gist.github.com/rygorous/2203834
+    * Use LUT and do linear interpolation.
+    */
+   union {
+      uint32_t ui;
+      float f;
+   } almostone, minval, f;
+   unsigned tab, bias, scale, t;
+
+   almostone.ui = 0x3f7fffff;
+   minval.ui = (127-13) << 23;
+
+   /*
+    * Clamp to [2^(-13), 1-eps]; these two values map to 0 and 1, respectively.
+    * The tests are carefully written so that NaNs map to 0, same as in the
+    * reference implementation.
+    */
+   if (!(x > minval.f))
+      x = minval.f;
+   if (x > almostone.f)
+      x = almostone.f;
+
+   /* Do the table lookup and unpack bias, scale */
+   f.f = x;
+   tab = util_format_linear_to_srgb_helper_table[(f.ui - minval.ui) >> 20];
+   bias = (tab >> 16) << 9;
+   scale = tab & 0xffff;
+
+   /* Grab next-highest mantissa bits and perform linear interpolation */
+   t = (f.ui >> 12) & 0xff;
+   return (uint8_t) ((bias + scale*t) >> 16);
 }
 
 
@@ -112,7 +98,7 @@ util_format_linear_float_to_srgb_8unorm(float x)
  * linear RGB value in [0, 1].
  * Implemented with a 256-entry lookup table.
  */
-static INLINE float
+static inline float
 util_format_srgb_8unorm_to_linear_float(uint8_t x)
 {
    return util_format_srgb_8unorm_to_linear_float_table[x];
@@ -127,7 +113,7 @@ util_format_srgb_8unorm_to_linear_float(uint8_t x)
 /**
  * Convert a 8bit normalized value from linear to srgb.
  */
-static INLINE uint8_t
+static inline uint8_t
 util_format_linear_to_srgb_8unorm(uint8_t x)
 {
    return util_format_linear_to_srgb_8unorm_table[x];
@@ -137,7 +123,7 @@ util_format_linear_to_srgb_8unorm(uint8_t x)
 /**
  * Convert a 8bit normalized value from srgb to linear.
  */
-static INLINE uint8_t
+static inline uint8_t
 util_format_srgb_to_linear_8unorm(uint8_t x)
 {
    return util_format_srgb_to_linear_8unorm_table[x];
diff --git a/src/gallium/auxiliary/util/u_format_srgb.py b/src/util/format_srgb.py
similarity index 98%
rename from src/gallium/auxiliary/util/u_format_srgb.py
rename to src/util/format_srgb.py
index c6c02f0..d5cbcf7 100644
--- a/src/gallium/auxiliary/util/u_format_srgb.py
+++ b/src/util/format_srgb.py
@@ -109,7 +109,7 @@ def generate_srgb_tables():
         start = ((127 - numexp) << 23) + bucket*(bucketsize << stepshift)
         sum_a = 0.0
         sum_b = 0.0
- 
+
         for i in range(0, bucketsize):
             j = (i << stepshift) >> mantshift
             fint = start + (i << stepshift)
@@ -123,7 +123,7 @@ def generate_srgb_tables():
 
         scaled_a = solved_a * 65536.0 / 512.0
         scaled_b = solved_b * 65536.0
- 
+
         int_a = int(scaled_a + 0.5)
         int_b = int(scaled_b + 0.5)
 
@@ -146,9 +146,9 @@ def main():
     # This will print the copyright message on the top of this file
     print CopyRight.strip()
     print
-    print '#include "u_format_srgb.h"'
+    print '#include "format_srgb.h"'
     print
-    generate_srgb_tables()    
+    generate_srgb_tables()
 
 
 if __name__ == '__main__':




More information about the mesa-commit mailing list