gallium: Move sRGB <-> RGB handling to libmesautil
Signed-off-by: Jason Ekstrand <jason.ekstrand@intel.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
@@ -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 \
|
||||
|
||||
@@ -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 > $@
|
||||
|
||||
@@ -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 := \
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ env.Append(CPPPATH = [
|
||||
])
|
||||
|
||||
env.Prepend(LIBS = [
|
||||
mesautils,
|
||||
gallium,
|
||||
'gdi32',
|
||||
'user32',
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -7,6 +7,7 @@ env = env.Clone()
|
||||
|
||||
env.Prepend(LIBS = [
|
||||
ws_xlib,
|
||||
mesautil,
|
||||
gallium,
|
||||
])
|
||||
|
||||
|
||||
@@ -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) \
|
||||
|
||||
@@ -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'])
|
||||
|
||||
@@ -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'])
|
||||
|
||||
+10
-1
@@ -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:
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
MESA_UTIL_FILES := \
|
||||
hash_table.c \
|
||||
ralloc.c
|
||||
|
||||
MESA_UTIL_GENERATED_FILES = \
|
||||
format_srgb.c
|
||||
|
||||
+11
-1
@@ -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',
|
||||
|
||||
@@ -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;
|
||||
/*
|
||||
* 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;
|
||||
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;
|
||||
/*
|
||||
* 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;
|
||||
/* 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);
|
||||
}
|
||||
/* 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];
|
||||
@@ -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__':
|
||||
Reference in New Issue
Block a user