Rebased ref, commits from common ancestor: commit 2bf79cb2f1fddd004c7e33cbe572242660ee64d0 Author: Emil Velikov <emil.veli...@collabora.com> Date: Mon Apr 24 15:23:07 2017 +0100
Update version to 17.1.0-rc2 Signed-off-by: Emil Velikov <emil.veli...@collabora.com> diff --git a/VERSION b/VERSION index 0bc4493..a8a4fd4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -17.1.0-rc1 +17.1.0-rc2 commit fb6379697b8655ae93ff39cb3b806a8124aded26 Author: Emil Velikov <emil.veli...@collabora.com> Date: Wed Apr 19 11:35:10 2017 +0100 st/clover: add space between < and :: As pointed out by compiler ./llvm/codegen.hpp:52:22: error: ‘<::’ cannot begin a template-argument list [-fpermissive] ./llvm/codegen.hpp:52:22: note: ‘<:’ is an alternate spelling for ‘[’. Insert whitespace between ‘<’ and ‘::’ Cc: Francisco Jerez <curroje...@riseup.net> Signed-off-by: Emil Velikov <emil.veli...@collabora.com> Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com> Reviewed-by: Vedran Miletić <ved...@miletic.net> (cherry picked from commit dd6ec78b4fc1208c9ec330642ad42361fea91678) diff --git a/src/gallium/state_trackers/clover/llvm/codegen.hpp b/src/gallium/state_trackers/clover/llvm/codegen.hpp index 44971ad..25f6e01 100644 --- a/src/gallium/state_trackers/clover/llvm/codegen.hpp +++ b/src/gallium/state_trackers/clover/llvm/codegen.hpp @@ -49,7 +49,7 @@ namespace clover { build_module_library(const ::llvm::Module &mod, enum module::section::type section_type); - std::unique_ptr<::llvm::Module> + std::unique_ptr< ::llvm::Module> parse_module_library(const module &m, ::llvm::LLVMContext &ctx, std::string &r_log); diff --git a/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp b/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp index d09207b..6737f7a 100644 --- a/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp +++ b/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp @@ -94,7 +94,7 @@ clover::llvm::build_module_library(const ::llvm::Module &mod, return m; } -std::unique_ptr<::llvm::Module> +std::unique_ptr< ::llvm::Module> clover::llvm::parse_module_library(const module &m, ::llvm::LLVMContext &ctx, std::string &r_log) { auto mod = ::llvm::parseBitcodeFile(::llvm::MemoryBufferRef( @@ -104,5 +104,5 @@ clover::llvm::parse_module_library(const module &m, ::llvm::LLVMContext &ctx, fail(r_log, error(CL_INVALID_PROGRAM), s); }); - return std::unique_ptr<::llvm::Module>(std::move(*mod)); + return std::unique_ptr< ::llvm::Module>(std::move(*mod)); } diff --git a/src/gallium/state_trackers/clover/llvm/codegen/common.cpp b/src/gallium/state_trackers/clover/llvm/codegen/common.cpp index 3b0014d..0751834 100644 --- a/src/gallium/state_trackers/clover/llvm/codegen/common.cpp +++ b/src/gallium/state_trackers/clover/llvm/codegen/common.cpp @@ -121,12 +121,12 @@ namespace { } else { // Other types. const auto actual_type = - isa<::llvm::PointerType>(arg_type) && arg.hasByValAttr() ? - cast<::llvm::PointerType>(arg_type)->getElementType() : arg_type; + isa< ::llvm::PointerType>(arg_type) && arg.hasByValAttr() ? + cast< ::llvm::PointerType>(arg_type)->getElementType() : arg_type; if (actual_type->isPointerTy()) { const unsigned address_space = - cast<::llvm::PointerType>(actual_type)->getAddressSpace(); + cast< ::llvm::PointerType>(actual_type)->getAddressSpace(); if (address_space == address_spaces[clang::LangAS::opencl_local - compat::lang_as_offset]) { diff --git a/src/gallium/state_trackers/clover/llvm/codegen/native.cpp b/src/gallium/state_trackers/clover/llvm/codegen/native.cpp index 4f24332..b9e6750 100644 --- a/src/gallium/state_trackers/clover/llvm/codegen/native.cpp +++ b/src/gallium/state_trackers/clover/llvm/codegen/native.cpp @@ -156,7 +156,7 @@ clover::llvm::print_module_native(const ::llvm::Module &mod, const target &target) { std::string log; try { - std::unique_ptr<::llvm::Module> cmod { CloneModule(&mod) }; + std::unique_ptr< ::llvm::Module> cmod { CloneModule(&mod) }; return as_string(emit_code(*cmod, target, TargetMachine::CGFT_AssemblyFile, log)); } catch (...) { diff --git a/src/gallium/state_trackers/clover/llvm/compat.hpp b/src/gallium/state_trackers/clover/llvm/compat.hpp index 987680c..cee51b9 100644 --- a/src/gallium/state_trackers/clover/llvm/compat.hpp +++ b/src/gallium/state_trackers/clover/llvm/compat.hpp @@ -132,18 +132,18 @@ namespace clover { #endif } - inline std::unique_ptr<::llvm::Linker> + inline std::unique_ptr< ::llvm::Linker> create_linker(::llvm::Module &mod) { #if HAVE_LLVM >= 0x0308 - return std::unique_ptr<::llvm::Linker>(new ::llvm::Linker(mod)); + return std::unique_ptr< ::llvm::Linker>(new ::llvm::Linker(mod)); #else - return std::unique_ptr<::llvm::Linker>(new ::llvm::Linker(&mod)); + return std::unique_ptr< ::llvm::Linker>(new ::llvm::Linker(&mod)); #endif } inline bool link_in_module(::llvm::Linker &linker, - std::unique_ptr<::llvm::Module> mod) { + std::unique_ptr< ::llvm::Module> mod) { #if HAVE_LLVM >= 0x0308 return linker.linkInModule(std::move(mod)); #else diff --git a/src/gallium/state_trackers/clover/llvm/metadata.hpp b/src/gallium/state_trackers/clover/llvm/metadata.hpp index 814c830..825008d 100644 --- a/src/gallium/state_trackers/clover/llvm/metadata.hpp +++ b/src/gallium/state_trackers/clover/llvm/metadata.hpp @@ -51,7 +51,7 @@ namespace clover { is_kernel_node_for(const ::llvm::Function &f) { return [&](const ::llvm::MDNode *n) { using ::llvm::mdconst::dyn_extract; - return &f == dyn_extract<::llvm::Function>(n->getOperand(0)); + return &f == dyn_extract< ::llvm::Function>(n->getOperand(0)); }; } @@ -65,7 +65,7 @@ namespace clover { #endif } - inline iterator_range<::llvm::MDNode::op_iterator> + inline iterator_range< ::llvm::MDNode::op_iterator> get_kernel_metadata_operands(const ::llvm::Function &f, const std::string &name) { #if HAVE_LLVM >= 0x0309 @@ -79,11 +79,11 @@ namespace clover { const auto kernel_node = find(is_kernel_node_for(f), get_kernel_nodes(*f.getParent())); - const auto data_node = cast<::llvm::MDNode>( + const auto data_node = cast< ::llvm::MDNode>( find([&](const ::llvm::MDOperand &op) { - if (auto m = dyn_cast<::llvm::MDNode>(op)) + if (auto m = dyn_cast< ::llvm::MDNode>(op)) if (m->getNumOperands()) - if (auto m_name = dyn_cast<::llvm::MDString>( + if (auto m_name = dyn_cast< ::llvm::MDString>( m->getOperand(0).get())) return m_name->getString() == name; @@ -106,7 +106,7 @@ namespace clover { get_argument_metadata(const ::llvm::Function &f, const ::llvm::Argument &arg, const std::string &name) { - return ::llvm::cast<::llvm::MDString>( + return ::llvm::cast< ::llvm::MDString>( detail::get_kernel_metadata_operands(f, name)[arg.getArgNo()]) ->getString(); } commit 0948e113d2b0e935b38534d5fc1a0c91e71ef86e Author: Vinson Lee <v...@freedesktop.org> Date: Thu Apr 20 14:48:50 2017 -0700 configure.ac: Fix typos. Signed-off-by: Vinson Lee <v...@freedesktop.org> Reviewed-by: Alejandro Piñeiro <apinhe...@igalia.com> Reviewed-by: Emil Velikov <emil.veli...@collabora.com> Cc: <mesa-sta...@lists.freedesktop.org> (cherry picked from commit b81d85f1754928139f9f01474495e024946aa1b4) diff --git a/configure.ac b/configure.ac index 957d15d..e42fcff 100644 --- a/configure.ac +++ b/configure.ac @@ -724,7 +724,7 @@ dnl Arch/platform-specific settings dnl AC_ARG_ENABLE([asm], [AS_HELP_STRING([--disable-asm], - [disable assembly usage @<:@default=enabled on supported plaforms@:>@])], + [disable assembly usage @<:@default=enabled on supported platforms@:>@])], [enable_asm="$enableval"], [enable_asm=yes] ) @@ -2146,7 +2146,7 @@ dnl DEPRECATED: EGL Platforms configuration dnl AC_ARG_WITH([egl-platforms], [AS_HELP_STRING([--with-egl-platforms@<:@=DIRS...@:>@], - [DEPRECATED: use --with-plaforms instead@<:@default=auto@:>@])], + [DEPRECATED: use --with-platforms instead@<:@default=auto@:>@])], [with_egl_platforms="$withval"], [with_egl_platforms=auto]) @@ -2161,7 +2161,7 @@ if test "x$with_egl_platforms" = xauto; then with_egl_platforms="" fi else - AC_MSG_WARN([--with-egl-platforms is deprecated. Use --with-plaforms instead.]) + AC_MSG_WARN([--with-egl-platforms is deprecated. Use --with-platforms instead.]) fi dnl commit f61c453cfc34c78fecf26e1f92825fda4f5ff46f Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Fri Apr 21 17:04:10 2017 +1000 mesa: validate sampler type across the whole program Currently we were only making sure types were the same within a single stage. This looks to have regressed with 953a0af8e3f73. Fixes: 953a0af8e3f73 ("mesa: validate sampler uniforms during gluniform calls") Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com> Reviewed-by: Tapani Pälli <tapani.pa...@intel.com> https://bugs.freedesktop.org/show_bug.cgi?id=97524 (cherry picked from commit d682f8aa8e0edd166166f87fcd774dd2d57b4180) diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp index e613898..85bb7a4 100644 --- a/src/mesa/main/uniform_query.cpp +++ b/src/mesa/main/uniform_query.cpp @@ -945,6 +945,8 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid *values, */ if (uni->type->is_sampler()) { bool flushed = false; + shProg->SamplersValidated = GL_TRUE; + for (int i = 0; i < MESA_SHADER_STAGES; i++) { struct gl_linked_shader *const sh = shProg->_LinkedShaders[i]; diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c index 59ae4c5..8869b6e 100644 --- a/src/mesa/main/uniforms.c +++ b/src/mesa/main/uniforms.c @@ -67,11 +67,15 @@ void _mesa_update_shader_textures_used(struct gl_shader_program *shProg, struct gl_program *prog) { - memset(prog->TexturesUsed, 0, sizeof(prog->TexturesUsed)); + GLbitfield mask = prog->SamplersUsed; + gl_shader_stage prog_stage = + _mesa_program_enum_to_shader_stage(prog->Target); + struct gl_linked_shader *shader = shProg->_LinkedShaders[prog_stage]; - shProg->SamplersValidated = GL_TRUE; + assert(shader); + + memset(prog->TexturesUsed, 0, sizeof(prog->TexturesUsed)); - GLbitfield mask = prog->SamplersUsed; while (mask) { const int s = u_bit_scan(&mask); GLuint unit = prog->SamplerUnits[s]; @@ -87,8 +91,20 @@ _mesa_update_shader_textures_used(struct gl_shader_program *shProg, * types pointing to the same texture image unit within a program * object." */ - if (prog->TexturesUsed[unit] & ~(1 << tgt)) - shProg->SamplersValidated = GL_FALSE; + unsigned stages_mask = shProg->data->linked_stages; + while (stages_mask) { + const int stage = u_bit_scan(&stages_mask); + + /* Skip validation if we are yet to update textures used in this + * stage. + */ + if (prog_stage < stage) + break; + + struct gl_program *glprog = shProg->_LinkedShaders[stage]->Program; + if (glprog->TexturesUsed[unit] & ~(1 << tgt)) + shProg->SamplersValidated = GL_FALSE; + } prog->TexturesUsed[unit] |= (1 << tgt); } diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp index 6b33266..674905d 100644 --- a/src/mesa/program/ir_to_mesa.cpp +++ b/src/mesa/program/ir_to_mesa.cpp @@ -3117,6 +3117,11 @@ _mesa_glsl_link_shader(struct gl_context *ctx, struct gl_shader_program *prog) } if (prog->data->LinkStatus) { + /* Reset sampler validated to true, validation happens via the + * LinkShader call below. + */ + prog->SamplersValidated = GL_TRUE; + if (!ctx->Driver.LinkShader(ctx, prog)) { prog->data->LinkStatus = linking_failure; } commit 612fc14aab46e85452915d6e77fffee7bb94cfe5 Author: Emil Velikov <emil.veli...@collabora.com> Date: Thu Apr 20 16:24:08 2017 +0100 mesa/glthread: correctly compare thread handles As mentioned in the manual - comparing pthread_t handles via the C comparison operator is incorrect and pthread_equal() should be used instead. Cc: Timothy Arceri <tarc...@itsqueeze.com> Fixes: d8d81fbc316 ("mesa: Add infrastructure for a worker thread to process GL commands.") Signed-off-by: Emil Velikov <emil.veli...@collabora.com> Reviewed-by: Plamena Manolova <plamena.manol...@intel.com> Reviewed-by: Brian Paul <bri...@vmware.com> Reviewed-by: Eric Anholt <e...@anholt.net> (cherry picked from commit 52df318d61f4892dbbaa8f0da4787f25caf1b0d1) diff --git a/src/mesa/main/glthread.c b/src/mesa/main/glthread.c index c4d3f4a..455b829 100644 --- a/src/mesa/main/glthread.c +++ b/src/mesa/main/glthread.c @@ -265,7 +265,7 @@ _mesa_glthread_finish(struct gl_context *ctx) * dri interface entrypoints), in which case we don't need to actually * synchronize against ourself. */ - if (pthread_self() == glthread->thread) + if (pthread_equal(pthread_self(), glthread->thread)) return; pthread_mutex_lock(&glthread->mutex); commit 8aa9aa6a5f86891c106bcc95d88377af1bfa0406 Author: Emil Velikov <emil.veli...@collabora.com> Date: Sun Apr 16 15:46:28 2017 +0100 st/mesa: automake: honour the vdpau header install location If VDPAU is installed in the non-default location, we'll fail to find the headers and error at build time. ../../src/gallium/include/state_tracker/vdpau_dmabuf.h:37:25: fatal error: vdpau/vdpau.h: No such file or directory #include <vdpau/vdpau.h> ^ Fixes: faba96bc60b ("st/vdpau: add new interop interface") Cc: Christian König <christian.koe...@amd.com> Signed-off-by: Emil Velikov <emil.veli...@collabora.com> Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com> (cherry picked from commit 51c0c213b7fa53b249e9fcb9004a3ba1076fe773) diff --git a/src/mesa/Makefile.am b/src/mesa/Makefile.am index 9710c7f..53f311d 100644 --- a/src/mesa/Makefile.am +++ b/src/mesa/Makefile.am @@ -96,6 +96,7 @@ endif AM_CPPFLAGS = $(DEFINES) $(INCLUDE_DIRS) AM_CFLAGS = \ + $(VDPAU_CFLAGS) \ $(LLVM_CFLAGS) \ $(VISIBILITY_CFLAGS) \ $(MSVC2013_COMPAT_CFLAGS) commit 10ff4b49dc49c0c663acad5f678eba0ca33744d6 Author: Emil Velikov <emil.l.veli...@gmail.com> Date: Sun Apr 16 01:46:59 2017 +0100 configure.ac: check require_basic_egl only if egl enabled Fixes: 1ac40173c2a ("configure.ac: simplify EGL requirements for drivers dependent on EGL") Signed-off-by: Emil Velikov <emil.veli...@collabora.com> Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com> (cherry picked from commit 4516bfbd309a6996c18f577de47b13e33dce0828) diff --git a/configure.ac b/configure.ac index e1c60d8..957d15d 100644 --- a/configure.ac +++ b/configure.ac @@ -2466,7 +2466,9 @@ if test -n "$with_gallium_drivers"; then xvirgl) HAVE_GALLIUM_VIRGL=yes require_libdrm "virgl" - require_basic_egl "virgl" + if test "x$enable_egl" = xyes; then + require_basic_egl "virgl" + fi ;; *) AC_MSG_ERROR([Unknown Gallium driver: $driver]) commit 3d40db7892d314b78353e2ee28912873c17ca844 Author: Emil Velikov <emil.veli...@collabora.com> Date: Tue Apr 18 11:33:42 2017 +0100 configure.ac: manually expand PKG_CHECK_VAR The macro is introduced with pkgconfig v0.28 which isn't universally available. Thus it will error at configure stage. Reported-by: Brian Paul <bri...@vmware.com> Tested-by: Brian Paul <bri...@vmware.com> Fixes: ce562f9e3fa ("EGL: Implement the libglvnd interface for EGL (v3)") Signed-off-by: Emil Velikov <emil.veli...@collabora.com> (cherry picked from commit 179e21a72045ceb09cebf4c426bae16580fdd438) diff --git a/configure.ac b/configure.ac index e18f12f..e1c60d8 100644 --- a/configure.ac +++ b/configure.ac @@ -1367,7 +1367,7 @@ if test "x$enable_libglvnd" = xyes ; then esac PKG_CHECK_MODULES([GLVND], libglvnd >= 0.2.0) - PKG_CHECK_VAR(LIBGLVND_DATADIR, libglvnd, datadir) + LIBGLVND_DATADIR=`$PKG_CONFIG --variable=datadir libglvnd` AC_SUBST([LIBGLVND_DATADIR]) DEFINES="${DEFINES} -DUSE_LIBGLVND=1" commit 99da9dfd955fae26aede6d442cf564eee25d5048 Author: Rob Clark <robdcl...@gmail.com> Date: Mon Apr 17 21:20:37 2017 -0400 util/queue: don't hang at exit So atexit() is horrible and 4aea8fe7 is probably not a good idea. But add an extra layer of duct-tape to the problem. Otherwise we hit a situation where app using an atexit() handler that runs later than ours doesn't hang when trying to tear down a context. (gdb) bt #0 util_queue_killall_and_wait (queue=queue@entry=0x52bc80) at ../../../src/util/u_queue.c:264 #1 0x0000007fb6c380c0 in atexit_handler () at ../../../src/util/u_queue.c:51 #2 0x0000007fb7730e2c in __run_exit_handlers () from /lib64/libc.so.6 #3 0x0000007fb7730e5c in exit () from /lib64/libc.so.6 #4 0x0000007fb7ce17dc in piglit_report_result (result=PIGLIT_PASS) at /home/robclark/src/piglit/tests/util/piglit-util.c:267 #5 0x0000007fb7ef99f8 in process_next_event (x11_fw=0x432c20) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_x11_framework.c:139 #6 0x0000007fb7ef9a90 in enter_event_loop (winsys_fw=0x432c20) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_x11_framework.c:153 #7 0x0000007fb7ef8e50 in run_test (gl_fw=0x432c20, argc=1, argv=0x7ffffff588) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_winsys_framework.c:88 #8 0x0000007fb7edb890 in piglit_gl_test_run (argc=1, argv=0x7ffffff588, config=0x7ffffff400) at /home/robclark/src/piglit/tests/util/piglit-framework-gl.c:203 #9 0x0000000000401224 in main (argc=1, argv=0x7ffffff588) at /home/robclark/src/piglit/tests/bugs/drawbuffer-modes.c:46 (gdb) c Continuing. [Thread 0x7fb67580c0 (LWP 3471) exited] ^C Thread 1 "drawbuffer-mode" received signal SIGINT, Interrupt. 0x0000007fb72dda34 in pthread_cond_wait@@GLIBC_2.17 () from /lib64/libpthread.so.0 (gdb) bt #0 0x0000007fb72dda34 in pthread_cond_wait@@GLIBC_2.17 () from /lib64/libpthread.so.0 #1 0x0000007fb6c38304 in cnd_wait (mtx=0x5bdc90, cond=0x5bdcc0) at ../../../include/c11/threads_posix.h:159 #2 util_queue_fence_wait (fence=0x5bdc90) at ../../../src/util/u_queue.c:106 #3 0x0000007fb6daac70 in fd_batch_sync (batch=0x5bdc70) at ../../../../../src/gallium/drivers/freedreno/freedreno_batch.c:233 #4 batch_reset (batch=batch@entry=0x5bdc70) at ../../../../../src/gallium/drivers/freedreno/freedreno_batch.c:183 #5 0x0000007fb6daa5e0 in batch_flush (batch=0x5bdc70) at ../../../../../src/gallium/drivers/freedreno/freedreno_batch.c:290 #6 fd_batch_flush (batch=0x5bdc70, sync=<optimized out>) at ../../../../../src/gallium/drivers/freedreno/freedreno_batch.c:308 #7 0x0000007fb6daba2c in fd_bc_flush (cache=0x461220, ctx=0x52b920) at ../../../../../src/gallium/drivers/freedreno/freedreno_batch_cache.c:141 #8 0x0000007fb6dac954 in fd_context_flush (pctx=0x52b920, fence=0x0, flags=<optimized out>) at ../../../../../src/gallium/drivers/freedreno/freedreno_context.c:54 #9 0x0000007fb6b43294 in st_glFlush (ctx=<optimized out>) at ../../../src/mesa/state_tracker/st_cb_flush.c:121 #10 0x0000007fb69a84e8 in _mesa_make_current (newCtx=newCtx@entry=0x0, drawBuffer=drawBuffer@entry=0x0, readBuffer=readBuffer@entry=0x0) at ../../../src/mesa/main/context.c:1654 #11 0x0000007fb6b7ca58 in st_api_make_current (stapi=<optimized out>, stctxi=0x0, stdrawi=0x0, streadi=0x0) at ../../../src/mesa/state_tracker/st_manager.c:827 #12 0x0000007fb6cc87e8 in dri_unbind_context (cPriv=<optimized out>) at ../../../../../src/gallium/state_trackers/dri/dri_context.c:217 #13 0x0000007fb6cc80b0 in driUnbindContext (pcp=0x5271e0) at ../../../../../../src/mesa/drivers/dri/common/dri_util.c:591 #14 0x0000007fb7d1da08 in MakeContextCurrent (dpy=0x433380, draw=0, read=0, gc_user=0x0) at ../../../src/glx/glxcurrent.c:214 #15 0x0000007fb7a8d5e0 in glx_platform_make_current () from /lib64/libwaffle-1.so.0 #16 0x0000007fb7a894e4 in waffle_make_current () from /lib64/libwaffle-1.so.0 #17 0x0000007fb7ef8c60 in piglit_wfl_framework_teardown (wfl_fw=0x432c20) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_wfl_framework.c:628 #18 0x0000007fb7ef939c in piglit_winsys_framework_teardown (winsys_fw=0x432c20) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_winsys_framework.c:238 #19 0x0000007fb7ef9c30 in destroy (gl_fw=0x432c20) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_x11_framework.c:212 #20 0x0000007fb7edb7c4 in destroy () at /home/robclark/src/piglit/tests/util/piglit-framework-gl.c:184 #21 0x0000007fb7730e2c in __run_exit_handlers () from /lib64/libc.so.6 #22 0x0000007fb7730e5c in exit () from /lib64/libc.so.6 #23 0x0000007fb7ce17dc in piglit_report_result (result=PIGLIT_PASS) at /home/robclark/src/piglit/tests/util/piglit-util.c:267 #24 0x0000007fb7ef99f8 in process_next_event (x11_fw=0x432c20) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_x11_framework.c:139 #25 0x0000007fb7ef9a90 in enter_event_loop (winsys_fw=0x432c20) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_x11_framework.c:153 #26 0x0000007fb7ef8e50 in run_test (gl_fw=0x432c20, argc=1, argv=0x7ffffff588) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_winsys_framework.c:88 #27 0x0000007fb7edb890 in piglit_gl_test_run (argc=1, argv=0x7ffffff588, config=0x7ffffff400) at /home/robclark/src/piglit/tests/util/piglit-framework-gl.c:203 #28 0x0000000000401224 in main (argc=1, argv=0x7ffffff588) at /home/robclark/src/piglit/tests/bugs/drawbuffer-modes.c:46 (gdb) r Fixes: 4aea8fe7 ("gallium/u_queue: fix random crashes when the app calls exit()") Signed-off-by: Rob Clark <robdcl...@gmail.com> Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com> (cherry picked from commit 6fb7935dedc87ffd767a2999f402ce1a46d18cce) diff --git a/src/util/u_queue.c b/src/util/u_queue.c index 0519667..8db09b0 100644 --- a/src/util/u_queue.c +++ b/src/util/u_queue.c @@ -298,9 +298,18 @@ util_queue_add_job(struct util_queue *queue, struct util_queue_job *ptr; assert(fence->signalled); - fence->signalled = false; mtx_lock(&queue->lock); + if (queue->kill_threads) { + mtx_unlock(&queue->lock); + /* well no good option here, but any leaks will be + * short-lived as things are shutting down.. + */ + return; + } + + fence->signalled = false; + assert(queue->num_queued >= 0 && queue->num_queued <= queue->max_jobs); /* if the queue is full, wait until there is space */ commit fcbb263f8c6f342a116346081c1ed8ac123940f9 Author: Emil Velikov <emil.veli...@collabora.com> Date: Mon Apr 17 15:07:44 2017 +0100 configure.ac: print deprecation warning as needed The warning should be printed only when one explicitly uses the deprecated configure toggle. Fixes: 7748c3f5eb1 ("configure.ac: deprecate --with-egl-platforms over --with-platforms") Signed-off-by: Emil Velikov <emil.l.veli...@gmail.com> (cherry picked from commit 9915753e631a203d7f22bfa308fbf688644a8a37) diff --git a/configure.ac b/configure.ac index 2dd5cf0..e18f12f 100644 --- a/configure.ac +++ b/configure.ac @@ -2151,7 +2151,6 @@ AC_ARG_WITH([egl-platforms], [with_egl_platforms=auto]) if test "x$with_egl_platforms" = xauto; then - AC_MSG_WARN([--with-egl-platforms is deprecated. Use --with-plaforms instead.]) if test "x$enable_egl" = xyes; then if test "x$enable_gbm" = xyes; then with_egl_platforms="x11,drm" @@ -2161,6 +2160,8 @@ if test "x$with_egl_platforms" = xauto; then else with_egl_platforms="" fi +else + AC_MSG_WARN([--with-egl-platforms is deprecated. Use --with-plaforms instead.]) fi dnl commit 29fa5b6e1c02f443803710172b63bdc04a4b3e0c Author: Marek Olšák <marek.ol...@amd.com> Date: Sun Apr 9 16:03:59 2017 +0200 st/mesa: invalidate the readpix cache in st_indirect_draw_vbo Cc: <mesa-sta...@lists.freedesktop.org> Reviewed-by: Ilia Mirkin <imir...@alum.mit.edu> Reviewed-by: Brian Paul <bri...@vmware.com> (cherry picked from commit 7cd6e2df65de9e2f0d77022a64c4e48ca2ebcb33) diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index f04b6c2..eb8ac2e 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -282,6 +282,8 @@ st_indirect_draw_vbo(struct gl_context *ctx, assert(ctx->NewState == 0x0); assert(stride); + st_invalidate_readpix_cache(st); + /* Validate state. */ if ((st->dirty | ctx->NewDriverState) & ST_PIPELINE_RENDER_STATE_MASK || st->gfx_shaders_may_be_dirty) { commit 4e7e903bb39fdd22dea01b410e9ae390c58777ac Author: Emil Velikov <emil.veli...@collabora.com> Date: Sun Apr 16 14:39:03 2017 +0100 winsys/sw/dri: don't use GNU void pointer arithmetic Resolves build issues like the following: src/gallium/winsys/sw/dri/dri_sw_winsys.c:203:31: error: pointer of type ‘void *’ used in arithmetic [-Werror=pointer-arith] data = dri_sw_dt->data + (dri_sw_dt->stride * box->y) + box->x * blsize; ^ src/gallium/winsys/sw/dri/dri_sw_winsys.c:203:62: error: pointer of type ‘void *’ used in arithmetic [-Werror=pointer-arith] data = dri_sw_dt->data + (dri_sw_dt->stride * box->y) + box->x * blsize; ^ Cc: <mesa-sta...@lists.freedesktop.org> Signed-off-by: Emil Velikov <emil.veli...@collabora.com> Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com> (cherry picked from commit 309f4067a795219027f523bf0733692e48f2fd58) diff --git a/src/gallium/winsys/sw/dri/dri_sw_winsys.c b/src/gallium/winsys/sw/dri/dri_sw_winsys.c index 94d5092..0084998 100644 --- a/src/gallium/winsys/sw/dri/dri_sw_winsys.c +++ b/src/gallium/winsys/sw/dri/dri_sw_winsys.c @@ -200,7 +200,7 @@ dri_sw_displaytarget_display(struct sw_winsys *ws, if (box) { void *data; - data = dri_sw_dt->data + (dri_sw_dt->stride * box->y) + box->x * blsize; + data = (char *)dri_sw_dt->data + (dri_sw_dt->stride * box->y) + box->x * blsize; dri_sw_ws->lf->put_image2(dri_drawable, data, box->x, box->y, box->width, box->height, dri_sw_dt->stride); } else { commit 26949e872b482d4ac2226f0097ee76d057b33103 Author: Nicolai Hähnle <nicolai.haeh...@amd.com> Date: Fri Apr 7 18:24:44 2017 +0200 vbo: fix gl_DrawID handling in glMultiDrawArrays Fixes a bug in KHR-GL45.shader_draw_parameters_tests.ShaderMultiDrawArraysParameters. Cc: mesa-sta...@lists.freedesktop.org Reviewed-by: Marek Olšák <marek.ol...@amd.com> (cherry picked from commit 51deba0eb35d0d27560bb7dad24b8d39abb58be6) diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c index 6858eb3..e5eeae4 100644 --- a/src/mesa/vbo/vbo_exec_array.c +++ b/src/mesa/vbo/vbo_exec_array.c @@ -404,7 +404,8 @@ vbo_bind_arrays(struct gl_context *ctx) */ static void vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start, - GLsizei count, GLuint numInstances, GLuint baseInstance) + GLsizei count, GLuint numInstances, GLuint baseInstance, + GLuint drawID) { struct vbo_context *vbo = vbo_context(ctx); struct _mesa_prim prim[2]; @@ -420,6 +421,7 @@ vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start, prim[0].mode = mode; prim[0].num_instances = numInstances; prim[0].base_instance = baseInstance; + prim[0].draw_id = drawID; prim[0].is_indirect = 0; prim[0].start = start; prim[0].count = count; @@ -572,7 +574,7 @@ vbo_exec_DrawArrays(GLenum mode, GLint start, GLsizei count) if (0) check_draw_arrays_data(ctx, start, count); - vbo_draw_arrays(ctx, mode, start, count, 1, 0); + vbo_draw_arrays(ctx, mode, start, count, 1, 0, 0); if (0) print_draw_arrays(ctx, mode, start, count); @@ -600,7 +602,7 @@ vbo_exec_DrawArraysInstanced(GLenum mode, GLint start, GLsizei count, if (0) check_draw_arrays_data(ctx, start, count); - vbo_draw_arrays(ctx, mode, start, count, numInstances, 0); + vbo_draw_arrays(ctx, mode, start, count, numInstances, 0, 0); if (0) print_draw_arrays(ctx, mode, start, count); @@ -630,7 +632,7 @@ vbo_exec_DrawArraysInstancedBaseInstance(GLenum mode, GLint first, if (0) check_draw_arrays_data(ctx, first, count); - vbo_draw_arrays(ctx, mode, first, count, numInstances, baseInstance); + vbo_draw_arrays(ctx, mode, first, count, numInstances, baseInstance, 0); if (0) print_draw_arrays(ctx, mode, first, count); @@ -660,7 +662,14 @@ vbo_exec_MultiDrawArrays(GLenum mode, const GLint *first, if (0) check_draw_arrays_data(ctx, first[i], count[i]); - vbo_draw_arrays(ctx, mode, first[i], count[i], 1, 0); + /* The GL_ARB_shader_draw_parameters spec adds the following after the + * pseudo-code describing glMultiDrawArrays: + * + * "The index of the draw (<i> in the above pseudo-code) may be + * read by a vertex shader as <gl_DrawIDARB>, as described in + * Section 11.1.3.9." + */ + vbo_draw_arrays(ctx, mode, first[i], count[i], 1, 0, i); if (0) print_draw_arrays(ctx, mode, first[i], count[i]); @@ -1262,7 +1271,7 @@ vbo_draw_transform_feedback(struct gl_context *ctx, GLenum mode, !_mesa_all_varyings_in_vbos(ctx->Array.VAO))) { GLsizei n = ctx->Driver.GetTransformFeedbackVertexCount(ctx, obj, stream); - vbo_draw_arrays(ctx, mode, 0, n, numInstances, 0); + vbo_draw_arrays(ctx, mode, 0, n, numInstances, 0, 0); return; } commit 2cc119c35aef3ebee39307cb16f1fc8298be6395 Author: Nicolai Hähnle <nicolai.haeh...@amd.com> Date: Fri Apr 7 18:20:34 2017 +0200 mesa: move glMultiDrawArrays to vbo and fix error handling When any count[i] is negative, we must skip all draws. Moving to vbo makes the subsequent change easier. v2: - provide the function in all contexts, including GLES - adjust validation accordingly to include the xfb check v3: - fix mix-up of pre- and post-xfb prim count (Nils Wallménius) Cc: mesa-sta...@lists.freedesktop.org Reviewed-by: Timothy Arceri <tarc...@itsqueeze.com> Reviewed-by: Marek Olšák <marek.ol...@amd.com> (cherry picked from commit 42d5465b9ba85b4918b9e6fb57994720e3c8a80b) diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml index c0ee2f2..522d2e5 100644 --- a/src/mapi/glapi/gen/gl_API.xml +++ b/src/mapi/glapi/gen/gl_API.xml @@ -10219,7 +10219,7 @@ </category> <category name="GL_EXT_multi_draw_arrays" number="148"> - <function name="MultiDrawArraysEXT" es1="1.0" es2="2.0" alias="MultiDrawArrays"> + <function name="MultiDrawArraysEXT" es1="1.0" es2="2.0" exec="dynamic" alias="MultiDrawArrays"> <param name="mode" type="GLenum"/> <param name="first" type="const GLint *"/> <param name="count" type="const GLsizei *"/> diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c index 2e1829b..e23be60 100644 --- a/src/mesa/main/api_validate.c +++ b/src/mesa/main/api_validate.c @@ -921,6 +921,60 @@ _mesa_validate_DrawArraysInstanced(struct gl_context *ctx, GLenum mode, GLint fi } +/** + * Called to error check the function parameters. + * + * Note that glMultiDrawArrays is not part of GLES, so there's limited scope + * for sharing code with the validation of glDrawArrays. + */ +bool +_mesa_validate_MultiDrawArrays(struct gl_context *ctx, GLenum mode, + const GLsizei *count, GLsizei primcount) +{ + int i; + + FLUSH_CURRENT(ctx, 0); + + if (!_mesa_valid_prim_mode(ctx, mode, "glMultiDrawArrays")) + return false; + + if (!check_valid_to_render(ctx, "glMultiDrawArrays")) + return false; + + if (primcount < 0) { + _mesa_error(ctx, GL_INVALID_VALUE, "glMultiDrawArrays(primcount=%d)", + primcount); + return false; + } + + for (i = 0; i < primcount; ++i) { + if (count[i] < 0) { + _mesa_error(ctx, GL_INVALID_VALUE, "glMultiDrawArrays(count[%d]=%d)", + i, count[i]); + return false; + } + } + + if (need_xfb_remaining_prims_check(ctx)) { + struct gl_transform_feedback_object *xfb_obj + = ctx->TransformFeedback.CurrentObject; + size_t xfb_prim_count = 0; + + for (i = 0; i < primcount; ++i) + xfb_prim_count += vbo_count_tessellated_primitives(mode, count[i], 1); + + if (xfb_obj->GlesRemainingPrims < xfb_prim_count) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glMultiDrawArrays(exceeds transform feedback size)"); + return false; + } + xfb_obj->GlesRemainingPrims -= xfb_prim_count; + } + + return true; +} + + GLboolean _mesa_validate_DrawElementsInstanced(struct gl_context *ctx, GLenum mode, GLsizei count, GLenum type, diff --git a/src/mesa/main/api_validate.h b/src/mesa/main/api_validate.h index de520c9..93ec93d 100644 --- a/src/mesa/main/api_validate.h +++ b/src/mesa/main/api_validate.h @@ -48,6 +48,10 @@ _mesa_valid_prim_mode(struct gl_context *ctx, GLenum mode, const char *name); extern GLboolean _mesa_validate_DrawArrays(struct gl_context *ctx, GLenum mode, GLsizei count); +extern bool +_mesa_validate_MultiDrawArrays(struct gl_context *ctx, GLenum mode, + const GLsizei *count, GLsizei primcount); + extern GLboolean _mesa_validate_DrawElements(struct gl_context *ctx, GLenum mode, GLsizei count, GLenum type, diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c index 233dc0d..2054985 100644 --- a/src/mesa/main/varray.c +++ b/src/mesa/main/varray.c @@ -1539,24 +1539,6 @@ _mesa_UnlockArraysEXT( void ) } -/* GL_EXT_multi_draw_arrays */ -void GLAPIENTRY -_mesa_MultiDrawArrays( GLenum mode, const GLint *first, - const GLsizei *count, GLsizei primcount ) -{ - GET_CURRENT_CONTEXT(ctx); - GLint i; - - FLUSH_VERTICES(ctx, 0); - - for (i = 0; i < primcount; i++) { - if (count[i] > 0) { - CALL_DrawArrays(ctx->CurrentClientDispatch, (mode, first[i], count[i])); - } - } -} - - /* GL_IBM_multimode_draw_arrays */ void GLAPIENTRY _mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first, diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c index 30c52d5..6858eb3 100644 --- a/src/mesa/vbo/vbo_exec_array.c +++ b/src/mesa/vbo/vbo_exec_array.c @@ -637,6 +637,38 @@ vbo_exec_DrawArraysInstancedBaseInstance(GLenum mode, GLint first, } +/** + * Called from glMultiDrawArrays when in immediate mode. + */ +static void GLAPIENTRY +vbo_exec_MultiDrawArrays(GLenum mode, const GLint *first, + const GLsizei *count, GLsizei primcount) +{ + GET_CURRENT_CONTEXT(ctx); + GLint i; + + if (MESA_VERBOSE & VERBOSE_DRAW) + _mesa_debug(ctx, + "glMultiDrawArrays(%s, %p, %p, %d)\n", + _mesa_enum_to_string(mode), first, count, primcount); + + if (!_mesa_validate_MultiDrawArrays(ctx, mode, count, primcount)) + return; + + for (i = 0; i < primcount; i++) { + if (count[i] > 0) { + if (0) + check_draw_arrays_data(ctx, first[i], count[i]); + + vbo_draw_arrays(ctx, mode, first[i], count[i], 1, 0); + + if (0) + print_draw_arrays(ctx, mode, first[i], count[i]); + } + } +} + + /** * Map GL_ELEMENT_ARRAY_BUFFER and print contents. @@ -1641,6 +1673,7 @@ vbo_initialize_exec_dispatch(const struct gl_context *ctx, SET_DrawRangeElements(exec, vbo_exec_DrawRangeElements); } + SET_MultiDrawArrays(exec, vbo_exec_MultiDrawArrays); SET_MultiDrawElementsEXT(exec, vbo_exec_MultiDrawElements); if (ctx->API == API_OPENGL_COMPAT) { diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c index f8dab0c..ad54c3b 100644 --- a/src/mesa/vbo/vbo_save_api.c +++ b/src/mesa/vbo/vbo_save_api.c @@ -1176,6 +1176,40 @@ _save_OBE_DrawArrays(GLenum mode, GLint start, GLsizei count) } +static void GLAPIENTRY +_save_OBE_MultiDrawArrays(GLenum mode, const GLint *first, + const GLsizei *count, GLsizei primcount) +{ + GET_CURRENT_CONTEXT(ctx); + GLint i; + + if (!_mesa_is_valid_prim_mode(ctx, mode)) { + _mesa_compile_error(ctx, GL_INVALID_ENUM, "glMultiDrawArrays(mode)"); + return; + } + + if (primcount < 0) { + _mesa_compile_error(ctx, GL_INVALID_VALUE, + "glMultiDrawArrays(primcount<0)"); + return; + } + + for (i = 0; i < primcount; i++) { + if (count[i] < 0) { + _mesa_compile_error(ctx, GL_INVALID_VALUE, + "glMultiDrawArrays(count[i]<0)"); + return; + } + } + + for (i = 0; i < primcount; i++) { + if (count[i] > 0) { + _save_OBE_DrawArrays(mode, first[i], count[i]); + } + } +} + + /* Could do better by copying the arrays and element list intact and * then emitting an indexed prim at runtime. */ @@ -1484,6 +1518,7 @@ vbo_initialize_save_dispatch(const struct gl_context *ctx, struct _glapi_table *exec) { SET_DrawArrays(exec, _save_OBE_DrawArrays); + SET_MultiDrawArrays(exec, _save_OBE_MultiDrawArrays); SET_DrawElements(exec, _save_OBE_DrawElements); SET_DrawElementsBaseVertex(exec, _save_OBE_DrawElementsBaseVertex); SET_DrawRangeElements(exec, _save_OBE_DrawRangeElements); commit 6abdbd8b1014f3e11885fa46716f1d2b3df9e5c2 Author: Nicolai Hähnle <nicolai.haeh...@amd.com> Date: Thu Apr 13 21:06:11 2017 +0200 mesa: extract need_xfb_remaining_prims_check The same logic needs to be applied to glMultiDrawArrays. Cc: mesa-sta...@lists.freedesktop.org Reviewed-by: Timothy Arceri <tarc...@itsqueeze.com> Reviewed-by: Marek Olšák <marek.ol...@amd.com> (cherry picked from commit 756e9ebbdd84018382908d3556973a62dbda09ca) diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c index 8f83432..2e1829b 100644 --- a/src/mesa/main/api_validate.c +++ b/src/mesa/main/api_validate.c @@ -816,25 +816,10 @@ _mesa_validate_DrawRangeElements(struct gl_context *ctx, GLenum mode, "glDrawRangeElements"); } + static bool -validate_draw_arrays(struct gl_context *ctx, const char *func, - GLenum mode, GLsizei count, GLsizei numInstances) +need_xfb_remaining_prims_check(const struct gl_context *ctx) { - struct gl_transform_feedback_object *xfb_obj - = ctx->TransformFeedback.CurrentObject; - FLUSH_CURRENT(ctx, 0); - - if (count < 0) { - _mesa_error(ctx, GL_INVALID_VALUE, "%s(count)", func); - return false; - } - - if (!_mesa_valid_prim_mode(ctx, mode, func)) - return false; - - if (!check_valid_to_render(ctx, func)) - return false; - /* From the GLES3 specification, section 2.14.2 (Transform Feedback * Primitive Capture): * @@ -862,9 +847,32 @@ validate_draw_arrays(struct gl_context *ctx, const char *func, * is removed and replaced with the GL behavior (primitives are not * written and the corresponding counter is not updated)..." */