summaryrefslogtreecommitdiff
path: root/lib/igt_kms.h
diff options
context:
space:
mode:
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2016-06-13 15:27:22 +0200
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2016-06-29 14:57:11 +0200
commitbe13126cc861b886720bfbffe8edeb60f10fdb94 (patch)
tree0e2e415d8f706801e1b2a9936d64ad71d30eef9b /lib/igt_kms.h
parent3916465bb935fc80c4fe9a7e20d848fcb0aba5b0 (diff)
lib/igt_kms: Add for_each_pipe_with_valid_output and for_each_valid_output_on_pipe.
There are a lot of places where we do either for_each_pipe { igt_subtest_f(... "-pipe-C", pipe_name()) for_each_connected_output() /* Run subtest */ } or: igt_subtest_f(...) { for_each_pipe() for_each_connected_output() /* Run subtest */ } The former should be replaced with for_each_valid_output_on_pipe, the latter with for_each_pipe_with_valid_output. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Diffstat (limited to 'lib/igt_kms.h')
-rw-r--r--lib/igt_kms.h23
1 files changed, 22 insertions, 1 deletions
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 7aad8c8c..b66743a2 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -114,6 +114,7 @@ struct kmstest_connector_config {
uint32_t atomic_props_connector[IGT_NUM_CONNECTOR_PROPS];
int crtc_idx;
int pipe;
+ unsigned valid_crtc_idx_mask;
};
/**
@@ -327,13 +328,33 @@ void igt_fb_set_size(struct igt_fb *fb, igt_plane_t *plane,
void igt_wait_for_vblank(int drm_fd, enum pipe pipe);
+static inline bool igt_pipe_connector_valid(enum pipe pipe,
+ igt_output_t *output)
+{
+ return output->valid && (output->config.valid_crtc_idx_mask & (1 << pipe));
+}
+
+#define for_each_if(condition) if (!(condition)) {} else
+
#define for_each_connected_output(display, output) \
for (int i__ = 0; i__ < (display)->n_outputs; i__++) \
- if ((output = &(display)->outputs[i__]), output->valid)
+ for_each_if (((output = &(display)->outputs[i__]), output->valid))
#define for_each_pipe(display, pipe) \
for (pipe = 0; pipe < igt_display_get_n_pipes(display); pipe++) \
+/* Big complex macro to make 'break' work as expected. */
+#define for_each_pipe_with_valid_output(display, pipe, output) \
+ for (int con__ = pipe = 0; \
+ pipe < igt_display_get_n_pipes((display)) && con__ < (display)->n_outputs; \
+ con__ = (con__ + 1 < (display)->n_outputs) ? con__ + 1 : (pipe = pipe + 1, 0)) \
+ for_each_if (((output = &(display)->outputs[con__]), \
+ igt_pipe_connector_valid(pipe, output)))
+
+#define for_each_valid_output_on_pipe(display, pipe, output) \
+ for_each_connected_output(display, output) \
+ for_each_if (igt_pipe_connector_valid(pipe, output))
+
#define for_each_plane_on_pipe(display, pipe, plane) \
for (int j__ = 0; (plane) = &(display)->pipes[(pipe)].planes[j__], \
j__ < (display)->pipes[(pipe)].n_planes; j__++)