panfrost: Move pool routines to common code
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tue, 7 Jul 2020 20:24:41 +0000 (16:24 -0400)
committerMarge Bot <eric+marge@anholt.net>
Thu, 9 Jul 2020 14:54:38 +0000 (14:54 +0000)
We finally have it decoupled from Galliumisms (and OpenGLisms, indeed)
so we can share the file.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5794>

13 files changed:
src/gallium/drivers/panfrost/Makefile.sources
src/gallium/drivers/panfrost/meson.build
src/gallium/drivers/panfrost/pan_allocate.c [deleted file]
src/gallium/drivers/panfrost/pan_allocate.h [deleted file]
src/gallium/drivers/panfrost/pan_cmdstream.c
src/gallium/drivers/panfrost/pan_job.h
src/gallium/drivers/panfrost/pan_resource.h
src/gallium/drivers/panfrost/pan_scoreboard.c
src/gallium/drivers/panfrost/pan_screen.h
src/panfrost/Makefile.sources
src/panfrost/encoder/meson.build
src/panfrost/encoder/pan_pool.c [new file with mode: 0644]
src/panfrost/encoder/pan_pool.h [new file with mode: 0644]

index 2453edec60c1bbb7ba775e9658c8456d34074fc8..4688754672c0b0f088dc5f93ce884168501292a1 100644 (file)
@@ -2,8 +2,6 @@ C_SOURCES := \
        nir/nir_lower_blend.c \
        nir/nir_lower_blend.h \
     \
-       pan_allocate.c \
-       pan_allocate.h \
        pan_assemble.c \
        pan_blend_cso.c \
        pan_blend.h \
index b3ebb16fe2dccc316023492e8b75d0d39f606c63..154d05a734489899b1233a11bdc1fda906085d47 100644 (file)
@@ -31,7 +31,6 @@ files_panfrost = files(
   'pan_context.c',
   'pan_blit.c',
   'pan_job.c',
-  'pan_allocate.c',
   'pan_assemble.c',
   'pan_blending.c',
   'pan_blend_shaders.c',
diff --git a/src/gallium/drivers/panfrost/pan_allocate.c b/src/gallium/drivers/panfrost/pan_allocate.c
deleted file mode 100644 (file)
index ed8d26f..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * © Copyright 2018 Alyssa Rosenzweig
- * Copyright (C) 2019 Collabora, Ltd.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <panfrost-misc.h>
-#include <panfrost-job.h>
-#include "pan_bo.h"
-#include "pan_context.h"
-
-/* TODO: What does this actually have to be? */
-#define ALIGNMENT 128
-
-/* Transient command stream pooling: command stream uploads try to simply copy
- * into whereever we left off. If there isn't space, we allocate a new entry
- * into the pool and copy there */
-
-struct pan_pool
-panfrost_create_pool(void *memctx, struct panfrost_device *dev)
-{
-        struct pan_pool pool = {
-                .dev = dev,
-                .transient_offset = 0,
-                .transient_bo = NULL
-        };
-
-        pool.bos = _mesa_hash_table_create(memctx, _mesa_hash_pointer,
-                        _mesa_key_pointer_equal);
-
-
-        return pool;
-}
-
-struct panfrost_transfer
-panfrost_pool_alloc(struct pan_pool *pool, size_t sz)
-{
-        /* Pad the size */
-        sz = ALIGN_POT(sz, ALIGNMENT);
-
-        /* Find or create a suitable BO */
-        struct panfrost_bo *bo = NULL;
-
-        unsigned offset = 0;
-
-        bool fits_in_current = (pool->transient_offset + sz) < TRANSIENT_SLAB_SIZE;
-
-        if (likely(pool->transient_bo && fits_in_current)) {
-                /* We can reuse the current BO, so get it */
-                bo = pool->transient_bo;
-
-                /* Use the specified offset */
-                offset = pool->transient_offset;
-                pool->transient_offset = offset + sz;
-        } else {
-                size_t bo_sz = sz < TRANSIENT_SLAB_SIZE ?
-                               TRANSIENT_SLAB_SIZE : ALIGN_POT(sz, 4096);
-
-                /* We can't reuse the current BO, but we can create a new one.
-                 * We don't know what the BO will be used for, so let's flag it
-                 * RW and attach it to both the fragment and vertex/tiler jobs.
-                 * TODO: if we want fine grained BO assignment we should pass
-                 * flags to this function and keep the read/write,
-                 * fragment/vertex+tiler pools separate.
-                 */
-                bo = panfrost_bo_create(pool->dev, bo_sz, 0);
-
-                uintptr_t flags = PAN_BO_ACCESS_PRIVATE |
-                                  PAN_BO_ACCESS_RW |
-                                  PAN_BO_ACCESS_VERTEX_TILER |
-                                  PAN_BO_ACCESS_FRAGMENT;
-
-                _mesa_hash_table_insert(pool->bos, bo, (void *) flags);
-
-                if (sz < TRANSIENT_SLAB_SIZE) {
-                        pool->transient_bo = bo;
-                        pool->transient_offset = offset + sz;
-                }
-        }
-
-        struct panfrost_transfer ret = {
-                .cpu = bo->cpu + offset,
-                .gpu = bo->gpu + offset,
-        };
-
-        return ret;
-
-}
-
-mali_ptr
-panfrost_pool_upload(struct pan_pool *pool, const void *data, size_t sz)
-{
-        struct panfrost_transfer transfer = panfrost_pool_alloc(pool, sz);
-        memcpy(transfer.cpu, data, sz);
-        return transfer.gpu;
-}
diff --git a/src/gallium/drivers/panfrost/pan_allocate.h b/src/gallium/drivers/panfrost/pan_allocate.h
deleted file mode 100644 (file)
index fa41d4c..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * © Copyright 2017-2018 Alyssa Rosenzweig
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
-#ifndef __PAN_ALLOCATE_H__
-#define __PAN_ALLOCATE_H__
-
-#include <unistd.h>
-#include <sys/mman.h>
-#include <stdbool.h>
-
-#include <panfrost-misc.h>
-
-#include "util/list.h"
-
-struct panfrost_batch;
-
-/* Represents a pool of memory that can only grow, used to allocate objects
- * with the same lifetime as the pool itself. In OpenGL, a pool is owned by the
- * batch for transient structures. In Vulkan, it may be owned by e.g. the
- * command pool */
-
-struct pan_pool {
-        /* Parent device for allocation */
-        struct panfrost_device *dev;
-
-        /* panfrost_bo -> access_flags owned by the pool */
-        struct hash_table *bos;
-
-        /* Current transient BO */
-        struct panfrost_bo *transient_bo;
-
-        /* Within the topmost transient BO, how much has been used? */
-        unsigned transient_offset;
-};
-
-struct pan_pool
-panfrost_create_pool(void *memctx, struct panfrost_device *dev);
-
-/* Represents a fat pointer for GPU-mapped memory, returned from the transient
- * allocator and not used for much else */
-
-struct panfrost_transfer {
-        uint8_t *cpu;
-        mali_ptr gpu;
-};
-
-struct panfrost_transfer
-panfrost_pool_alloc(struct pan_pool *pool, size_t sz);
-
-mali_ptr
-panfrost_pool_upload(struct pan_pool *pool, const void *data, size_t sz);
-
-#endif /* __PAN_ALLOCATE_H__ */
index fd2e72b2b1f995875e4ad3db6d341078c2b16764..e761c63c38b0ba59bbab7ad5f83ee3cc1d8f0d34 100644 (file)
@@ -28,7 +28,7 @@
 
 #include "panfrost-quirks.h"
 
-#include "pan_allocate.h"
+#include "pan_pool.h"
 #include "pan_bo.h"
 #include "pan_cmdstream.h"
 #include "pan_context.h"
index c0a569bbf64956c54b1dce83c5278735e3c32d07..43ae7795d6943468a1fe47e846d11d0870a1dd8c 100644 (file)
@@ -28,7 +28,7 @@
 
 #include "util/u_dynarray.h"
 #include "pipe/p_state.h"
-#include "pan_allocate.h"
+#include "pan_pool.h"
 #include "pan_resource.h"
 
 /* panfrost_batch_fence is the out fence of a batch that users or other batches
index 209a6c185cc8d6c72c53bb24c1a051ccd7341283..bc4e0dbb6c4da37e2035658466752da7f15dbfbf 100644 (file)
@@ -28,7 +28,7 @@
 
 #include <panfrost-job.h>
 #include "pan_screen.h"
-#include "pan_allocate.h"
+#include "pan_pool.h"
 #include "pan_minmax_cache.h"
 #include "pan_texture.h"
 #include "drm-uapi/drm.h"
index 7023ebc43853f88bf1996f32ece43de9b4377187..63a0f86e7371b40ba5038ad224d611558519e5aa 100644 (file)
@@ -24,7 +24,7 @@
 
 #include "pan_context.h"
 #include "pan_job.h"
-#include "pan_allocate.h"
+#include "pan_pool.h"
 #include "panfrost-quirks.h"
 #include "util/bitset.h"
 
index f67856949e2c2801d93856a7067d4db9c33a10ad..6fe6381e20f26d0d8747a3c2e50a97d818f61033 100644 (file)
@@ -39,7 +39,7 @@
 
 #include <panfrost-misc.h>
 #include "pan_device.h"
-#include "pan_allocate.h"
+#include "pan_pool.h"
 
 struct panfrost_batch;
 struct panfrost_context;
index 568729887dee5584867f1aff2851ba9d79530d88..d085b763e3e3cc4779d6924dadfbf99fc4a0739f 100644 (file)
@@ -29,6 +29,8 @@ encoder_FILES := \
         encoder/pan_encoder.h \
         encoder/pan_format.c \
         encoder/pan_invocation.c \
+        encoder/pan_pool.c \
+        encoder/pan_pool.h \
         encoder/pan_props.c \
         encoder/pan_sampler.c \
         encoder/pan_tiler.c \
index 0086834977b899d5a205021af6cfc2ba73f13047..2e5baea4fc5f8c988b9df920059d908b36fa0f70 100644 (file)
@@ -31,6 +31,7 @@ libpanfrost_encoder_files = files(
   'pan_tiler.c',
   'pan_texture.c',
   'pan_scratch.c',
+  'pan_pool.c',
   'pan_props.c',
 )
 
diff --git a/src/panfrost/encoder/pan_pool.c b/src/panfrost/encoder/pan_pool.c
new file mode 100644 (file)
index 0000000..1a08be2
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * © Copyright 2018 Alyssa Rosenzweig
+ * Copyright (C) 2019 Collabora, Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+#include "util/hash_table.h"
+#include "pan_bo.h"
+#include "pan_pool.h"
+
+/* TODO: What does this actually have to be? */
+#define ALIGNMENT 128
+
+/* Transient command stream pooling: command stream uploads try to simply copy
+ * into whereever we left off. If there isn't space, we allocate a new entry
+ * into the pool and copy there */
+
+struct pan_pool
+panfrost_create_pool(void *memctx, struct panfrost_device *dev)
+{
+        struct pan_pool pool = {
+                .dev = dev,
+                .transient_offset = 0,
+                .transient_bo = NULL
+        };
+
+        pool.bos = _mesa_hash_table_create(memctx, _mesa_hash_pointer,
+                        _mesa_key_pointer_equal);
+
+
+        return pool;
+}
+
+struct panfrost_transfer
+panfrost_pool_alloc(struct pan_pool *pool, size_t sz)
+{
+        /* Pad the size */
+        sz = ALIGN_POT(sz, ALIGNMENT);
+
+        /* Find or create a suitable BO */
+        struct panfrost_bo *bo = NULL;
+
+        unsigned offset = 0;
+
+        bool fits_in_current = (pool->transient_offset + sz) < TRANSIENT_SLAB_SIZE;
+
+        if (likely(pool->transient_bo && fits_in_current)) {
+                /* We can reuse the current BO, so get it */
+                bo = pool->transient_bo;
+
+                /* Use the specified offset */
+                offset = pool->transient_offset;
+                pool->transient_offset = offset + sz;
+        } else {
+                size_t bo_sz = sz < TRANSIENT_SLAB_SIZE ?
+                               TRANSIENT_SLAB_SIZE : ALIGN_POT(sz, 4096);
+
+                /* We can't reuse the current BO, but we can create a new one.
+                 * We don't know what the BO will be used for, so let's flag it
+                 * RW and attach it to both the fragment and vertex/tiler jobs.
+                 * TODO: if we want fine grained BO assignment we should pass
+                 * flags to this function and keep the read/write,
+                 * fragment/vertex+tiler pools separate.
+                 */
+                bo = panfrost_bo_create(pool->dev, bo_sz, 0);
+
+                uintptr_t flags = PAN_BO_ACCESS_PRIVATE |
+                                  PAN_BO_ACCESS_RW |
+                                  PAN_BO_ACCESS_VERTEX_TILER |
+                                  PAN_BO_ACCESS_FRAGMENT;
+
+                _mesa_hash_table_insert(pool->bos, bo, (void *) flags);
+
+                if (sz < TRANSIENT_SLAB_SIZE) {
+                        pool->transient_bo = bo;
+                        pool->transient_offset = offset + sz;
+                }
+        }
+
+        struct panfrost_transfer ret = {
+                .cpu = bo->cpu + offset,
+                .gpu = bo->gpu + offset,
+        };
+
+        return ret;
+
+}
+
+mali_ptr
+panfrost_pool_upload(struct pan_pool *pool, const void *data, size_t sz)
+{
+        struct panfrost_transfer transfer = panfrost_pool_alloc(pool, sz);
+        memcpy(transfer.cpu, data, sz);
+        return transfer.gpu;
+}
diff --git a/src/panfrost/encoder/pan_pool.h b/src/panfrost/encoder/pan_pool.h
new file mode 100644 (file)
index 0000000..6d78998
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * © Copyright 2017-2018 Alyssa Rosenzweig
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+#ifndef __PAN_POOL_H__
+#define __PAN_POOL_H__
+
+#include <panfrost-misc.h>
+
+/* Represents a pool of memory that can only grow, used to allocate objects
+ * with the same lifetime as the pool itself. In OpenGL, a pool is owned by the
+ * batch for transient structures. In Vulkan, it may be owned by e.g. the
+ * command pool */
+
+struct pan_pool {
+        /* Parent device for allocation */
+        struct panfrost_device *dev;
+
+        /* panfrost_bo -> access_flags owned by the pool */
+        struct hash_table *bos;
+
+        /* Current transient BO */
+        struct panfrost_bo *transient_bo;
+
+        /* Within the topmost transient BO, how much has been used? */
+        unsigned transient_offset;
+};
+
+struct pan_pool
+panfrost_create_pool(void *memctx, struct panfrost_device *dev);
+
+/* Represents a fat pointer for GPU-mapped memory, returned from the transient
+ * allocator and not used for much else */
+
+struct panfrost_transfer {
+        uint8_t *cpu;
+        mali_ptr gpu;
+};
+
+struct panfrost_transfer
+panfrost_pool_alloc(struct pan_pool *pool, size_t sz);
+
+mali_ptr
+panfrost_pool_upload(struct pan_pool *pool, const void *data, size_t sz);
+
+#endif