[Mesa-dev] [PATCH 01/64] i965: Drop Max3DTextureLevels to 512 on Sandy Bridge and prior

Ian Romanick idr at freedesktop.org
Thu Jun 16 19:40:28 UTC 2016


On 06/16/2016 11:50 AM, Jason Ekstrand wrote:
> 
> 
> On Thu, Jun 16, 2016 at 11:43 AM, Ian Romanick <idr at freedesktop.org
> <mailto:idr at freedesktop.org>> wrote:
> 
>     On 06/11/2016 09:02 AM, Jason Ekstrand wrote:
>     > The RenderTargetViewExtent field of RENDER_SURFACE_STATE is supposed to be
>     > set to the depth of a 3-D texture when rendering.  Unfortunatley, that
>                                                          Unfortunately
> 
>     > field is only 9 bits on Sandy Bridge and prior so we can't actually bind
>     > a 3-D texturing for rendering if it has depth > 512.  On Ivy Bridge, this
>     > field was bumpped to 11 bits so we can go all the way up to 2048.
>                 bumped
> 
>     > Cc: "11.1 11.2 12.0" <mesa-stable at lists.freedesktop.org
>     <mailto:mesa-stable at lists.freedesktop.org>>
>     > ---
>     >  src/mesa/drivers/dri/i965/brw_context.c | 5 ++++-
>     >  1 file changed, 4 insertions(+), 1 deletion(-)
>     >
>     > diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
>     > index 7bbc128..3b11bef 100644
>     > --- a/src/mesa/drivers/dri/i965/brw_context.c
>     > +++ b/src/mesa/drivers/dri/i965/brw_context.c
>     > @@ -467,7 +467,10 @@ brw_initialize_context_constants(struct brw_context *brw)
>     >     ctx->Const.MaxImageUnits = MAX_IMAGE_UNITS;
>     >     ctx->Const.MaxRenderbufferSize = 8192;
>     >     ctx->Const.MaxTextureLevels = MIN2(14 /* 8192 */, MAX_TEXTURE_LEVELS);
>     > -   ctx->Const.Max3DTextureLevels = 12; /* 2048 */
>     > +   if (brw->gen >= 7)
>     > +      ctx->Const.Max3DTextureLevels = 12; /* 2048 */
>     > +   else
>     > +      ctx->Const.Max3DTextureLevels = 10; /* 512 */
> 
>     This should use ?: like MaxArrayTextureLayers below.
> 
>     This was increased from 512 to 2048 in 2014 in commit 06b047eb.  There
>     was some assertion in the commit message that the Windows driver was
>     already advertising 2048.  There is no mention, however, of which
>     hardware the Windows driver was checked on.  In the related bug report
>     (https://bugs.freedesktop.org/show_bug.cgi?id=74130), Ken says, "All
>     Gen4+ systems support 2048x2048 3D textures, so we could just bump the
>     limit."
> 
>     It sounds like this may be a temporary fix, and we need a work around
>     for rendering to slices > 9?
> 
> It's a bit more subtle than that, I'm afraid.  The current gen4 render
> target setup code (which isn't used on SNB) can handle rendering to any
> layer of a 3-D texture regardless of size and SNB could be fixed up to
> do the same.  The problem is when you use layered rendering.  When doing
> layered rendering, we can only access at most 512 layers.  This means
> that we need to either limit the texture size or we need to give the
> user an incomplete framebuffer if they try and do layered rendering on a
> 3-D texture with more than 512 slices.  That's kind-of a nasty edge for
> applications to hit.

Oh yuck.  It is mean to give a spurious incomplete framebuffer, but
reducing a limit can make a previously working app fail... also mean.
I think there's a less-mean plan possible.  I believe these are the
facts:

 * Gen4 and Gen5 don't have layered rendering, so Max3DTextureLevels =
   12 should "just work" there.

 * According to http://feedback.wildfiregames.com/report/opengl/device/Intel%28R%29%20HD%20Graphics%203000,
   the Windows driver only supports OpenGL 3.1, so they never had the
   layered rendering issue.  They also advertise 2048 starting with
   driver version 9.17.10.2792.

 * In OpenGL ES and OpenGL Compatibility profile, there is no way to do
   layered rendering on SNB with our driver.

 * With a bit of work, we could handle 2048 on SNB for all non-layered
   rendering cases.

Assuming that's all correct, how about if we change the current patch to

   ctx->Const.Max3DTextureLevels = brw->gen == 6 ? 9 /* 512 */ : 12 /* 2048 */;

and add a release note.

For 12.next let's plan to do Gen4-style layer offsetting for SNB.  Then
change the limit setting code to

   ctx->Const.Max3DTextureLevels = brw->gen == 6 && ctx->API == API_OPENGL_CORE
      ? 9 /* 512 */ : 12 /* 2048 */;

We can also add a driconf option to force 2048.

A "patches welcome" follow-up would be to implement
GL_NV_deep_texture3D to expose width or height of 2048 with depth
limited to 512.

> --Jason
> 
>     >     ctx->Const.MaxCubeTextureLevels = 14; /* 8192 */
>     >     ctx->Const.MaxArrayTextureLayers = brw->gen >= 7 ? 2048 : 512;
>     >     ctx->Const.MaxTextureMbytes = 1536;
>     >



More information about the mesa-dev mailing list