From 992e1ea8e4290cf14d59f89415bfd13e0920aad7 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 24 Jul 2014 11:17:53 -0700 Subject: [PATCH] gallium: Move sRGB <-> RGB handling to libmesautil MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jason Ekstrand Reviewed-by: Marek Olšák --- 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 ++- .../u_format_srgb.h => util/format_srgb.h} | 88 ++++++++----------- .../u_format_srgb.py => util/format_srgb.py} | 8 +- 20 files changed, 79 insertions(+), 77 deletions(-) rename src/{gallium/auxiliary/util/u_format_srgb.h => util/format_srgb.h} (65%) rename src/{gallium/auxiliary/util/u_format_srgb.py => util/format_srgb.py} (98%) diff --git a/src/gallium/Automake.inc b/src/gallium/Automake.inc index 22ee166e3ba..74053eb2d82 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 727ed1f98e4..493d306f614 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 8919783c2df..3eae9e52526 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 31dfed316aa..94041d24778 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', ]) @@ -21,13 +22,6 @@ env.CodeGenerate( command = python_cmd + ' $SCRIPT > $TARGET' ) -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', diff --git a/src/gallium/auxiliary/util/u_format_pack.py b/src/gallium/auxiliary/util/u_format_pack.py index f9496de6c8a..a553e2346a9 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 11b46020bc3..7e05989e6a1 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 20500fd834f..1bea61151c6 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 ef48380ac6a..82741d275b9 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 915ee26ecac..48bc07974a2 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 352efe95d09..dc7b7f197a9 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 ebac1728f04..20c8b7df19c 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 76e4d4fd64e..886811b4b3b 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 a4e0407f5aa..ee930781480 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 87238077cf4..c5fa3fe5958 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 edc1e80a412..a816e2fea41 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 a2aeafc703b..e738ab08d2f 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 5daa731ce1d..b99aa25e86e 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 8afeedaf5e9..84803c016d9 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 740a9197460..8e92c38f461 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 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 c6c02f0538e..d5cbcf7646b 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__': -- 2.30.2