[2/3] gallium/format: Add a helper to combine separate Z24 and S8 stencil.

Submitted by Kenneth Graunke on Aug. 15, 2018, 6:04 a.m.

Details

Message ID 20180815060405.9912-2-kenneth@whitecape.org
State New
Headers show
Series "Series without cover letter" ( rev: 1 ) in Mesa

Not browsing as part of any series.

Commit Message

Kenneth Graunke Aug. 15, 2018, 6:04 a.m.
This new function takes separate Z24 depth and S8 stencil sources,
and packs them into a single combined Z24S8 buffer.
---
 src/gallium/auxiliary/util/u_format_zs.c | 20 ++++++++++++++++++++
 src/gallium/auxiliary/util/u_format_zs.h |  2 ++
 2 files changed, 22 insertions(+)

Patch hide | download patch | download mbox

diff --git a/src/gallium/auxiliary/util/u_format_zs.c b/src/gallium/auxiliary/util/u_format_zs.c
index 69f2f2971f7..4138fbe6503 100644
--- a/src/gallium/auxiliary/util/u_format_zs.c
+++ b/src/gallium/auxiliary/util/u_format_zs.c
@@ -448,6 +448,26 @@  util_format_z24_unorm_s8_uint_pack_s_8uint(uint8_t *dst_row, unsigned dst_stride
    }
 }
 
+void
+util_format_z24_unorm_s8_uint_pack_separate(uint8_t *dst_row, unsigned dst_stride,
+                                            const uint32_t *z_src_row, unsigned z_src_stride,
+                                            const uint8_t *s_src_row, unsigned s_src_stride,
+                                            unsigned width, unsigned height)
+{
+   unsigned x, y;
+   for(y = 0; y < height; ++y) {
+      const uint32_t *z_src = z_src_row;
+      const uint8_t *s_src = s_src_row;
+      uint32_t *dst = (uint32_t *)dst_row;
+      for(x = 0; x < width; ++x) {
+         *dst++ = (*z_src++ & 0x00ffffff) | (*s_src++ << 24);
+      }
+      dst_row += dst_stride/sizeof(*dst_row);
+      z_src_row += z_src_stride/sizeof(*z_src_row);
+      s_src_row += s_src_stride/sizeof(*s_src_row);
+   }
+}
+
 void
 util_format_s8_uint_z24_unorm_unpack_z_float(float *dst_row, unsigned dst_stride,
                                                 const uint8_t *src_row, unsigned src_stride,
diff --git a/src/gallium/auxiliary/util/u_format_zs.h b/src/gallium/auxiliary/util/u_format_zs.h
index adddfaf3a74..160919dde73 100644
--- a/src/gallium/auxiliary/util/u_format_zs.h
+++ b/src/gallium/auxiliary/util/u_format_zs.h
@@ -112,6 +112,8 @@  util_format_z24_unorm_s8_uint_unpack_s_8uint(uint8_t *dst_row, unsigned dst_stri
 void
 util_format_z24_unorm_s8_uint_pack_s_8uint(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height);
 
+void
+util_format_z24_unorm_s8_uint_pack_separate(uint8_t *dst_row, unsigned dst_stride, const uint32_t *z_src_row, unsigned z_src_stride, const uint8_t *s_src_row, unsigned s_src_stride, const unsigned width, unsigned height);
 
 void
 util_format_s8_uint_z24_unorm_unpack_z_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height);

Comments

Kenneth Graunke <kenneth@whitecape.org> writes:

> This new function takes separate Z24 depth and S8 stencil sources,
> and packs them into a single combined Z24S8 buffer.
> ---
>  src/gallium/auxiliary/util/u_format_zs.c | 20 ++++++++++++++++++++
>  src/gallium/auxiliary/util/u_format_zs.h |  2 ++
>  2 files changed, 22 insertions(+)
>
> diff --git a/src/gallium/auxiliary/util/u_format_zs.c b/src/gallium/auxiliary/util/u_format_zs.c
> index 69f2f2971f7..4138fbe6503 100644
> --- a/src/gallium/auxiliary/util/u_format_zs.c
> +++ b/src/gallium/auxiliary/util/u_format_zs.c
> @@ -448,6 +448,26 @@ util_format_z24_unorm_s8_uint_pack_s_8uint(uint8_t *dst_row, unsigned dst_stride
>     }
>  }
>  
> +void
> +util_format_z24_unorm_s8_uint_pack_separate(uint8_t *dst_row, unsigned dst_stride,
> +                                            const uint32_t *z_src_row, unsigned z_src_stride,
> +                                            const uint8_t *s_src_row, unsigned s_src_stride,
> +                                            unsigned width, unsigned height)
> +{
> +   unsigned x, y;
> +   for(y = 0; y < height; ++y) {
> +      const uint32_t *z_src = z_src_row;
> +      const uint8_t *s_src = s_src_row;
> +      uint32_t *dst = (uint32_t *)dst_row;
> +      for(x = 0; x < width; ++x) {
> +         *dst++ = (*z_src++ & 0x00ffffff) | (*s_src++ << 24);
> +      }
> +      dst_row += dst_stride/sizeof(*dst_row);
> +      z_src_row += z_src_stride/sizeof(*z_src_row);
> +      s_src_row += s_src_stride/sizeof(*s_src_row);
> +   }
> +}

missing spaces after for and around binary operators.