summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2015-02-01 13:11:49 +0100
committerMarek Olšák <marek.olsak@amd.com>2015-02-06 22:27:07 +0100
commit56e709bffb626fff6bbb7f7da81ffe23ab96b878 (patch)
tree381d67c95b539718e5b39615b35dbe3cb5ce43e3
parent9e8a6d848639d52d7459bc2a7eac1ce4d6410f02 (diff)
downloadmesa-56e709bffb626fff6bbb7f7da81ffe23ab96b878.tar.gz
gallium/u_tests: test a NULL constant buffer
This expects (0,0,0,0), though it can be changed to something else or allow more than one set of values to be considered correct. This is currently the radeonsi behavior. Reviewed-by: Glenn Kennard <glenn.kennard@gmail.com>
-rw-r--r--src/gallium/auxiliary/util/u_tests.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/util/u_tests.c b/src/gallium/auxiliary/util/u_tests.c
index 10111539c78..5257b548c51 100644
--- a/src/gallium/auxiliary/util/u_tests.c
+++ b/src/gallium/auxiliary/util/u_tests.c
@@ -30,9 +30,11 @@
#include "util/u_draw_quad.h"
#include "util/u_format.h"
#include "util/u_inlines.h"
+#include "util/u_memory.h"
#include "util/u_simple_shaders.h"
#include "util/u_surface.h"
#include "util/u_tile.h"
+#include "tgsi/tgsi_text.h"
#include "cso_cache/cso_context.h"
#include <stdio.h>
@@ -371,6 +373,60 @@ null_sampler_view(struct pipe_context *ctx)
util_report_result(pass);
}
+static void
+null_constant_buffer(struct pipe_context *ctx)
+{
+ struct cso_context *cso;
+ struct pipe_resource *cb;
+ void *fs, *vs;
+ bool pass = true;
+ static const float zero[] = {0, 0, 0, 0};
+
+ cso = cso_create_context(ctx);
+ cb = util_create_texture2d(ctx->screen, 256, 256,
+ PIPE_FORMAT_R8G8B8A8_UNORM);
+ util_set_common_states_and_clear(cso, ctx, cb);
+
+ ctx->set_constant_buffer(ctx, PIPE_SHADER_FRAGMENT, 0, NULL);
+
+ /* Fragment shader. */
+ {
+ static const char *text = /* I don't like ureg... */
+ "FRAG\n"
+ "DCL CONST[0]\n"
+ "DCL OUT[0], COLOR\n"
+
+ "MOV OUT[0], CONST[0]\n"
+ "END\n";
+ struct tgsi_token tokens[1000];
+ struct pipe_shader_state state = {tokens};
+
+ if (!tgsi_text_translate(text, tokens, Elements(tokens))) {
+ puts("Can't compile a fragment shader.");
+ util_report_result(FAIL);
+ return;
+ }
+ fs = ctx->create_fs_state(ctx, &state);
+ cso_set_fragment_shader_handle(cso, fs);
+ }
+
+ /* Vertex shader. */
+ vs = util_set_passthrough_vertex_shader(cso, ctx, false);
+ util_draw_fullscreen_quad(cso);
+
+ /* Probe pixels. */
+ pass = pass && util_probe_rect_rgba(ctx, cb, 0, 0, cb->width0,
+ cb->height0, zero);
+
+ /* Cleanup. */
+ cso_destroy_context(cso);
+ ctx->delete_vs_state(ctx, vs);
+ ctx->delete_fs_state(ctx, fs);
+ pipe_resource_reference(&cb, NULL);
+
+ util_report_result(pass);
+}
+
/**
* Run all tests. This should be run with a clean context after
* context_create.
@@ -382,6 +438,7 @@ util_run_tests(struct pipe_screen *screen)
tgsi_vs_window_space_position(ctx);
null_sampler_view(ctx);
+ null_constant_buffer(ctx);
ctx->destroy(ctx);