[Mesa-dev] [PATCH 1/3] gallium/st: add pipe_context::generate_mipmap()
Michel Dänzer
michel at daenzer.net
Tue Jan 12 18:18:01 PST 2016
On 13.01.2016 04:20, Charmaine Lee wrote:
>
>> From: Michel Dänzer <michel at daenzer.net>
>> Sent: Monday, January 11, 2016 11:37 PM
>> To: Charmaine Lee
>> Cc: mesa-dev at lists.freedesktop.org
>> Subject: Re: [Mesa-dev] [PATCH 1/3] gallium/st: add pipe_context::generate_mipmap()
>
>> On 12.01.2016 15:18, Charmaine Lee wrote:
>>> This patch adds a new interface to support hardware mipmap generation.
>>> PIPE_CAP_GENERATE_MIPMAP is added to allow a driver to specify
>>> if this new interface is supported; if not supported, the state tracker will
>>> fallback to mipmap generation by rendering/texturing.
>>>
>>> v2: add PIPE_CAP_GENERATE_MIPMAP to the disabled section for all drivers
>
>> [...]
>
>>> diff --git a/src/gallium/drivers/trace/tr_context.c b/src/gallium/drivers/trace/tr_context.c
>>> index d4c88c9..17da64e 100644
>>> --- a/src/gallium/drivers/trace/tr_context.c
>>> +++ b/src/gallium/drivers/trace/tr_context.c
>>> @@ -1292,6 +1292,35 @@ trace_context_flush(struct pipe_context *_pipe,
>>>
>>>
>>> static inline void
>>> +trace_context_generate_mipmap(struct pipe_context *_pipe,
>>> + struct pipe_resource *res,
>>> + unsigned base_level,
>>> + unsigned last_level,
>>> + unsigned first_layer,
>>> + unsigned last_layer)
>>> +{
>>> + struct trace_context *tr_ctx = trace_context(_pipe);
>>> + struct pipe_context *pipe = tr_ctx->pipe;
>>> +
>>> + res = trace_resource_unwrap(tr_ctx, res);
>>> +
>>> + trace_dump_call_begin("pipe_context", "generate_mipmap");
>>> +
>>> + trace_dump_arg(ptr, pipe);
>>> + trace_dump_arg(ptr, res);
>>> +
>>> + trace_dump_arg(uint, base_level);
>>> + trace_dump_arg(uint, last_level);
>>> + trace_dump_arg(uint, first_layer);
>>> + trace_dump_arg(uint, last_layer);
>>> +
>>> + pipe->generate_mipmap(pipe, res, base_level, last_level, first_layer, last_layer);
>>> +
>>> + trace_dump_call_end();
>>> +}
>>> +
>>> +
>>> +static inline void
>>> trace_context_destroy(struct pipe_context *_pipe)
>>> {
>>> struct trace_context *tr_ctx = trace_context(_pipe);
>
>> [...]
>
>>> diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h
>>> index be7447d..a0774c7 100644
>>> --- a/src/gallium/include/pipe/p_context.h
>>> +++ b/src/gallium/include/pipe/p_context.h
>>> @@ -673,6 +673,17 @@ struct pipe_context {
>>> */
>>> void (*dump_debug_state)(struct pipe_context *ctx, FILE *stream,
>>> unsigned flags);
>>> +
>>> + /**
>>> + * Generate mipmap.
>>> + * \return TRUE if mipmap generation succeeds, FALSE otherwise
>>> + */
>>> + boolean (*generate_mipmap)(struct pipe_context *ctx,
>>> + struct pipe_resource *resource,
>>> + unsigned base_level,
>>> + unsigned last_level,
>>> + unsigned first_layer,
>>> + unsigned last_layer);
>>> };
>
>> Maybe I'm missing something, but the prototypes of the pipe_context
>> field and trace driver implementation don't match.
>
> Hmm. I don't know what you mean. They look correct to me.
The return types differ, void vs. boolean.
>>> diff --git a/src/mesa/state_tracker/st_gen_mipmap.c b/src/mesa/state_tracker/st_gen_mipmap.c
>>> index b370040..94c1171 100644
>>> --- a/src/mesa/state_tracker/st_gen_mipmap.c
>>> +++ b/src/mesa/state_tracker/st_gen_mipmap.c
>>> @@ -149,12 +149,19 @@ st_generate_mipmap(struct gl_context *ctx, GLenum target,
>>> last_layer = util_max_layer(pt, baseLevel);
>>> }
>>>
>>> - /* Try to generate the mipmap by rendering/texturing. If that fails,
>>> - * use the software fallback.
>>> + /* First see if the driver supports hardware mipmap generation,
>>> + * if not then generate the mipmap by rendering/texturing.
>>> + * If that fails, use the software fallback.
>>> */
>>> - if (!util_gen_mipmap(st->pipe, pt, pt->format, baseLevel, lastLevel,
>>> - first_layer, last_layer, PIPE_TEX_FILTER_LINEAR)) {
>>> - _mesa_generate_mipmap(ctx, target, texObj);
>>> + if (!st->pipe->screen->get_param(st->pipe->screen,
>>> + PIPE_CAP_GENERATE_MIPMAP) ||
>>> + !st->pipe->generate_mipmap(st->pipe, pt, baseLevel, lastLevel,
>>> + first_layer, last_layer)) {
>>> +
>>> + if (!util_gen_mipmap(st->pipe, pt, pt->format, baseLevel, lastLevel,
>>> + first_layer, last_layer, PIPE_TEX_FILTER_LINEAR)) {
>>> + _mesa_generate_mipmap(ctx, target, texObj);
>>> + }
>>> }
>
>> Do we really need a cap for this? Drivers not implementing this hook can
>> just leave it at NULL, then state trackers can fall back and wrapper
>> drivers can return false in that case.
>
> My initial attempt was to check for NULL too, but Jose pointed out to me that we need a cap
> for this capability. This makes trace/svga implementation a little simpler.
I'd be interested in why that is, if either of you has the time to
enlighten me. :)
--
Earthling Michel Dänzer | http://www.amd.com
Libre software enthusiast | Mesa and X developer
More information about the mesa-dev
mailing list