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 +#include +#include +#include + +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 #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 #include +#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;