summaryrefslogtreecommitdiffstats
path: root/src/gallium/tests/graw/graw_util.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/tests/graw/graw_util.h')
-rw-r--r--src/gallium/tests/graw/graw_util.h329
1 files changed, 329 insertions, 0 deletions
diff --git a/src/gallium/tests/graw/graw_util.h b/src/gallium/tests/graw/graw_util.h
new file mode 100644
index 00000000000..9250f0b66bb
--- /dev/null
+++ b/src/gallium/tests/graw/graw_util.h
@@ -0,0 +1,329 @@
+
+#include "state_tracker/graw.h"
+
+#include "pipe/p_context.h"
+#include "pipe/p_defines.h"
+#include "pipe/p_screen.h"
+#include "pipe/p_shader_tokens.h"
+#include "pipe/p_state.h"
+
+#include "util/u_box.h"
+#include "util/u_debug.h"
+#include "util/u_draw_quad.h"
+#include "util/u_format.h"
+#include "util/u_inlines.h"
+#include "util/u_memory.h"
+
+
+struct graw_info
+{
+ struct pipe_screen *screen;
+ struct pipe_context *ctx;
+ struct pipe_resource *color_buf[PIPE_MAX_COLOR_BUFS], *zs_buf;
+ struct pipe_surface *color_surf[PIPE_MAX_COLOR_BUFS], *zs_surf;
+ void *window;
+};
+
+
+
+static INLINE boolean
+graw_util_create_window(struct graw_info *info,
+ int width, int height,
+ int num_cbufs, bool zstencil_buf)
+{
+ static const enum pipe_format formats[] = {
+ PIPE_FORMAT_R8G8B8A8_UNORM,
+ PIPE_FORMAT_B8G8R8A8_UNORM,
+ PIPE_FORMAT_NONE
+ };
+ enum pipe_format format;
+ struct pipe_resource resource_temp;
+ struct pipe_surface surface_temp;
+ int i;
+
+ memset(info, 0, sizeof(*info));
+
+ /* It's hard to say whether window or screen should be created
+ * first. Different environments would prefer one or the other.
+ *
+ * Also, no easy way of querying supported formats if the screen
+ * cannot be created first.
+ */
+ for (i = 0; info->window == NULL && formats[i] != PIPE_FORMAT_NONE; i++) {
+ info->screen = graw_create_window_and_screen(0, 0, width, height,
+ formats[i],
+ &info->window);
+ format = formats[i];
+ }
+ if (!info->screen || !info->window) {
+ debug_printf("graw: Failed to create screen/window\n");
+ return FALSE;
+ }
+
+ info->ctx = info->screen->context_create(info->screen, NULL);
+ if (info->ctx == NULL) {
+ debug_printf("graw: Failed to create context\n");
+ return FALSE;
+ }
+
+ for (i = 0; i < num_cbufs; i++) {
+ /* create color texture */
+ resource_temp.target = PIPE_TEXTURE_2D;
+ resource_temp.format = format;
+ resource_temp.width0 = width;
+ resource_temp.height0 = height;
+ resource_temp.depth0 = 1;
+ resource_temp.array_size = 1;
+ resource_temp.last_level = 0;
+ resource_temp.nr_samples = 1;
+ resource_temp.bind = (PIPE_BIND_RENDER_TARGET |
+ PIPE_BIND_DISPLAY_TARGET);
+ info->color_buf[i] = info->screen->resource_create(info->screen,
+ &resource_temp);
+ if (info->color_buf[i] == NULL) {
+ debug_printf("graw: Failed to create color texture\n");
+ return FALSE;
+ }
+
+ /* create color surface */
+ surface_temp.format = resource_temp.format;
+ surface_temp.usage = PIPE_BIND_RENDER_TARGET;
+ surface_temp.u.tex.level = 0;
+ surface_temp.u.tex.first_layer = 0;
+ surface_temp.u.tex.last_layer = 0;
+ info->color_surf[i] = info->ctx->create_surface(info->ctx,
+ info->color_buf[i],
+ &surface_temp);
+ if (info->color_surf[i] == NULL) {
+ debug_printf("graw: Failed to get color surface\n");
+ return FALSE;
+ }
+ }
+
+ /* create Z texture (XXX try other Z/S formats if needed) */
+ resource_temp.target = PIPE_TEXTURE_2D;
+ resource_temp.format = PIPE_FORMAT_S8_UINT_Z24_UNORM;
+ resource_temp.width0 = width;
+ resource_temp.height0 = height;
+ resource_temp.depth0 = 1;
+ resource_temp.array_size = 1;
+ resource_temp.last_level = 0;
+ resource_temp.nr_samples = 1;
+ resource_temp.bind = PIPE_BIND_DEPTH_STENCIL;
+ info->zs_buf = info->screen->resource_create(info->screen, &resource_temp);
+ if (!info->zs_buf) {
+ debug_printf("graw: Failed to create Z texture\n");
+ return FALSE;
+ }
+
+ /* create z surface */
+ surface_temp.format = resource_temp.format;
+ surface_temp.usage = PIPE_BIND_DEPTH_STENCIL;
+ surface_temp.u.tex.level = 0;
+ surface_temp.u.tex.first_layer = 0;
+ surface_temp.u.tex.last_layer = 0;
+ info->zs_surf = info->ctx->create_surface(info->ctx,
+ info->zs_buf,
+ &surface_temp);
+ if (info->zs_surf == NULL) {
+ debug_printf("graw: Failed to get Z surface\n");
+ return FALSE;
+ }
+
+ {
+ struct pipe_framebuffer_state fb;
+ memset(&fb, 0, sizeof fb);
+ fb.nr_cbufs = num_cbufs;
+ fb.width = width;
+ fb.height = height;
+ for (i = 0; i < num_cbufs; i++)
+ fb.cbufs[i] = info->color_surf[i];
+ fb.zsbuf = info->zs_surf;
+ info->ctx->set_framebuffer_state(info->ctx, &fb);
+ }
+
+ return TRUE;
+}
+
+
+static INLINE void
+graw_util_default_state(struct graw_info *info, boolean depth_test)
+{
+ {
+ struct pipe_blend_state blend;
+ void *handle;
+ memset(&blend, 0, sizeof blend);
+ blend.rt[0].colormask = PIPE_MASK_RGBA;
+ handle = info->ctx->create_blend_state(info->ctx, &blend);
+ info->ctx->bind_blend_state(info->ctx, handle);
+ }
+
+ {
+ struct pipe_depth_stencil_alpha_state depthStencilAlpha;
+ void *handle;
+ memset(&depthStencilAlpha, 0, sizeof depthStencilAlpha);
+ depthStencilAlpha.depth.enabled = depth_test;
+ depthStencilAlpha.depth.writemask = 1;
+ depthStencilAlpha.depth.func = PIPE_FUNC_LESS;
+ handle = info->ctx->create_depth_stencil_alpha_state(info->ctx,
+ &depthStencilAlpha);
+ info->ctx->bind_depth_stencil_alpha_state(info->ctx, handle);
+ }
+
+ {
+ struct pipe_rasterizer_state rasterizer;
+ void *handle;
+ memset(&rasterizer, 0, sizeof rasterizer);
+ rasterizer.cull_face = PIPE_FACE_NONE;
+ rasterizer.gl_rasterization_rules = 1;
+ handle = info->ctx->create_rasterizer_state(info->ctx, &rasterizer);
+ info->ctx->bind_rasterizer_state(info->ctx, handle);
+ }
+}
+
+
+static INLINE void
+graw_util_viewport(struct graw_info *info,
+ float x, float y,
+ float width, float height,
+ float near, float far)
+{
+ float z = near;
+ float half_width = width / 2.0f;
+ float half_height = height / 2.0f;
+ float half_depth = (far - near) / 2.0f;
+ struct pipe_viewport_state vp;
+
+ vp.scale[0] = half_width;
+ vp.scale[1] = half_height;
+ vp.scale[2] = half_depth;
+ vp.scale[3] = 1.0f;
+
+ vp.translate[0] = half_width + x;
+ vp.translate[1] = half_height + y;
+ vp.translate[2] = half_depth + z;
+ vp.translate[3] = 0.0f;
+
+ info->ctx->set_viewport_state(info->ctx, &vp);
+}
+
+
+static INLINE void
+graw_util_flush_front(const struct graw_info *info)
+{
+ info->screen->flush_frontbuffer(info->screen, info->color_buf[0],
+ 0, 0, info->window);
+}
+
+
+static INLINE struct pipe_resource *
+graw_util_create_tex2d(const struct graw_info *info,
+ int width, int height, enum pipe_format format,
+ const void *data)
+{
+ const int row_stride = width * util_format_get_blocksize(format);
+ const int image_bytes = row_stride * height;
+ struct pipe_resource temp, *tex;
+ struct pipe_box box;
+
+ temp.target = PIPE_TEXTURE_2D;
+ temp.format = PIPE_FORMAT_B8G8R8A8_UNORM;
+ temp.width0 = width;
+ temp.height0 = height;
+ temp.depth0 = 1;
+ temp.last_level = 0;
+ temp.array_size = 1;
+ temp.nr_samples = 1;
+ temp.bind = PIPE_BIND_SAMPLER_VIEW;
+
+ tex = info->screen->resource_create(info->screen, &temp);
+ if (!tex) {
+ debug_printf("graw: failed to create texture\n");
+ return NULL;
+ }
+
+ u_box_2d(0, 0, width, height, &box);
+
+ info->ctx->transfer_inline_write(info->ctx,
+ tex,
+ 0,
+ PIPE_TRANSFER_WRITE,
+ &box,
+ data,
+ row_stride,
+ image_bytes);
+
+ /* Possibly read back & compare against original data:
+ */
+#if 0
+ {
+ struct pipe_transfer *t;
+ uint32_t *ptr;
+ t = pipe_get_transfer(info->ctx, samptex,
+ 0, 0, /* level, layer */
+ PIPE_TRANSFER_READ,
+ 0, 0, SIZE, SIZE); /* x, y, width, height */
+
+ ptr = info->ctx->transfer_map(info->ctx, t);
+
+ if (memcmp(ptr, tex2d, sizeof tex2d) != 0) {
+ assert(0);
+ exit(9);
+ }
+
+ info->ctx->transfer_unmap(info->ctx, t);
+
+ info->ctx->transfer_destroy(info->ctx, t);
+ }
+#endif
+
+ return tex;
+}
+
+
+static INLINE void *
+graw_util_create_simple_sampler(const struct graw_info *info,
+ unsigned wrap_mode,
+ unsigned img_filter)
+{
+ struct pipe_sampler_state sampler_desc;
+ void *sampler;
+
+ memset(&sampler_desc, 0, sizeof sampler_desc);
+ sampler_desc.wrap_s =
+ sampler_desc.wrap_t =
+ sampler_desc.wrap_r = wrap_mode;
+ sampler_desc.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
+ sampler_desc.min_img_filter =
+ sampler_desc.mag_img_filter = img_filter;
+ sampler_desc.compare_mode = PIPE_TEX_COMPARE_NONE;
+ sampler_desc.compare_func = 0;
+ sampler_desc.normalized_coords = 1;
+ sampler_desc.max_anisotropy = 0;
+
+ sampler = info->ctx->create_sampler_state(info->ctx, &sampler_desc);
+
+ return sampler;
+}
+
+
+static INLINE struct pipe_sampler_view *
+graw_util_create_simple_sampler_view(const struct graw_info *info,
+ struct pipe_resource *texture)
+{
+ struct pipe_sampler_view sv_temp;
+ struct pipe_sampler_view *sv;
+
+ memset(&sv_temp, 0, sizeof(sv_temp));
+ sv_temp.format = texture->format;
+ sv_temp.texture = texture;
+ sv_temp.swizzle_r = PIPE_SWIZZLE_RED;
+ sv_temp.swizzle_g = PIPE_SWIZZLE_GREEN;
+ sv_temp.swizzle_b = PIPE_SWIZZLE_BLUE;
+ sv_temp.swizzle_a = PIPE_SWIZZLE_ALPHA;
+
+ sv = info->ctx->create_sampler_view(info->ctx, texture, &sv_temp);
+
+ return sv;
+}
+