summaryrefslogtreecommitdiff
path: root/vtest
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@gmail.com>2016-01-15 19:07:08 +0100
committerDave Airlie <airlied@redhat.com>2016-01-21 18:02:14 +1000
commit47559de28df33a7074192cd22d2647878a662f59 (patch)
treeebc2e54512ed0267e49a2a52243f9a78bd159821 /vtest
parent89aea798b64bc998e82f32175c3e3ab3f342f64f (diff)
vtest: use a poll fd if possible
For the same glmark2 "build" test, perf reports about half instructions. Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'vtest')
-rw-r--r--vtest/Makefile.am10
-rw-r--r--vtest/util.c46
-rw-r--r--vtest/util.h29
-rw-r--r--vtest/vtest_renderer.c14
-rw-r--r--vtest/vtest_server.c21
5 files changed, 92 insertions, 28 deletions
diff --git a/vtest/Makefile.am b/vtest/Makefile.am
index 9ed53a1..3cb6f32 100644
--- a/vtest/Makefile.am
+++ b/vtest/Makefile.am
@@ -14,10 +14,12 @@ AM_CFLAGS = \
bin_PROGRAMS = virgl_test_server
-virgl_test_server_SOURCES = \
- vtest_server.c \
- vtest_renderer.c \
- vtest_protocol.h \
+virgl_test_server_SOURCES = \
+ util.c \
+ util.h \
+ vtest_server.c \
+ vtest_renderer.c \
+ vtest_protocol.h \
vtest.h
virgl_test_server_LDADD = $(top_builddir)/src/libvirglrenderer.la
diff --git a/vtest/util.c b/vtest/util.c
new file mode 100644
index 0000000..0d3c78f
--- /dev/null
+++ b/vtest/util.c
@@ -0,0 +1,46 @@
+/**************************************************************************
+ *
+ * Copyright (C) 2016 Red Hat Inc.
+ *
+ * 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 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.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+int vtest_wait_for_fd_read(int fd)
+{
+ fd_set read_fds;
+
+ int ret;
+ FD_ZERO(&read_fds);
+ FD_SET(fd, &read_fds);
+
+ ret = select(fd + 1, &read_fds, NULL, NULL, NULL);
+ if (ret < 0)
+ return ret;
+
+ if (FD_ISSET(fd, &read_fds)) {
+ return 0;
+ }
+ return -1;
+}
diff --git a/vtest/util.h b/vtest/util.h
new file mode 100644
index 0000000..4684b49
--- /dev/null
+++ b/vtest/util.h
@@ -0,0 +1,29 @@
+/**************************************************************************
+ *
+ * Copyright (C) 2016 Red Hat Inc.
+ *
+ * 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 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 VTEST_UTIL_H
+#define VTEST_UTIL_H
+
+int vtest_wait_for_fd_read(int fd);
+
+#endif /* VTEST_UTIL_H */
diff --git a/vtest/vtest_renderer.c b/vtest/vtest_renderer.c
index b467550..8c8ca33 100644
--- a/vtest/vtest_renderer.c
+++ b/vtest/vtest_renderer.c
@@ -30,6 +30,7 @@
#include <sys/uio.h>
#include "vtest.h"
#include "vtest_protocol.h"
+#include "util.h"
static int ctx_id = 1;
static int fence_id = 1;
@@ -307,7 +308,7 @@ int vtest_transfer_put(uint32_t length_dw)
int vtest_resource_busy_wait(void)
{
uint32_t bw_buf[VCMD_BUSY_WAIT_SIZE];
- int ret;
+ int ret, fd;
int flags;
uint32_t hdr_buf[VTEST_HDR_SIZE];
uint32_t reply_buf[1];
@@ -321,10 +322,13 @@ int vtest_resource_busy_wait(void)
if (flags == VCMD_BUSY_WAIT_FLAG_WAIT) {
do {
- if (last_fence != (fence_id - 1))
- virgl_renderer_poll();
- else
- break;
+ if (last_fence == (fence_id - 1))
+ break;
+
+ fd = virgl_renderer_get_poll_fd();
+ if (fd != -1)
+ vtest_wait_for_fd_read(fd);
+ virgl_renderer_poll();
} while (1);
busy = false;
} else {
diff --git a/vtest/vtest_server.c b/vtest/vtest_server.c
index b0379c2..9a41188 100644
--- a/vtest/vtest_server.c
+++ b/vtest/vtest_server.c
@@ -31,6 +31,7 @@
#include <netinet/in.h>
#include <sys/un.h>
+#include "util.h"
#include "vtest.h"
#include "vtest_protocol.h"
@@ -84,24 +85,6 @@ int wait_for_socket_accept(int sock)
return -1;
}
-int wait_for_socket_read(int sock)
-{
- fd_set read_fds;
-
- int ret;
- FD_ZERO(&read_fds);
- FD_SET(sock, &read_fds);
-
- ret = select(sock + 1, &read_fds, NULL, NULL, NULL);
- if (ret < 0)
- return ret;
-
- if (FD_ISSET(sock, &read_fds)) {
- return 0;
- }
- return -1;
-}
-
int run_renderer(int new_fd)
{
int ret;
@@ -109,7 +92,7 @@ int run_renderer(int new_fd)
bool do_fence;
bool inited = false;
again:
- ret = wait_for_socket_read(new_fd);
+ ret = vtest_wait_for_fd_read(new_fd);
if (ret < 0)
goto fail;