summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/nine/nine_helpers.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/state_trackers/nine/nine_helpers.h')
-rw-r--r--src/gallium/state_trackers/nine/nine_helpers.h176
1 files changed, 176 insertions, 0 deletions
diff --git a/src/gallium/state_trackers/nine/nine_helpers.h b/src/gallium/state_trackers/nine/nine_helpers.h
new file mode 100644
index 00000000000..e81db79a4ae
--- /dev/null
+++ b/src/gallium/state_trackers/nine/nine_helpers.h
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2011 Joakim Sindholt <[email protected]>
+ *
+ * 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
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, 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 NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS 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 _NINE_HELPERS_H_
+#define _NINE_HELPERS_H_
+
+#include "iunknown.h"
+#include "nine_lock.h"
+
+/*
+ * Note: we use these function rather than the MIN2, MAX2, CLAMP macros to
+ * avoid evaluating arguments (which are often function calls) more than once.
+ */
+
+static inline unsigned _min(unsigned a, unsigned b)
+{
+ return (a < b) ? a : b;
+}
+
+
+/* Sshhh ... */
+#define nine_reference(a, b) _nine_reference((void **)(a), (b))
+
+static inline void _nine_reference(void **ref, void *ptr)
+{
+ if (*ref != ptr) {
+ if (*ref)
+ NineUnknown_Release(*ref);
+ if (ptr)
+ NineUnknown_AddRef(ptr);
+ *ref = ptr;
+ }
+}
+
+#define nine_reference_set(a, b) _nine_reference_set((void **)(a), (b))
+
+static inline void _nine_reference_set(void **ref, void *ptr)
+{
+ *ref = ptr;
+ if (ptr)
+ NineUnknown_AddRef(ptr);
+}
+
+#define nine_bind(a, b) _nine_bind((void **)(a), (b))
+
+static inline void _nine_bind(void **dst, void *obj)
+{
+ if (*dst != obj) {
+ if (*dst)
+ NineUnknown_Unbind(*dst);
+ if (obj)
+ NineUnknown_Bind(obj);
+ *dst = obj;
+ }
+}
+
+#define NINE_DEVICE_CHILD_NEW(nine, out, dev, ...) \
+ { \
+ struct NineUnknownParams __params; \
+ struct Nine##nine *__data; \
+ \
+ __data = CALLOC_STRUCT(Nine##nine); \
+ if (!__data) { return E_OUTOFMEMORY; } \
+ \
+ __params.vtable = ((dev)->params.BehaviorFlags & D3DCREATE_MULTITHREADED) ? &Lock##nine##_vtable : &Nine##nine##_vtable; \
+ __params.guids = Nine##nine##_IIDs; \
+ __params.dtor = (void *)Nine##nine##_dtor; \
+ __params.container = NULL; \
+ __params.device = dev; \
+ { \
+ HRESULT __hr = Nine##nine##_ctor(__data, &__params, ## __VA_ARGS__); \
+ if (FAILED(__hr)) { \
+ Nine##nine##_dtor(__data); \
+ return __hr; \
+ } \
+ } \
+ \
+ *(out) = __data; \
+ } \
+ return D3D_OK
+
+#define NINE_NEW(nine, out, lock, ...) \
+ { \
+ struct NineUnknownParams __params; \
+ struct Nine##nine *__data; \
+ \
+ __data = CALLOC_STRUCT(Nine##nine); \
+ if (!__data) { return E_OUTOFMEMORY; } \
+ \
+ __params.vtable = (lock) ? &Lock##nine##_vtable : &Nine##nine##_vtable; \
+ __params.guids = Nine##nine##_IIDs; \
+ __params.dtor = (void *)Nine##nine##_dtor; \
+ __params.container = NULL; \
+ __params.device = NULL; \
+ { \
+ HRESULT __hr = Nine##nine##_ctor(__data, &__params, ## __VA_ARGS__); \
+ if (FAILED(__hr)) { \
+ Nine##nine##_dtor(__data); \
+ return __hr; \
+ } \
+ } \
+ \
+ *(out) = __data; \
+ } \
+ return D3D_OK
+
+static INLINE float asfloat(DWORD value)
+{
+ union {
+ float f;
+ DWORD w;
+ } u;
+ u.w = value;
+ return u.f;
+}
+
+#define CHECK_PIPE_RESOURCE_TEMPLATE(t) \
+ screen->is_format_supported(screen, (t).format, (t).target, (t).nr_samples, (t).bind)
+
+
+struct nine_range
+{
+ struct nine_range *next;
+ int16_t bgn; /* inclusive */
+ int16_t end; /* exclusive */
+};
+
+/* We won't ever need more than 256 ranges, so just allocate once. */
+struct nine_range_pool
+{
+ struct nine_range *free;
+ struct nine_range **slabs;
+ unsigned num_slabs;
+ unsigned num_slabs_max;
+};
+
+static INLINE void
+nine_range_pool_put(struct nine_range_pool *pool, struct nine_range *r)
+{
+ r->next = pool->free;
+ pool->free = r;
+}
+
+static INLINE void
+nine_range_pool_put_chain(struct nine_range_pool *pool,
+ struct nine_range *head,
+ struct nine_range *tail)
+{
+ tail->next = pool->free;
+ pool->free = head;
+}
+
+void
+nine_ranges_insert(struct nine_range **head, int16_t bgn, int16_t end,
+ struct nine_range_pool *pool);
+
+#endif /* _NINE_HELPERS_H_ */