Commit 992e1ea8 authored by Jason Ekstrand's avatar Jason Ekstrand

gallium: Move sRGB <-> RGB handling to libmesautil

Signed-off-by: Jason Ekstrand's avatarJason Ekstrand <jason.ekstrand@intel.com>
Reviewed-by: default avatarMarek Olšák <marek.olsak@amd.com>
parent efa0aa8f
......@@ -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'])
......
......@@ -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:
......
MESA_UTIL_FILES := \
hash_table.c \
ralloc.c
MESA_UTIL_GENERATED_FILES = \
format_srgb.c
......@@ -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;
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];
......
......@@ -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__':
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment