[Mesa-dev] [PATCH] st/mesa: fix pbo uploads

2016-02-17 Thread Ilia Mirkin
 - LOD must be provided in .w for TXF (even for buffer textures)
 - User buffer must be valid at draw time
 - Must have a sampler associated with the sampler view

This makes PBO uploads work again on nouveau.

Signed-off-by: Ilia Mirkin 
---
 src/mesa/state_tracker/st_cb_texture.c | 26 --
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/src/mesa/state_tracker/st_cb_texture.c 
b/src/mesa/state_tracker/st_cb_texture.c
index d09c360..eb09f3d 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -1272,10 +1272,11 @@ create_pbo_upload_fs(struct st_context *st)
   ureg_scalar(ureg_src(temp0), TGSI_SWIZZLE_X));
}
 
+   /* temp0.w = 0 */
+   ureg_MOV(ureg, ureg_writemask(temp0, TGSI_WRITEMASK_W), ureg_imm1u(ureg, 
0));
+
/* out = txf(sampler, temp0.x) */
-   ureg_TXF(ureg, out, TGSI_TEXTURE_BUFFER,
-  ureg_scalar(ureg_src(temp0), TGSI_SWIZZLE_X),
-  sampler);
+   ureg_TXF(ureg, out, TGSI_TEXTURE_BUFFER, ureg_src(temp0), sampler);
 
ureg_release_temporary(ureg, temp0);
 
@@ -1353,6 +1354,7 @@ try_pbo_upload_common(struct gl_context *ctx,
  + (upload_height - 1 + (depth - 1) * image_height) * stride;
   struct pipe_sampler_view templ;
   struct pipe_sampler_view *sampler_view;
+  struct pipe_sampler_state sampler = {0}, *samplers[1] = {&sampler};
 
   /* This should be ensured by Mesa before calling our callbacks */
   assert((last_element + 1) * bytes_per_pixel <= buffer->width0);
@@ -1361,6 +1363,7 @@ try_pbo_upload_common(struct gl_context *ctx,
  goto fail;
 
   memset(&templ, 0, sizeof(templ));
+  templ.target = PIPE_BUFFER;
   templ.format = src_format;
   templ.u.buf.first_element = first_element;
   templ.u.buf.last_element = last_element;
@@ -1376,6 +1379,8 @@ try_pbo_upload_common(struct gl_context *ctx,
   cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, 1, &sampler_view);
 
   pipe_sampler_view_reference(&sampler_view, NULL);
+
+  cso_set_samplers(cso, PIPE_SHADER_FRAGMENT, 1, samplers);
}
 
/* Upload vertices */
@@ -1423,16 +1428,17 @@ try_pbo_upload_common(struct gl_context *ctx,
}
 
/* Upload constants */
+   /* Note: the user buffer must be valid until draw time */
+   struct {
+  int32_t xoffset;
+  int32_t yoffset;
+  int32_t stride;
+  int32_t image_size;
+   } constants;
+
{
   struct pipe_constant_buffer cb;
 
-  struct {
- int32_t xoffset;
- int32_t yoffset;
- int32_t stride;
- int32_t image_size;
-  } constants;
-
   constants.xoffset = -xoffset + skip_pixels;
   constants.yoffset = -yoffset;
   constants.stride = stride;
-- 
2.4.10

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] st/mesa: fix pbo uploads

2016-02-17 Thread Ilia Mirkin
On Thu, Feb 18, 2016 at 1:07 AM, Ilia Mirkin  wrote:
>  - LOD must be provided in .w for TXF (even for buffer textures)
>  - User buffer must be valid at draw time
>  - Must have a sampler associated with the sampler view
>
> This makes PBO uploads work again on nouveau.
>
> Signed-off-by: Ilia Mirkin 
> ---

Just realized that I also need to add CSO_BIT_FRAGMENT_SAMPLERS to the
save state. And also fixed a minor warning in my tree. Too minor to
resend, but final version available here:
https://github.com/imirkin/mesa/commit/c246a0e.patch

>  src/mesa/state_tracker/st_cb_texture.c | 26 --
>  1 file changed, 16 insertions(+), 10 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_cb_texture.c 
> b/src/mesa/state_tracker/st_cb_texture.c
> index d09c360..eb09f3d 100644
> --- a/src/mesa/state_tracker/st_cb_texture.c
> +++ b/src/mesa/state_tracker/st_cb_texture.c
> @@ -1272,10 +1272,11 @@ create_pbo_upload_fs(struct st_context *st)
>ureg_scalar(ureg_src(temp0), TGSI_SWIZZLE_X));
> }
>
> +   /* temp0.w = 0 */
> +   ureg_MOV(ureg, ureg_writemask(temp0, TGSI_WRITEMASK_W), ureg_imm1u(ureg, 
> 0));
> +
> /* out = txf(sampler, temp0.x) */
> -   ureg_TXF(ureg, out, TGSI_TEXTURE_BUFFER,
> -  ureg_scalar(ureg_src(temp0), TGSI_SWIZZLE_X),
> -  sampler);
> +   ureg_TXF(ureg, out, TGSI_TEXTURE_BUFFER, ureg_src(temp0), sampler);
>
> ureg_release_temporary(ureg, temp0);
>
> @@ -1353,6 +1354,7 @@ try_pbo_upload_common(struct gl_context *ctx,
>   + (upload_height - 1 + (depth - 1) * image_height) * stride;
>struct pipe_sampler_view templ;
>struct pipe_sampler_view *sampler_view;
> +  struct pipe_sampler_state sampler = {0}, *samplers[1] = {&sampler};
>
>/* This should be ensured by Mesa before calling our callbacks */
>assert((last_element + 1) * bytes_per_pixel <= buffer->width0);
> @@ -1361,6 +1363,7 @@ try_pbo_upload_common(struct gl_context *ctx,
>   goto fail;
>
>memset(&templ, 0, sizeof(templ));
> +  templ.target = PIPE_BUFFER;
>templ.format = src_format;
>templ.u.buf.first_element = first_element;
>templ.u.buf.last_element = last_element;
> @@ -1376,6 +1379,8 @@ try_pbo_upload_common(struct gl_context *ctx,
>cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, 1, &sampler_view);
>
>pipe_sampler_view_reference(&sampler_view, NULL);
> +
> +  cso_set_samplers(cso, PIPE_SHADER_FRAGMENT, 1, samplers);
> }
>
> /* Upload vertices */
> @@ -1423,16 +1428,17 @@ try_pbo_upload_common(struct gl_context *ctx,
> }
>
> /* Upload constants */
> +   /* Note: the user buffer must be valid until draw time */
> +   struct {
> +  int32_t xoffset;
> +  int32_t yoffset;
> +  int32_t stride;
> +  int32_t image_size;
> +   } constants;
> +
> {
>struct pipe_constant_buffer cb;
>
> -  struct {
> - int32_t xoffset;
> - int32_t yoffset;
> - int32_t stride;
> - int32_t image_size;
> -  } constants;
> -
>constants.xoffset = -xoffset + skip_pixels;
>constants.yoffset = -yoffset;
>constants.stride = stride;
> --
> 2.4.10
>
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] st/mesa: fix pbo uploads

2016-02-18 Thread Marek Olšák
On Thu, Feb 18, 2016 at 7:07 AM, Ilia Mirkin  wrote:
>  - LOD must be provided in .w for TXF (even for buffer textures)

TXF on BUFFER should ignore the LOD.

>  - User buffer must be valid at draw time
>  - Must have a sampler associated with the sampler view

TXF doesn't use the sampler state.

Marek
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] st/mesa: fix pbo uploads

2016-02-18 Thread Ilia Mirkin
On Feb 18, 2016 6:16 AM, "Marek Olšák"  wrote:
>
> On Thu, Feb 18, 2016 at 7:07 AM, Ilia Mirkin  wrote:
> >  - LOD must be provided in .w for TXF (even for buffer textures)
>
> TXF on BUFFER should ignore the LOD.

No such exception in the docs. Nouveau expects it to be set to 0.

>
> >  - User buffer must be valid at draw time
> >  - Must have a sampler associated with the sampler view
>
> TXF doesn't use the sampler state.

I agree in principle. In practice, I got all black rendering without this.
The alternative is reverting the pbo patches since they regress nouveau...
This seemed like the more appealing solution.

  -ilia
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] st/mesa: fix pbo uploads

2016-02-18 Thread Roland Scheidegger
Am 18.02.2016 um 16:34 schrieb Ilia Mirkin:
> On Feb 18, 2016 6:16 AM, "Marek Olšák"  > wrote:
>>
>> On Thu, Feb 18, 2016 at 7:07 AM, Ilia Mirkin  > wrote:
>> >  - LOD must be provided in .w for TXF (even for buffer textures)
>>
>> TXF on BUFFER should ignore the LOD.
> 
> No such exception in the docs. Nouveau expects it to be set to 0.
> 
>>
>> >  - User buffer must be valid at draw time
>> >  - Must have a sampler associated with the sampler view
>>
>> TXF doesn't use the sampler state.
> 
> I agree in principle. In practice, I got all black rendering without
> this. The alternative is reverting the pbo patches since they regress
> nouveau... This seemed like the more appealing solution.
> 

Well, if you do a texelFetch in GLSL GL would still consider the texture
incomplete depending on the sampler state - if the sampler state is
actually used or not doesn't matter (albeit not all drivers might agree).

Roland

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] st/mesa: fix pbo uploads

2016-02-18 Thread Ilia Mirkin
On Thu, Feb 18, 2016 at 11:36 AM, Nicolai Hähnle
 wrote:
> On 18.02.2016 01:26, Ilia Mirkin wrote:
>>
>> On Thu, Feb 18, 2016 at 1:07 AM, Ilia Mirkin  wrote:
>>>
>>>   - LOD must be provided in .w for TXF (even for buffer textures)
>>>   - User buffer must be valid at draw time
>
>
> Good catch.
>
>>>   - Must have a sampler associated with the sampler view
>
>
> Fine by me. Honestly, I'd prefer to relax the requirements for TXF/buffer
> textures, but if that's difficult for Nouveau I can accept it.

I have no clue why nouveau breaks without it. It should totally work.
Even in the instruction decoding by nvdisasm, the sampler reference
isn't even listed. And yet... it doesn't work, and I just get all
black -- on both a GT215 (tesla, dx10) and a GF108 (fermi, dx11).
Perhaps the sampler reference encoded within the op is required to
exist, even if it's not used? Perhaps the TIC (tex descriptor) somehow
refers to the TSC (sampler descriptor) and could be made to somehow
not refer to it? Unfortunately I don't know, and am not extremely
inclined to RE it -- the blob driver always uses "linked tsc" mode,
which means that there's a 1:1 correspondence between textures and
samplers; I assume that this mode is not used in DX10/DX11, but I have
no way of tracing that. And this situation never comes up in st/mesa
otherwise...

>
> Reviewed-by: Nicolai Hähnle 

Thanks!

>
>
>>>
>>> This makes PBO uploads work again on nouveau.
>>>
>>> Signed-off-by: Ilia Mirkin 
>>> ---
>>
>>
>> Just realized that I also need to add CSO_BIT_FRAGMENT_SAMPLERS to the
>> save state. And also fixed a minor warning in my tree. Too minor to
>> resend, but final version available here:
>> https://github.com/imirkin/mesa/commit/c246a0e.patch
>>
>>>   src/mesa/state_tracker/st_cb_texture.c | 26 --
>>>   1 file changed, 16 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/src/mesa/state_tracker/st_cb_texture.c
>>> b/src/mesa/state_tracker/st_cb_texture.c
>>> index d09c360..eb09f3d 100644
>>> --- a/src/mesa/state_tracker/st_cb_texture.c
>>> +++ b/src/mesa/state_tracker/st_cb_texture.c
>>> @@ -1272,10 +1272,11 @@ create_pbo_upload_fs(struct st_context *st)
>>> ureg_scalar(ureg_src(temp0), TGSI_SWIZZLE_X));
>>>  }
>>>
>>> +   /* temp0.w = 0 */
>>> +   ureg_MOV(ureg, ureg_writemask(temp0, TGSI_WRITEMASK_W),
>>> ureg_imm1u(ureg, 0));
>>> +
>>>  /* out = txf(sampler, temp0.x) */
>>> -   ureg_TXF(ureg, out, TGSI_TEXTURE_BUFFER,
>>> -  ureg_scalar(ureg_src(temp0), TGSI_SWIZZLE_X),
>>> -  sampler);
>>> +   ureg_TXF(ureg, out, TGSI_TEXTURE_BUFFER, ureg_src(temp0), sampler);
>>>
>>>  ureg_release_temporary(ureg, temp0);
>>>
>>> @@ -1353,6 +1354,7 @@ try_pbo_upload_common(struct gl_context *ctx,
>>>+ (upload_height - 1 + (depth - 1) * image_height) * stride;
>>> struct pipe_sampler_view templ;
>>> struct pipe_sampler_view *sampler_view;
>>> +  struct pipe_sampler_state sampler = {0}, *samplers[1] =
>>> {&sampler};
>>>
>>> /* This should be ensured by Mesa before calling our callbacks */
>>> assert((last_element + 1) * bytes_per_pixel <= buffer->width0);
>>> @@ -1361,6 +1363,7 @@ try_pbo_upload_common(struct gl_context *ctx,
>>>goto fail;
>>>
>>> memset(&templ, 0, sizeof(templ));
>>> +  templ.target = PIPE_BUFFER;
>>> templ.format = src_format;
>>> templ.u.buf.first_element = first_element;
>>> templ.u.buf.last_element = last_element;
>>> @@ -1376,6 +1379,8 @@ try_pbo_upload_common(struct gl_context *ctx,
>>> cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, 1,
>>> &sampler_view);
>>>
>>> pipe_sampler_view_reference(&sampler_view, NULL);
>>> +
>>> +  cso_set_samplers(cso, PIPE_SHADER_FRAGMENT, 1, samplers);
>>>  }
>>>
>>>  /* Upload vertices */
>>> @@ -1423,16 +1428,17 @@ try_pbo_upload_common(struct gl_context *ctx,
>>>  }
>>>
>>>  /* Upload constants */
>>> +   /* Note: the user buffer must be valid until draw time */
>>> +   struct {
>>> +  int32_t xoffset;
>>> +  int32_t yoffset;
>>> +  int32_t stride;
>>> +  int32_t image_size;
>>> +   } constants;
>>> +
>>>  {
>>> struct pipe_constant_buffer cb;
>>>
>>> -  struct {
>>> - int32_t xoffset;
>>> - int32_t yoffset;
>>> - int32_t stride;
>>> - int32_t image_size;
>>> -  } constants;
>>> -
>>> constants.xoffset = -xoffset + skip_pixels;
>>> constants.yoffset = -yoffset;
>>> constants.stride = stride;
>>> --
>>> 2.4.10
>>>
>
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] st/mesa: fix pbo uploads

2016-02-18 Thread Nicolai Hähnle

On 18.02.2016 01:26, Ilia Mirkin wrote:

On Thu, Feb 18, 2016 at 1:07 AM, Ilia Mirkin  wrote:

  - LOD must be provided in .w for TXF (even for buffer textures)
  - User buffer must be valid at draw time


Good catch.


  - Must have a sampler associated with the sampler view


Fine by me. Honestly, I'd prefer to relax the requirements for 
TXF/buffer textures, but if that's difficult for Nouveau I can accept it.


Reviewed-by: Nicolai Hähnle 



This makes PBO uploads work again on nouveau.

Signed-off-by: Ilia Mirkin 
---


Just realized that I also need to add CSO_BIT_FRAGMENT_SAMPLERS to the
save state. And also fixed a minor warning in my tree. Too minor to
resend, but final version available here:
https://github.com/imirkin/mesa/commit/c246a0e.patch


  src/mesa/state_tracker/st_cb_texture.c | 26 --
  1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/src/mesa/state_tracker/st_cb_texture.c 
b/src/mesa/state_tracker/st_cb_texture.c
index d09c360..eb09f3d 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -1272,10 +1272,11 @@ create_pbo_upload_fs(struct st_context *st)
ureg_scalar(ureg_src(temp0), TGSI_SWIZZLE_X));
 }

+   /* temp0.w = 0 */
+   ureg_MOV(ureg, ureg_writemask(temp0, TGSI_WRITEMASK_W), ureg_imm1u(ureg, 
0));
+
 /* out = txf(sampler, temp0.x) */
-   ureg_TXF(ureg, out, TGSI_TEXTURE_BUFFER,
-  ureg_scalar(ureg_src(temp0), TGSI_SWIZZLE_X),
-  sampler);
+   ureg_TXF(ureg, out, TGSI_TEXTURE_BUFFER, ureg_src(temp0), sampler);

 ureg_release_temporary(ureg, temp0);

@@ -1353,6 +1354,7 @@ try_pbo_upload_common(struct gl_context *ctx,
   + (upload_height - 1 + (depth - 1) * image_height) * stride;
struct pipe_sampler_view templ;
struct pipe_sampler_view *sampler_view;
+  struct pipe_sampler_state sampler = {0}, *samplers[1] = {&sampler};

/* This should be ensured by Mesa before calling our callbacks */
assert((last_element + 1) * bytes_per_pixel <= buffer->width0);
@@ -1361,6 +1363,7 @@ try_pbo_upload_common(struct gl_context *ctx,
   goto fail;

memset(&templ, 0, sizeof(templ));
+  templ.target = PIPE_BUFFER;
templ.format = src_format;
templ.u.buf.first_element = first_element;
templ.u.buf.last_element = last_element;
@@ -1376,6 +1379,8 @@ try_pbo_upload_common(struct gl_context *ctx,
cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, 1, &sampler_view);

pipe_sampler_view_reference(&sampler_view, NULL);
+
+  cso_set_samplers(cso, PIPE_SHADER_FRAGMENT, 1, samplers);
 }

 /* Upload vertices */
@@ -1423,16 +1428,17 @@ try_pbo_upload_common(struct gl_context *ctx,
 }

 /* Upload constants */
+   /* Note: the user buffer must be valid until draw time */
+   struct {
+  int32_t xoffset;
+  int32_t yoffset;
+  int32_t stride;
+  int32_t image_size;
+   } constants;
+
 {
struct pipe_constant_buffer cb;

-  struct {
- int32_t xoffset;
- int32_t yoffset;
- int32_t stride;
- int32_t image_size;
-  } constants;
-
constants.xoffset = -xoffset + skip_pixels;
constants.yoffset = -yoffset;
constants.stride = stride;
--
2.4.10


___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev