[Mesa-dev] [PATCH] st/mesa: handle SNORM formats in generic CopyPixels path
Jose Fonseca
jfonseca at vmware.com
Mon Jun 24 02:38:20 PDT 2013
----- Original Message -----
> On Mon, Jun 24, 2013 at 6:12 PM, Jose Fonseca <jfonseca at vmware.com> wrote:
> >
> >
> > ----- Original Message -----
> >> ---
> >> src/gallium/auxiliary/util/u_format.c | 14 ++++++++++++++
> >> src/gallium/auxiliary/util/u_format.h | 3 +++
> >> src/mesa/state_tracker/st_cb_drawpixels.c | 6 ++++++
> >> 3 files changed, 23 insertions(+)
> >>
> >> diff --git a/src/gallium/auxiliary/util/u_format.c
> >> b/src/gallium/auxiliary/util/u_format.c
> >> index 9bdc2ea..b70c108 100644
> >> --- a/src/gallium/auxiliary/util/u_format.c
> >> +++ b/src/gallium/auxiliary/util/u_format.c
> >> @@ -131,6 +131,20 @@ util_format_is_pure_uint(enum pipe_format format)
> >> return (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED &&
> >> desc->channel[i].pure_integer) ? TRUE : FALSE;
> >> }
> >>
> >> +boolean
> >> +util_format_is_snorm(enum pipe_format format)
> >> +{
> >> + const struct util_format_description *desc =
> >> util_format_description(format);
> >> + int i;
> >> +
> >> + i = util_format_get_first_non_void_channel(format);
> >> + if (i == -1)
> >> + return FALSE;
> >> +
> >> + return desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED &&
> >> + !desc->channel[i].pure_integer &&
> >> + desc->channel[i].normalized;
> >> +}
> >
> > This will give wrong results for mixed formats -- containing a mixture of
> > SIGNED and UNSIGNED normalized types. You can avoid that by adding this
> > statement
> >
> > if (desc->is_mixed) return FALSE at the start.
> >
> > I think a comment would be good too -- something like "Returns true if all
> > non-void channels are normalized signed."
> >
> > This is not your fault, but it is disappointing to see the proliferation of
> > redundant util_format_description() calls in these helpers.
> > util_format_description is not cost free, and st_CopyPixels and friends
> > keep calling it over and over again. I don't think it is hard to call
> > util_format_description() once, and then pass the format_desc pointers
> > around, but once we start on the other route is hard to back out. But as
> > they say -- when you're in a hole, the first thing to do is stop digging
> > --, so I think we should just stop adding new helper functions to util
> > u_format that take enum format instead of util_format_description.
>
> I hestiate to say this as no doubt I'll be wrong, but if they are all
> inline helpers, the compiler should figure it out and collapse the
> lookups. Of course I believe compilers should do lots of things...
It's not totally wrong what you say.
Ordinarily, a C compiler has no way to know that each call util_format_description() with same arguments the same result.
That is, it has no way to know that that util_format_description doesn't refer and modify other global state like:
const struct util_format_description *
util_format_description(format) {
static const struct util_format_description * last_format_description = &my_table;
return ++last_format_desciption;
}
Unless,
- unless the compiler is using whole-program-optimzation / link-time-optimization
- the implementation of util_format_description() is a header -- but that will make compilation time slow.
- there is some attribute to tell the compiler that a function has no side effects.
And I checked http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html and apparently there is actually some gcc attributes that could help here:
-- __attribute__((const))
-- __attribute__((pure))
But support with other compilers varies -- http://stackoverflow.com/questions/2798188/pure-const-function-attributes-in-different-compilers . declspec(noalias) comes close, http://msdn.microsoft.com/en-us/library/k649tyc7.aspx , but not sure if it works. It might be worth a try though.
Jose
More information about the mesa-dev
mailing list