[Mesa-dev] [PATCH] mesa: Change driver interface for ARB_viewport_array
Ian Romanick
idr at freedesktop.org
Fri Nov 1 14:59:52 PDT 2013
On 11/01/2013 02:43 PM, Ian Romanick wrote:
> On 11/01/2013 02:04 PM, Courtney Goeltzenleuchter wrote:
>>
>> On Fri, Nov 1, 2013 at 1:51 PM, Ian Romanick <idr at freedesktop.org
>> <mailto:idr at freedesktop.org>> wrote:
>>
>> On 10/31/2013 08:55 AM, Courtney Goeltzenleuchter wrote:
>> > Add the index parameter to the Scissor, Viewport and
>> > DepthRange driver methods. Update i965 and Gallium
>> > to the change. Index always 0.
>>
>> I just sent out a patch series that cleans up a bunch of the driver
>> implementations of dd_function_table::Viewport. One thing is worth
>> noting... no driver uses any of the x, y, width, or height parameters
>> passed to Viewport. I think we should just eliminate those parameters
>> altogether.
>>
>> It also appears that every driver that implements
>> dd_function_table::DepthRange uses the same (or nearly the same)
>> implementation as dd_function_table::Viewport... and the parameters to
>> it are also unused. We should eliminate those parameters as well.
>>
>> For dd_function_table::Scissor, it looks like i830 and i915 both use the
>> parameters passed. I'm on the fence whether those should be modified to
>> just look in the context (like other drivers do). Do you think that
>> would simplify later patches?
>>
>> When I was writing this it troubled me that I was having to change
>> driver code beyond the actual dd interface. It gets uglier when I extend
>> the Viewport and Scissor attributes to be arrays. There are a lot of
>> driver files touched.
As a side note... this is part of the reason that small, self-contained
patches are preferred. It makes it much easier to review a bunch of
mechanical changes in 7 different drivers...
>> Isn't the dd interface supposed to help shield the driver from such
>> changes? It would make future patches for ARB_viewport_array simpler if
>> the drivers _did_ use the parameters from the dd interface. Then I
>> wouldn't have to change driver elements as I extend the Mesa side to
>> support viewport_arrays and only drivers that supported viewport_arrays
>> would have to worry about an array index other than 0. I'd be curious to
>> hear what the philosophy is around the dd interface. What would be
>> right? Why?
>
> A lot of the functions in dd_function_table are based on the premise
> that drivers will emit some sort of commands when a particular GL
> function is called. For a variety of reasons, no driver does that for
> most functions (including glViewport, glDepthRange, and glScissor). The
> alternative would be for the driver to make a copy of the parameters to
> generate the command later, but the data is already stored in the
> context. That seems rather pointless.
>
> More often, the dd_function_table functions allow core Mesa to signal
> the driver driver that something happened... and the driver may need to
> do something in response. For DRI2 drivers, the Viewport function is a
> good example. DRI2 drivers use that signal as a hint that the window
> may have been resized.
>
> Other dd_function_table functions are used by core Mesa to request the
> driver create or destroy some resource (e.g., texture storage).
>
> If it weren't for the way nouveau used the DepthRange and Scissor hooks,
> I think we could just about get rid of them altogether. I wish that
> driver just used the dirty state bits like everyone else. :(
>
>> It would appear that it's common practice to grab the viewport, scissor
>> and depth data right out of the gl_context structure. If all the drivers
>> are going to get the data straight from the gl_context structure then
>> removing the unused parameters seems like a good idea to me. I'll put
>> that into the next round.
>>
>> Appreciate the feedback.
>>
>>
>>
>> Also... since this is modifying three separate functions, it should be
>> three patches.
>>
>> > ---
>> > src/mesa/drivers/common/driverfuncs.c | 2 +-
>> > src/mesa/drivers/dri/i965/brw_context.c | 4 ++--
>> > src/mesa/drivers/dri/i965/brw_context.h | 2 +-
>> > src/mesa/drivers/dri/swrast/swrast.c | 3 ++-
>> > src/mesa/main/dd.h | 10 +++++++---
>> > src/mesa/main/scissor.c | 2 +-
>> > src/mesa/main/viewport.c | 4 ++--
>> > src/mesa/state_tracker/st_cb_viewport.c | 3 ++-
>> > 8 files changed, 18 insertions(+), 12 deletions(-)
>> >
>> > diff --git a/src/mesa/drivers/common/driverfuncs.c
>> b/src/mesa/drivers/common/driverfuncs.c
>> > index 5faa98a..e45dc0e 100644
>> > --- a/src/mesa/drivers/common/driverfuncs.c
>> > +++ b/src/mesa/drivers/common/driverfuncs.c
>> > @@ -299,7 +299,7 @@ _mesa_init_driver_state(struct gl_context *ctx)
>> > ctx->Driver.LogicOpcode(ctx, ctx->Color.LogicOp);
>> > ctx->Driver.PointSize(ctx, ctx->Point.Size);
>> > ctx->Driver.PolygonStipple(ctx, (const GLubyte *)
>> ctx->PolygonStipple);
>> > - ctx->Driver.Scissor(ctx, ctx->Scissor.X, ctx->Scissor.Y,
>> > + ctx->Driver.Scissor(ctx, 0, ctx->Scissor.X, ctx->Scissor.Y,
>> > ctx->Scissor.Width, ctx->Scissor.Height);
>> > ctx->Driver.ShadeModel(ctx, ctx->Light.ShadeModel);
>> > ctx->Driver.StencilFuncSeparate(ctx, GL_FRONT,
>> > diff --git a/src/mesa/drivers/dri/i965/brw_context.c
>> b/src/mesa/drivers/dri/i965/brw_context.c
>> > index 3880e18..5b4d662d 100644
>> > --- a/src/mesa/drivers/dri/i965/brw_context.c
>> > +++ b/src/mesa/drivers/dri/i965/brw_context.c
>> > @@ -125,13 +125,13 @@ intelGetString(struct gl_context * ctx,
>> GLenum name)
>> > }
>> >
>> > static void
>> > -intel_viewport(struct gl_context *ctx, GLint x, GLint y, GLsizei
>> w, GLsizei h)
>> > +intel_viewport(struct gl_context *ctx, GLuint idx, GLint x, GLint
>> y, GLsizei w, GLsizei h)
>> > {
>> > struct brw_context *brw = brw_context(ctx);
>> > __DRIcontext *driContext = brw->driContext;
>> >
>> > if (brw->saved_viewport)
>> > - brw->saved_viewport(ctx, x, y, w, h);
>> > + brw->saved_viewport(ctx, idx, x, y, w, h);
>> >
>> > if (_mesa_is_winsys_fbo(ctx->DrawBuffer)) {
>> > dri2InvalidateDrawable(driContext->driDrawablePriv);
>> > diff --git a/src/mesa/drivers/dri/i965/brw_context.h
>> b/src/mesa/drivers/dri/i965/brw_context.h
>> > index 3be2138..c261ae8 100644
>> > --- a/src/mesa/drivers/dri/i965/brw_context.h
>> > +++ b/src/mesa/drivers/dri/i965/brw_context.h
>> > @@ -1411,7 +1411,7 @@ struct brw_context
>> >
>> > __DRIcontext *driContext;
>> > struct intel_screen *intelScreen;
>> > - void (*saved_viewport)(struct gl_context *ctx,
>> > + void (*saved_viewport)(struct gl_context *ctx, GLuint idx,
>> > GLint x, GLint y, GLsizei width,
>> GLsizei height);
>> > };
>> >
>> > diff --git a/src/mesa/drivers/dri/swrast/swrast.c
>> b/src/mesa/drivers/dri/swrast/swrast.c
>> > index bfa2efd..ffb1fa0 100644
>> > --- a/src/mesa/drivers/dri/swrast/swrast.c
>> > +++ b/src/mesa/drivers/dri/swrast/swrast.c
>> > @@ -618,7 +618,8 @@ update_state( struct gl_context *ctx, GLuint
>> new_state )
>> > }
>> >
>> > static void
>> > -viewport(struct gl_context *ctx, GLint x, GLint y, GLsizei w,
>> GLsizei h)
>> > +viewport(struct gl_context *ctx, GLuint idx,
>> > + GLint x, GLint y, GLsizei w, GLsizei h)
>> > {
>> > struct gl_framebuffer *draw = ctx->WinSysDrawBuffer;
>> > struct gl_framebuffer *read = ctx->WinSysReadBuffer;
>> > diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
>> > index 5011921..7f57a39 100644
>> > --- a/src/mesa/main/dd.h
>> > +++ b/src/mesa/main/dd.h
>> > @@ -479,7 +479,8 @@ struct dd_function_table {
>> > /** Enable or disable writing into the depth buffer */
>> > void (*DepthMask)(struct gl_context *ctx, GLboolean flag);
>> > /** Specify mapping of depth values from NDC to window
>> coordinates */
>> > - void (*DepthRange)(struct gl_context *ctx, GLclampd nearval,
>> GLclampd farval);
>> > + void (*DepthRange)(struct gl_context *ctx, GLuint idx,
>> > + GLclampd nearval, GLclampd farval);
>> > /** Specify the current buffer for writing */
>> > void (*DrawBuffer)( struct gl_context *ctx, GLenum buffer );
>> > /** Specify the buffers for writing for fragment programs*/
>> > @@ -519,7 +520,9 @@ struct dd_function_table {
>> > /** Set rasterization mode */
>> > void (*RenderMode)(struct gl_context *ctx, GLenum mode );
>> > /** Define the scissor box */
>> > - void (*Scissor)(struct gl_context *ctx, GLint x, GLint y,
>> GLsizei w, GLsizei h);
>> > + void (*Scissor)(struct gl_context *ctx, GLuint idx,
>> > + GLint x, GLint y,
>> > + GLsizei width, GLsizei height);
>> > /** Select flat or smooth shading */
>> > void (*ShadeModel)(struct gl_context *ctx, GLenum mode);
>> > /** OpenGL 2.0 two-sided StencilFunc */
>> > @@ -541,7 +544,8 @@ struct dd_function_table {
>> > struct gl_texture_object *texObj,
>> > GLenum pname, const GLfloat *params);
>> > /** Set the viewport */
>> > - void (*Viewport)(struct gl_context *ctx, GLint x, GLint y,
>> GLsizei w, GLsizei h);
>> > + void (*Viewport)(struct gl_context *ctx, GLuint idx,
>> > + GLint x, GLint y, GLsizei w, GLsizei h);
>> > /*@}*/
>> >
>> >
>> > diff --git a/src/mesa/main/scissor.c b/src/mesa/main/scissor.c
>> > index 0eddaa6..4eb6337 100644
>> > --- a/src/mesa/main/scissor.c
>> > +++ b/src/mesa/main/scissor.c
>> > @@ -79,7 +79,7 @@ _mesa_set_scissor(struct gl_context *ctx,
>> > ctx->Scissor.Height = height;
>> >
>> > if (ctx->Driver.Scissor)
>> > - ctx->Driver.Scissor( ctx, x, y, width, height );
>> > + ctx->Driver.Scissor( ctx, 0, x, y, width, height );
>> > }
>> >
>> >
>> > diff --git a/src/mesa/main/viewport.c b/src/mesa/main/viewport.c
>> > index 91578ba..5da10ba 100644
>> > --- a/src/mesa/main/viewport.c
>> > +++ b/src/mesa/main/viewport.c
>> > @@ -99,7 +99,7 @@ _mesa_set_viewport(struct gl_context *ctx, GLint
>> x, GLint y,
>> > /* Many drivers will use this call to check for window size
>> changes
>> > * and reallocate the z/stencil/accum/etc buffers if needed.
>> > */
>> > - ctx->Driver.Viewport(ctx, x, y, width, height);
>> > + ctx->Driver.Viewport(ctx, 0, x, y, width, height);
>> > }
>> > }
>> >
>> > @@ -143,7 +143,7 @@ _mesa_DepthRange(GLclampd nearval, GLclampd
>> farval)
>> > #endif
>> >
>> > if (ctx->Driver.DepthRange) {
>> > - ctx->Driver.DepthRange(ctx, nearval, farval);
>> > + ctx->Driver.DepthRange(ctx, 0, nearval, farval);
>> > }
>> > }
>> >
>> > diff --git a/src/mesa/state_tracker/st_cb_viewport.c
>> b/src/mesa/state_tracker/st_cb_viewport.c
>> > index d654ed6..d48127e 100644
>> > --- a/src/mesa/state_tracker/st_cb_viewport.c
>> > +++ b/src/mesa/state_tracker/st_cb_viewport.c
>> > @@ -48,7 +48,8 @@ st_ws_framebuffer(struct gl_framebuffer *fb)
>> > return NULL;
>> > }
>> >
>> > -static void st_viewport(struct gl_context * ctx, GLint x, GLint y,
>> > +static void st_viewport(struct gl_context * ctx, GLuint idx,
>> > + GLint x, GLint y,
>> > GLsizei width, GLsizei height)
>> > {
>> > struct st_context *st = ctx->st;
>> >
>> --
>> Courtney Goeltzenleuchter
>> LunarG
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list