Compare commits
22 Commits
chadv/revi
...
mesa-17.1.
Author | SHA1 | Date | |
---|---|---|---|
|
2bf79cb2f1 | ||
|
fb6379697b | ||
|
0948e113d2 | ||
|
f61c453cfc | ||
|
612fc14aab | ||
|
8aa9aa6a5f | ||
|
10ff4b49dc | ||
|
3d40db7892 | ||
|
99da9dfd95 | ||
|
fcbb263f8c | ||
|
29fa5b6e1c | ||
|
4e7e903bb3 | ||
|
26949e872b | ||
|
2cc119c35a | ||
|
6abdbd8b10 | ||
|
24c05c57e4 | ||
|
7ae90b4f65 | ||
|
0f2ac6ded8 | ||
|
bea2c4b88f | ||
|
ed846b4c78 | ||
|
8c69adf9a9 | ||
|
47dd2544e1 |
13
configure.ac
13
configure.ac
@@ -724,7 +724,7 @@ dnl Arch/platform-specific settings
|
|||||||
dnl
|
dnl
|
||||||
AC_ARG_ENABLE([asm],
|
AC_ARG_ENABLE([asm],
|
||||||
[AS_HELP_STRING([--disable-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="$enableval"],
|
||||||
[enable_asm=yes]
|
[enable_asm=yes]
|
||||||
)
|
)
|
||||||
@@ -1367,7 +1367,7 @@ if test "x$enable_libglvnd" = xyes ; then
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
PKG_CHECK_MODULES([GLVND], libglvnd >= 0.2.0)
|
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])
|
AC_SUBST([LIBGLVND_DATADIR])
|
||||||
|
|
||||||
DEFINES="${DEFINES} -DUSE_LIBGLVND=1"
|
DEFINES="${DEFINES} -DUSE_LIBGLVND=1"
|
||||||
@@ -2146,12 +2146,11 @@ dnl DEPRECATED: EGL Platforms configuration
|
|||||||
dnl
|
dnl
|
||||||
AC_ARG_WITH([egl-platforms],
|
AC_ARG_WITH([egl-platforms],
|
||||||
[AS_HELP_STRING([--with-egl-platforms@<:@=DIRS...@:>@],
|
[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="$withval"],
|
||||||
[with_egl_platforms=auto])
|
[with_egl_platforms=auto])
|
||||||
|
|
||||||
if test "x$with_egl_platforms" = xauto; then
|
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_egl" = xyes; then
|
||||||
if test "x$enable_gbm" = xyes; then
|
if test "x$enable_gbm" = xyes; then
|
||||||
with_egl_platforms="x11,drm"
|
with_egl_platforms="x11,drm"
|
||||||
@@ -2161,6 +2160,8 @@ if test "x$with_egl_platforms" = xauto; then
|
|||||||
else
|
else
|
||||||
with_egl_platforms=""
|
with_egl_platforms=""
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
AC_MSG_WARN([--with-egl-platforms is deprecated. Use --with-platforms instead.])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl
|
dnl
|
||||||
@@ -2465,7 +2466,9 @@ if test -n "$with_gallium_drivers"; then
|
|||||||
xvirgl)
|
xvirgl)
|
||||||
HAVE_GALLIUM_VIRGL=yes
|
HAVE_GALLIUM_VIRGL=yes
|
||||||
require_libdrm "virgl"
|
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])
|
AC_MSG_ERROR([Unknown Gallium driver: $driver])
|
||||||
|
@@ -112,7 +112,7 @@ fd_context_destroy(struct pipe_context *pctx)
|
|||||||
|
|
||||||
DBG("");
|
DBG("");
|
||||||
|
|
||||||
if (ctx->screen->reorder)
|
if (ctx->screen->reorder && util_queue_is_initialized(&ctx->flush_queue))
|
||||||
util_queue_destroy(&ctx->flush_queue);
|
util_queue_destroy(&ctx->flush_queue);
|
||||||
|
|
||||||
fd_batch_reference(&ctx->batch, NULL); /* unref current batch */
|
fd_batch_reference(&ctx->batch, NULL); /* unref current batch */
|
||||||
|
@@ -49,7 +49,7 @@ namespace clover {
|
|||||||
build_module_library(const ::llvm::Module &mod,
|
build_module_library(const ::llvm::Module &mod,
|
||||||
enum module::section::type section_type);
|
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,
|
parse_module_library(const module &m, ::llvm::LLVMContext &ctx,
|
||||||
std::string &r_log);
|
std::string &r_log);
|
||||||
|
|
||||||
|
@@ -94,7 +94,7 @@ clover::llvm::build_module_library(const ::llvm::Module &mod,
|
|||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<::llvm::Module>
|
std::unique_ptr< ::llvm::Module>
|
||||||
clover::llvm::parse_module_library(const module &m, ::llvm::LLVMContext &ctx,
|
clover::llvm::parse_module_library(const module &m, ::llvm::LLVMContext &ctx,
|
||||||
std::string &r_log) {
|
std::string &r_log) {
|
||||||
auto mod = ::llvm::parseBitcodeFile(::llvm::MemoryBufferRef(
|
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);
|
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));
|
||||||
}
|
}
|
||||||
|
@@ -121,12 +121,12 @@ namespace {
|
|||||||
} else {
|
} else {
|
||||||
// Other types.
|
// Other types.
|
||||||
const auto actual_type =
|
const auto actual_type =
|
||||||
isa<::llvm::PointerType>(arg_type) && arg.hasByValAttr() ?
|
isa< ::llvm::PointerType>(arg_type) && arg.hasByValAttr() ?
|
||||||
cast<::llvm::PointerType>(arg_type)->getElementType() : arg_type;
|
cast< ::llvm::PointerType>(arg_type)->getElementType() : arg_type;
|
||||||
|
|
||||||
if (actual_type->isPointerTy()) {
|
if (actual_type->isPointerTy()) {
|
||||||
const unsigned address_space =
|
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
|
if (address_space == address_spaces[clang::LangAS::opencl_local
|
||||||
- compat::lang_as_offset]) {
|
- compat::lang_as_offset]) {
|
||||||
|
@@ -156,7 +156,7 @@ clover::llvm::print_module_native(const ::llvm::Module &mod,
|
|||||||
const target &target) {
|
const target &target) {
|
||||||
std::string log;
|
std::string log;
|
||||||
try {
|
try {
|
||||||
std::unique_ptr<::llvm::Module> cmod { CloneModule(&mod) };
|
std::unique_ptr< ::llvm::Module> cmod { CloneModule(&mod) };
|
||||||
return as_string(emit_code(*cmod, target,
|
return as_string(emit_code(*cmod, target,
|
||||||
TargetMachine::CGFT_AssemblyFile, log));
|
TargetMachine::CGFT_AssemblyFile, log));
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
@@ -132,18 +132,18 @@ namespace clover {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::unique_ptr<::llvm::Linker>
|
inline std::unique_ptr< ::llvm::Linker>
|
||||||
create_linker(::llvm::Module &mod) {
|
create_linker(::llvm::Module &mod) {
|
||||||
#if HAVE_LLVM >= 0x0308
|
#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
|
#else
|
||||||
return std::unique_ptr<::llvm::Linker>(new ::llvm::Linker(&mod));
|
return std::unique_ptr< ::llvm::Linker>(new ::llvm::Linker(&mod));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
inline bool
|
||||||
link_in_module(::llvm::Linker &linker,
|
link_in_module(::llvm::Linker &linker,
|
||||||
std::unique_ptr<::llvm::Module> mod) {
|
std::unique_ptr< ::llvm::Module> mod) {
|
||||||
#if HAVE_LLVM >= 0x0308
|
#if HAVE_LLVM >= 0x0308
|
||||||
return linker.linkInModule(std::move(mod));
|
return linker.linkInModule(std::move(mod));
|
||||||
#else
|
#else
|
||||||
|
@@ -51,7 +51,7 @@ namespace clover {
|
|||||||
is_kernel_node_for(const ::llvm::Function &f) {
|
is_kernel_node_for(const ::llvm::Function &f) {
|
||||||
return [&](const ::llvm::MDNode *n) {
|
return [&](const ::llvm::MDNode *n) {
|
||||||
using ::llvm::mdconst::dyn_extract;
|
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
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
inline iterator_range<::llvm::MDNode::op_iterator>
|
inline iterator_range< ::llvm::MDNode::op_iterator>
|
||||||
get_kernel_metadata_operands(const ::llvm::Function &f,
|
get_kernel_metadata_operands(const ::llvm::Function &f,
|
||||||
const std::string &name) {
|
const std::string &name) {
|
||||||
#if HAVE_LLVM >= 0x0309
|
#if HAVE_LLVM >= 0x0309
|
||||||
@@ -79,11 +79,11 @@ namespace clover {
|
|||||||
const auto kernel_node = find(is_kernel_node_for(f),
|
const auto kernel_node = find(is_kernel_node_for(f),
|
||||||
get_kernel_nodes(*f.getParent()));
|
get_kernel_nodes(*f.getParent()));
|
||||||
|
|
||||||
const auto data_node = cast<::llvm::MDNode>(
|
const auto data_node = cast< ::llvm::MDNode>(
|
||||||
find([&](const ::llvm::MDOperand &op) {
|
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 (m->getNumOperands())
|
||||||
if (auto m_name = dyn_cast<::llvm::MDString>(
|
if (auto m_name = dyn_cast< ::llvm::MDString>(
|
||||||
m->getOperand(0).get()))
|
m->getOperand(0).get()))
|
||||||
return m_name->getString() == name;
|
return m_name->getString() == name;
|
||||||
|
|
||||||
@@ -106,7 +106,7 @@ namespace clover {
|
|||||||
get_argument_metadata(const ::llvm::Function &f,
|
get_argument_metadata(const ::llvm::Function &f,
|
||||||
const ::llvm::Argument &arg,
|
const ::llvm::Argument &arg,
|
||||||
const std::string &name) {
|
const std::string &name) {
|
||||||
return ::llvm::cast<::llvm::MDString>(
|
return ::llvm::cast< ::llvm::MDString>(
|
||||||
detail::get_kernel_metadata_operands(f, name)[arg.getArgNo()])
|
detail::get_kernel_metadata_operands(f, name)[arg.getArgNo()])
|
||||||
->getString();
|
->getString();
|
||||||
}
|
}
|
||||||
|
@@ -200,7 +200,7 @@ dri_sw_displaytarget_display(struct sw_winsys *ws,
|
|||||||
|
|
||||||
if (box) {
|
if (box) {
|
||||||
void *data;
|
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,
|
dri_sw_ws->lf->put_image2(dri_drawable, data,
|
||||||
box->x, box->y, box->width, box->height, dri_sw_dt->stride);
|
box->x, box->y, box->width, box->height, dri_sw_dt->stride);
|
||||||
} else {
|
} else {
|
||||||
|
@@ -701,10 +701,10 @@ void anv_CmdUpdateBuffer(
|
|||||||
struct anv_state tmp_data =
|
struct anv_state tmp_data =
|
||||||
anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, copy_size, 64);
|
anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, copy_size, 64);
|
||||||
|
|
||||||
anv_state_flush(cmd_buffer->device, tmp_data);
|
|
||||||
|
|
||||||
memcpy(tmp_data.map, pData, copy_size);
|
memcpy(tmp_data.map, pData, copy_size);
|
||||||
|
|
||||||
|
anv_state_flush(cmd_buffer->device, tmp_data);
|
||||||
|
|
||||||
int bs = 16;
|
int bs = 16;
|
||||||
bs = gcd_pow2_u64(bs, dstOffset);
|
bs = gcd_pow2_u64(bs, dstOffset);
|
||||||
bs = gcd_pow2_u64(bs, copy_size);
|
bs = gcd_pow2_u64(bs, copy_size);
|
||||||
@@ -1398,7 +1398,6 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
* still hot in the cache.
|
* still hot in the cache.
|
||||||
*/
|
*/
|
||||||
bool found_draw = false;
|
bool found_draw = false;
|
||||||
bool self_dep = false;
|
|
||||||
enum anv_subpass_usage usage = 0;
|
enum anv_subpass_usage usage = 0;
|
||||||
for (uint32_t s = subpass_idx + 1; s < pass->subpass_count; s++) {
|
for (uint32_t s = subpass_idx + 1; s < pass->subpass_count; s++) {
|
||||||
usage |= pass->attachments[att].subpass_usage[s];
|
usage |= pass->attachments[att].subpass_usage[s];
|
||||||
@@ -1408,8 +1407,6 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
* wait to resolve until then.
|
* wait to resolve until then.
|
||||||
*/
|
*/
|
||||||
found_draw = true;
|
found_draw = true;
|
||||||
if (pass->attachments[att].subpass_usage[s] & ANV_SUBPASS_USAGE_INPUT)
|
|
||||||
self_dep = true;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1468,14 +1465,6 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
* binding this surface to Sampler."
|
* binding this surface to Sampler."
|
||||||
*/
|
*/
|
||||||
resolve_op = BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL;
|
resolve_op = BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL;
|
||||||
} else if (cmd_buffer->device->info.gen == 8 && self_dep &&
|
|
||||||
att_state->input_aux_usage == ISL_AUX_USAGE_CCS_D) {
|
|
||||||
/* On Broadwell we still need to do resolves when there is a
|
|
||||||
* self-dependency because HW could not see fast-clears and works
|
|
||||||
* on the render cache as if there was regular non-fast-clear surface.
|
|
||||||
* To avoid any inconsistency, we force the resolve.
|
|
||||||
*/
|
|
||||||
resolve_op = BLORP_FAST_CLEAR_OP_RESOLVE_FULL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -291,27 +291,21 @@ color_attachment_compute_aux_usage(struct anv_device *device,
|
|||||||
att_state->input_aux_usage = ISL_AUX_USAGE_CCS_E;
|
att_state->input_aux_usage = ISL_AUX_USAGE_CCS_E;
|
||||||
} else if (att_state->fast_clear) {
|
} else if (att_state->fast_clear) {
|
||||||
att_state->aux_usage = ISL_AUX_USAGE_CCS_D;
|
att_state->aux_usage = ISL_AUX_USAGE_CCS_D;
|
||||||
if (GEN_GEN >= 9 &&
|
/* From the Sky Lake PRM, RENDER_SURFACE_STATE::AuxiliarySurfaceMode:
|
||||||
!isl_format_supports_ccs_e(&device->info, iview->isl.format)) {
|
*
|
||||||
/* From the Sky Lake PRM, RENDER_SURFACE_STATE::AuxiliarySurfaceMode:
|
* "If Number of Multisamples is MULTISAMPLECOUNT_1, AUX_CCS_D
|
||||||
*
|
* setting is only allowed if Surface Format supported for Fast
|
||||||
* "If Number of Multisamples is MULTISAMPLECOUNT_1, AUX_CCS_D
|
* Clear. In addition, if the surface is bound to the sampling
|
||||||
* setting is only allowed if Surface Format supported for Fast
|
* engine, Surface Format must be supported for Render Target
|
||||||
* Clear. In addition, if the surface is bound to the sampling
|
* Compression for surfaces bound to the sampling engine."
|
||||||
* engine, Surface Format must be supported for Render Target
|
*
|
||||||
* Compression for surfaces bound to the sampling engine."
|
* In other words, we can only sample from a fast-cleared image if it
|
||||||
*
|
* also supports color compression.
|
||||||
* In other words, we can't sample from a fast-cleared image if it
|
*/
|
||||||
* doesn't also support color compression.
|
if (isl_format_supports_ccs_e(&device->info, iview->isl.format))
|
||||||
*/
|
|
||||||
att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
|
|
||||||
} else if (GEN_GEN >= 8) {
|
|
||||||
/* Broadwell/Skylake can sample from fast-cleared images */
|
|
||||||
att_state->input_aux_usage = ISL_AUX_USAGE_CCS_D;
|
att_state->input_aux_usage = ISL_AUX_USAGE_CCS_D;
|
||||||
} else {
|
else
|
||||||
/* Ivy Bridge and Haswell cannot */
|
|
||||||
att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
|
att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
att_state->aux_usage = ISL_AUX_USAGE_NONE;
|
att_state->aux_usage = ISL_AUX_USAGE_NONE;
|
||||||
att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
|
att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
|
||||||
|
@@ -10219,7 +10219,7 @@
|
|||||||
</category>
|
</category>
|
||||||
|
|
||||||
<category name="GL_EXT_multi_draw_arrays" number="148">
|
<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="mode" type="GLenum"/>
|
||||||
<param name="first" type="const GLint *"/>
|
<param name="first" type="const GLint *"/>
|
||||||
<param name="count" type="const GLsizei *"/>
|
<param name="count" type="const GLsizei *"/>
|
||||||
|
@@ -96,6 +96,7 @@ endif
|
|||||||
|
|
||||||
AM_CPPFLAGS = $(DEFINES) $(INCLUDE_DIRS)
|
AM_CPPFLAGS = $(DEFINES) $(INCLUDE_DIRS)
|
||||||
AM_CFLAGS = \
|
AM_CFLAGS = \
|
||||||
|
$(VDPAU_CFLAGS) \
|
||||||
$(LLVM_CFLAGS) \
|
$(LLVM_CFLAGS) \
|
||||||
$(VISIBILITY_CFLAGS) \
|
$(VISIBILITY_CFLAGS) \
|
||||||
$(MSVC2013_COMPAT_CFLAGS)
|
$(MSVC2013_COMPAT_CFLAGS)
|
||||||
|
@@ -816,25 +816,10 @@ _mesa_validate_DrawRangeElements(struct gl_context *ctx, GLenum mode,
|
|||||||
"glDrawRangeElements");
|
"glDrawRangeElements");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
validate_draw_arrays(struct gl_context *ctx, const char *func,
|
need_xfb_remaining_prims_check(const struct gl_context *ctx)
|
||||||
GLenum mode, GLsizei count, GLsizei numInstances)
|
|
||||||
{
|
{
|
||||||
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
|
/* From the GLES3 specification, section 2.14.2 (Transform Feedback
|
||||||
* Primitive Capture):
|
* Primitive Capture):
|
||||||
*
|
*
|
||||||
@@ -862,10 +847,33 @@ validate_draw_arrays(struct gl_context *ctx, const char *func,
|
|||||||
* is removed and replaced with the GL behavior (primitives are not
|
* is removed and replaced with the GL behavior (primitives are not
|
||||||
* written and the corresponding counter is not updated)..."
|
* written and the corresponding counter is not updated)..."
|
||||||
*/
|
*/
|
||||||
if (_mesa_is_gles3(ctx) && _mesa_is_xfb_active_and_unpaused(ctx) &&
|
return _mesa_is_gles3(ctx) && _mesa_is_xfb_active_and_unpaused(ctx) &&
|
||||||
!_mesa_has_OES_geometry_shader(ctx) &&
|
!_mesa_has_OES_geometry_shader(ctx) &&
|
||||||
!_mesa_has_OES_tessellation_shader(ctx)) {
|
!_mesa_has_OES_tessellation_shader(ctx);
|
||||||
size_t prim_count = vbo_count_tessellated_primitives(mode, count, 1);
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
validate_draw_arrays(struct gl_context *ctx, const char *func,
|
||||||
|
GLenum mode, GLsizei count, GLsizei numInstances)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
|
||||||
|
if (need_xfb_remaining_prims_check(ctx)) {
|
||||||
|
struct gl_transform_feedback_object *xfb_obj
|
||||||
|
= ctx->TransformFeedback.CurrentObject;
|
||||||
|
size_t prim_count = vbo_count_tessellated_primitives(mode, count, numInstances);
|
||||||
if (xfb_obj->GlesRemainingPrims < prim_count) {
|
if (xfb_obj->GlesRemainingPrims < prim_count) {
|
||||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||||
"%s(exceeds transform feedback size)", func);
|
"%s(exceeds transform feedback size)", func);
|
||||||
@@ -913,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
|
GLboolean
|
||||||
_mesa_validate_DrawElementsInstanced(struct gl_context *ctx,
|
_mesa_validate_DrawElementsInstanced(struct gl_context *ctx,
|
||||||
GLenum mode, GLsizei count, GLenum type,
|
GLenum mode, GLsizei count, GLenum type,
|
||||||
|
@@ -48,6 +48,10 @@ _mesa_valid_prim_mode(struct gl_context *ctx, GLenum mode, const char *name);
|
|||||||
extern GLboolean
|
extern GLboolean
|
||||||
_mesa_validate_DrawArrays(struct gl_context *ctx, GLenum mode, GLsizei count);
|
_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
|
extern GLboolean
|
||||||
_mesa_validate_DrawElements(struct gl_context *ctx,
|
_mesa_validate_DrawElements(struct gl_context *ctx,
|
||||||
GLenum mode, GLsizei count, GLenum type,
|
GLenum mode, GLsizei count, GLenum type,
|
||||||
|
@@ -265,7 +265,7 @@ _mesa_glthread_finish(struct gl_context *ctx)
|
|||||||
* dri interface entrypoints), in which case we don't need to actually
|
* dri interface entrypoints), in which case we don't need to actually
|
||||||
* synchronize against ourself.
|
* synchronize against ourself.
|
||||||
*/
|
*/
|
||||||
if (pthread_self() == glthread->thread)
|
if (pthread_equal(pthread_self(), glthread->thread))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pthread_mutex_lock(&glthread->mutex);
|
pthread_mutex_lock(&glthread->mutex);
|
||||||
|
@@ -945,6 +945,8 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid *values,
|
|||||||
*/
|
*/
|
||||||
if (uni->type->is_sampler()) {
|
if (uni->type->is_sampler()) {
|
||||||
bool flushed = false;
|
bool flushed = false;
|
||||||
|
shProg->SamplersValidated = GL_TRUE;
|
||||||
|
|
||||||
for (int i = 0; i < MESA_SHADER_STAGES; i++) {
|
for (int i = 0; i < MESA_SHADER_STAGES; i++) {
|
||||||
struct gl_linked_shader *const sh = shProg->_LinkedShaders[i];
|
struct gl_linked_shader *const sh = shProg->_LinkedShaders[i];
|
||||||
|
|
||||||
|
@@ -67,11 +67,15 @@ void
|
|||||||
_mesa_update_shader_textures_used(struct gl_shader_program *shProg,
|
_mesa_update_shader_textures_used(struct gl_shader_program *shProg,
|
||||||
struct gl_program *prog)
|
struct gl_program *prog)
|
||||||
{
|
{
|
||||||
|
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];
|
||||||
|
|
||||||
|
assert(shader);
|
||||||
|
|
||||||
memset(prog->TexturesUsed, 0, sizeof(prog->TexturesUsed));
|
memset(prog->TexturesUsed, 0, sizeof(prog->TexturesUsed));
|
||||||
|
|
||||||
shProg->SamplersValidated = GL_TRUE;
|
|
||||||
|
|
||||||
GLbitfield mask = prog->SamplersUsed;
|
|
||||||
while (mask) {
|
while (mask) {
|
||||||
const int s = u_bit_scan(&mask);
|
const int s = u_bit_scan(&mask);
|
||||||
GLuint unit = prog->SamplerUnits[s];
|
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
|
* types pointing to the same texture image unit within a program
|
||||||
* object."
|
* object."
|
||||||
*/
|
*/
|
||||||
if (prog->TexturesUsed[unit] & ~(1 << tgt))
|
unsigned stages_mask = shProg->data->linked_stages;
|
||||||
shProg->SamplersValidated = GL_FALSE;
|
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);
|
prog->TexturesUsed[unit] |= (1 << tgt);
|
||||||
}
|
}
|
||||||
|
@@ -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 */
|
/* GL_IBM_multimode_draw_arrays */
|
||||||
void GLAPIENTRY
|
void GLAPIENTRY
|
||||||
_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first,
|
_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first,
|
||||||
|
@@ -3117,6 +3117,11 @@ _mesa_glsl_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (prog->data->LinkStatus) {
|
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)) {
|
if (!ctx->Driver.LinkShader(ctx, prog)) {
|
||||||
prog->data->LinkStatus = linking_failure;
|
prog->data->LinkStatus = linking_failure;
|
||||||
}
|
}
|
||||||
|
@@ -282,6 +282,8 @@ st_indirect_draw_vbo(struct gl_context *ctx,
|
|||||||
assert(ctx->NewState == 0x0);
|
assert(ctx->NewState == 0x0);
|
||||||
assert(stride);
|
assert(stride);
|
||||||
|
|
||||||
|
st_invalidate_readpix_cache(st);
|
||||||
|
|
||||||
/* Validate state. */
|
/* Validate state. */
|
||||||
if ((st->dirty | ctx->NewDriverState) & ST_PIPELINE_RENDER_STATE_MASK ||
|
if ((st->dirty | ctx->NewDriverState) & ST_PIPELINE_RENDER_STATE_MASK ||
|
||||||
st->gfx_shaders_may_be_dirty) {
|
st->gfx_shaders_may_be_dirty) {
|
||||||
|
@@ -404,7 +404,8 @@ vbo_bind_arrays(struct gl_context *ctx)
|
|||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
|
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 vbo_context *vbo = vbo_context(ctx);
|
||||||
struct _mesa_prim prim[2];
|
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].mode = mode;
|
||||||
prim[0].num_instances = numInstances;
|
prim[0].num_instances = numInstances;
|
||||||
prim[0].base_instance = baseInstance;
|
prim[0].base_instance = baseInstance;
|
||||||
|
prim[0].draw_id = drawID;
|
||||||
prim[0].is_indirect = 0;
|
prim[0].is_indirect = 0;
|
||||||
prim[0].start = start;
|
prim[0].start = start;
|
||||||
prim[0].count = count;
|
prim[0].count = count;
|
||||||
@@ -572,7 +574,7 @@ vbo_exec_DrawArrays(GLenum mode, GLint start, GLsizei count)
|
|||||||
if (0)
|
if (0)
|
||||||
check_draw_arrays_data(ctx, start, count);
|
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)
|
if (0)
|
||||||
print_draw_arrays(ctx, mode, start, count);
|
print_draw_arrays(ctx, mode, start, count);
|
||||||
@@ -600,7 +602,7 @@ vbo_exec_DrawArraysInstanced(GLenum mode, GLint start, GLsizei count,
|
|||||||
if (0)
|
if (0)
|
||||||
check_draw_arrays_data(ctx, start, count);
|
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)
|
if (0)
|
||||||
print_draw_arrays(ctx, mode, start, count);
|
print_draw_arrays(ctx, mode, start, count);
|
||||||
@@ -630,13 +632,52 @@ vbo_exec_DrawArraysInstancedBaseInstance(GLenum mode, GLint first,
|
|||||||
if (0)
|
if (0)
|
||||||
check_draw_arrays_data(ctx, first, count);
|
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)
|
if (0)
|
||||||
print_draw_arrays(ctx, mode, first, count);
|
print_draw_arrays(ctx, mode, first, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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]);
|
||||||
|
|
||||||
|
/* 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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map GL_ELEMENT_ARRAY_BUFFER and print contents.
|
* Map GL_ELEMENT_ARRAY_BUFFER and print contents.
|
||||||
@@ -1230,7 +1271,7 @@ vbo_draw_transform_feedback(struct gl_context *ctx, GLenum mode,
|
|||||||
!_mesa_all_varyings_in_vbos(ctx->Array.VAO))) {
|
!_mesa_all_varyings_in_vbos(ctx->Array.VAO))) {
|
||||||
GLsizei n =
|
GLsizei n =
|
||||||
ctx->Driver.GetTransformFeedbackVertexCount(ctx, obj, stream);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1641,6 +1682,7 @@ vbo_initialize_exec_dispatch(const struct gl_context *ctx,
|
|||||||
SET_DrawRangeElements(exec, vbo_exec_DrawRangeElements);
|
SET_DrawRangeElements(exec, vbo_exec_DrawRangeElements);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SET_MultiDrawArrays(exec, vbo_exec_MultiDrawArrays);
|
||||||
SET_MultiDrawElementsEXT(exec, vbo_exec_MultiDrawElements);
|
SET_MultiDrawElementsEXT(exec, vbo_exec_MultiDrawElements);
|
||||||
|
|
||||||
if (ctx->API == API_OPENGL_COMPAT) {
|
if (ctx->API == API_OPENGL_COMPAT) {
|
||||||
|
@@ -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
|
/* Could do better by copying the arrays and element list intact and
|
||||||
* then emitting an indexed prim at runtime.
|
* then emitting an indexed prim at runtime.
|
||||||
*/
|
*/
|
||||||
@@ -1484,6 +1518,7 @@ vbo_initialize_save_dispatch(const struct gl_context *ctx,
|
|||||||
struct _glapi_table *exec)
|
struct _glapi_table *exec)
|
||||||
{
|
{
|
||||||
SET_DrawArrays(exec, _save_OBE_DrawArrays);
|
SET_DrawArrays(exec, _save_OBE_DrawArrays);
|
||||||
|
SET_MultiDrawArrays(exec, _save_OBE_MultiDrawArrays);
|
||||||
SET_DrawElements(exec, _save_OBE_DrawElements);
|
SET_DrawElements(exec, _save_OBE_DrawElements);
|
||||||
SET_DrawElementsBaseVertex(exec, _save_OBE_DrawElementsBaseVertex);
|
SET_DrawElementsBaseVertex(exec, _save_OBE_DrawElementsBaseVertex);
|
||||||
SET_DrawRangeElements(exec, _save_OBE_DrawRangeElements);
|
SET_DrawRangeElements(exec, _save_OBE_DrawRangeElements);
|
||||||
|
@@ -298,9 +298,18 @@ util_queue_add_job(struct util_queue *queue,
|
|||||||
struct util_queue_job *ptr;
|
struct util_queue_job *ptr;
|
||||||
|
|
||||||
assert(fence->signalled);
|
assert(fence->signalled);
|
||||||
fence->signalled = false;
|
|
||||||
|
|
||||||
mtx_lock(&queue->lock);
|
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);
|
assert(queue->num_queued >= 0 && queue->num_queued <= queue->max_jobs);
|
||||||
|
|
||||||
/* if the queue is full, wait until there is space */
|
/* if the queue is full, wait until there is space */
|
||||||
|
Reference in New Issue
Block a user