Compare commits
41 Commits
mesa-17.0.
...
mesa-17.0.
Author | SHA1 | Date | |
---|---|---|---|
|
61b134a862 | ||
|
314bc3f048 | ||
|
b7916134a0 | ||
|
e98c9af559 | ||
|
8d7a8711d4 | ||
|
795287c66e | ||
|
375cc332bb | ||
|
ce03b2c40e | ||
|
ccdae185e8 | ||
|
7020d316c0 | ||
|
b2a9b5c5d5 | ||
|
82082aea42 | ||
|
5f3a44a736 | ||
|
2b4d42bb26 | ||
|
270898aba9 | ||
|
7c373a5990 | ||
|
a93c1e0703 | ||
|
df53e5844b | ||
|
0e3fd35eb2 | ||
|
c8f4160c40 | ||
|
313f48f030 | ||
|
de9483a6cb | ||
|
4c2356f13c | ||
|
a7c86ab750 | ||
|
5403c02983 | ||
|
7ab11a9822 | ||
|
0022df96be | ||
|
8a46da3731 | ||
|
d066714fbb | ||
|
ddf884a9e3 | ||
|
1b4afdeb17 | ||
|
88e5afd146 | ||
|
efe50f2dde | ||
|
4b3efe993e | ||
|
255d689dcd | ||
|
af58e0dbe6 | ||
|
9717c0aad5 | ||
|
f26047871f | ||
|
c09f729d93 | ||
|
a6a42a84cf | ||
|
12434966eb |
@@ -3,3 +3,48 @@ d49d275c415d60ae08dc3e52d8db11f19a44010f anv/blorp: Don't sanitize the swizzle f
|
||||
# The commit addressed an earlier commit 0567ab0407e which did not land in branch.
|
||||
# A stable specific backported patch will follow later ...
|
||||
bc5d587a80b64fb3e0a5ea8067e6317fbca2bbc5 radv: Invalidate L2 for TRANSFER_WRITE barriers
|
||||
# stable: the commit depends on earlier commit 656e30b6860 which did
|
||||
# not land in branch, and some other dependencies.
|
||||
d2d6cf6c8387ac06c8559027f57683a61b48671b anv: Add the pci_id into the shader cache UUID
|
||||
# stable: 17.1 nomination only. Fixes earlier commit 0b613c20 which
|
||||
# did not land in branch.
|
||||
d4601b0efc7f5e24e3f39fefa8e29e79560245ce freedreno: fix crash if ctx torn down with no rendering
|
||||
# stable: 17.1 nomination only. the commit depends on earlier commit
|
||||
# 7748c3f5eb1 which did not land in branch and the part that
|
||||
# could be merged is not really providing anything relevant to
|
||||
# stable.
|
||||
b81d85f1754928139f9f01474495e024946aa1b4 configure.ac: Fix typos.
|
||||
# extra: this reverts a commit in stable only because a new feature in
|
||||
# master replaces it.
|
||||
e75001811e3b66986b4ede165a0fdde703d4f05b Revert "etnaviv: Cannot render to rb-swapped formats"
|
||||
# extra: the commit depends on earlier commits which did not land in
|
||||
# branch.
|
||||
dee31311eb024a636466e359b43d3a67b0135f32 Revert "i965/fs: Don't emit SEL instructions for type-converting MOVs."
|
||||
# fixes: finds 2 commit references but it is really only one, and only
|
||||
# in master.
|
||||
2b3c490e23a6cd7f4f6bb489267c2b9b4fde5b20 radv: fix typo in a2b10g10r10 fast clear calculation
|
||||
# fixes: removes unused symbols but it doesn't really add nor fix
|
||||
# anything relevant.
|
||||
9807e9dea67a60ab8ee04741c75b748eade582ee anv: remove unused anv_dispatch_table dtable
|
||||
# fixes: removes unused symbols but it doesn't really add nor fix
|
||||
# anything relevant.
|
||||
320561bd831b81843e732d38d2b254aa3b25f2f6 radv: remove unused radv_dispatch_table dtable
|
||||
# fixes: it just makes a local function static.
|
||||
8b79f0ed0812a3a80dd91e47112fd722bd2d6978 radv: make radv_resolve_entrypoint static
|
||||
# fixes: reported only because referes to fixes in 2 commits, but they
|
||||
# are not in stable.
|
||||
3f2cb699cfe0481f214c709b5a1375caf0a9c7fe android: vulkan: add support for libmesa_vulkan_util
|
||||
# fixes: reported only because referes to fixes in 2 commits, but they
|
||||
# are not in stable.
|
||||
61c38d14b7b1d0ccacc440340ee0b1bc4454eca2 android: r600: fix libmesa_amd_common dependency
|
||||
# fixes: removes unused symbols but it doesn't really add nor fix
|
||||
# anything relevant.
|
||||
b69a03e12aa38ed5d8b60a056630ed445f6097dc i965: remove dead brw_new_shader() declaration
|
||||
# fixes: it just cleans .gitignore.
|
||||
f282ace67862c0633d0a8135e4808867740d0d39 i965: remove i965_symbols_test reference from .gitignore
|
||||
# fixes: reported only because referes to fixes in 2 commits, but they
|
||||
# are not in stable.
|
||||
15603055fb36a630cf3023219e9dd5c4a49c0596 anv: automake: ensure that the destination directory is created
|
||||
# fixes: reported only because referes to fixes in 2 commits, but they
|
||||
# are not in stable.
|
||||
a6840efc096bd26e92bcee1a50515d845988a2f9 anv: provide required gem stubs for the tests
|
||||
|
@@ -2394,7 +2394,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])
|
||||
|
@@ -31,7 +31,8 @@ because compatibility contexts are not supported.
|
||||
|
||||
<h2>SHA256 checksums</h2>
|
||||
<pre>
|
||||
TBD
|
||||
c4c34ba05d48f76b45bc05bc4b6e9242077f403d63c4f0c355c7b07786de233e mesa-17.0.4.tar.gz
|
||||
1269dc8545a193932a0779b2db5bce9be4a5f6813b98c38b93b372be8362a346 mesa-17.0.4.tar.xz
|
||||
</pre>
|
||||
|
||||
|
||||
|
143
docs/relnotes/17.0.5.html
Normal file
143
docs/relnotes/17.0.5.html
Normal file
@@ -0,0 +1,143 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<title>Mesa Release Notes</title>
|
||||
<link rel="stylesheet" type="text/css" href="../mesa.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="header">
|
||||
<h1>The Mesa 3D Graphics Library</h1>
|
||||
</div>
|
||||
|
||||
<iframe src="../contents.html"></iframe>
|
||||
<div class="content">
|
||||
|
||||
<h1>Mesa 17.0.5 Release Notes / April 28, 2017</h1>
|
||||
|
||||
<p>
|
||||
Mesa 17.0.5 is a bug fix release which fixes bugs found since the 17.0.4 release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 17.0.5 implements the OpenGL 4.5 API, but the version reported by
|
||||
glGetString(GL_VERSION) or glGetIntegerv(GL_MAJOR_VERSION) /
|
||||
glGetIntegerv(GL_MINOR_VERSION) depends on the particular driver being used.
|
||||
Some drivers don't support all the features required in OpenGL 4.5. OpenGL
|
||||
4.5 is <strong>only</strong> available if requested at context creation
|
||||
because compatibility contexts are not supported.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>SHA256 checksums</h2>
|
||||
<pre>
|
||||
TBD
|
||||
</pre>
|
||||
|
||||
|
||||
<h2>New features</h2>
|
||||
<p>None</p>
|
||||
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=97524">Bug 97524</a> - Samplers referring to the same texture unit with different types should raise GL_INVALID_OPERATION</li>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
|
||||
<p>Andres Gomez (16):</p>
|
||||
<ul>
|
||||
<li>cherry-ignore: Add the pci_id into the shader cache UUID</li>
|
||||
<li>cherry-ignore: fix crash if ctx torn down with no rendering</li>
|
||||
<li>cherry-ignore: Fix typos.</li>
|
||||
<li>cherry-ignore: Revert "etnaviv: Cannot render to rb-swapped formats"</li>
|
||||
<li>cherry-ignore: Revert "i965/fs: Don't emit SEL instructions for type-converting MOVs."</li>
|
||||
<li>cherry-ignore: fix typo in a2b10g10r10 fast clear calculation</li>
|
||||
<li>cherry-ignore: remove unused anv_dispatch_table dtable</li>
|
||||
<li>cherry-ignore: remove unused radv_dispatch_table dtable</li>
|
||||
<li>cherry-ignore: make radv_resolve_entrypoint static</li>
|
||||
<li>cherry-ignore: vulkan: add support for libmesa_vulkan_util</li>
|
||||
<li>cherry-ignore: r600: fix libmesa_amd_common dependency</li>
|
||||
<li>cherry-ignore: remove dead brw_new_shader() declaration</li>
|
||||
<li>cherry-ignore: remove i965_symbols_test reference from .gitignore</li>
|
||||
<li>cherry-ignore: automake: ensure that the destination directory is created</li>
|
||||
<li>cherry-ignore: provide required gem stubs for the tests</li>
|
||||
<li>Update version to 17.0.5</li>
|
||||
</ul>
|
||||
|
||||
<p>Boyan Ding (2):</p>
|
||||
<ul>
|
||||
<li>nvc0/ir: Properly handle a "split form" of predicate destination</li>
|
||||
<li>nir: Destination component count of shader_clock intrinsic is 2</li>
|
||||
</ul>
|
||||
|
||||
<p>Emil Velikov (5):</p>
|
||||
<ul>
|
||||
<li>docs: add sha256 checksums for 17.0.4</li>
|
||||
<li>winsys/sw/dri: don't use GNU void pointer arithmetic</li>
|
||||
<li>st/clover: add space between < and ::</li>
|
||||
<li>configure.ac: check require_basic_egl only if egl enabled</li>
|
||||
<li>st/mesa: automake: honour the vdpau header install location</li>
|
||||
</ul>
|
||||
|
||||
<p>Francisco Jerez (2):</p>
|
||||
<ul>
|
||||
<li>intel/fs: Use regs_written() in spilling cost heuristic for improved accuracy.</li>
|
||||
<li>intel/fs: Take into account amount of data read in spilling cost heuristic.</li>
|
||||
</ul>
|
||||
|
||||
<p>Grazvydas Ignotas (1):</p>
|
||||
<ul>
|
||||
<li>radv: report timestampPeriod correctly</li>
|
||||
</ul>
|
||||
|
||||
<p>Jason Ekstrand (5):</p>
|
||||
<ul>
|
||||
<li>anv/blorp: Flush the texture cache in UpdateBuffer</li>
|
||||
<li>anv/cmd_buffer: Flush the VF cache at the top of all primaries</li>
|
||||
<li>anv/cmd_buffer: Always set up a null surface state</li>
|
||||
<li>anv/cmd_buffer: Use the null surface state for ATTACHMENT_UNUSED</li>
|
||||
<li>anv/blorp: Properly handle VK_ATTACHMENT_UNUSED</li>
|
||||
</ul>
|
||||
|
||||
<p>Kenneth Graunke (1):</p>
|
||||
<ul>
|
||||
<li>i965/vec4: Avoid reswizzling MACH instructions in opt_register_coalesce().</li>
|
||||
</ul>
|
||||
|
||||
<p>Marek Olšák (1):</p>
|
||||
<ul>
|
||||
<li>st/mesa: invalidate the readpix cache in st_indirect_draw_vbo</li>
|
||||
</ul>
|
||||
|
||||
<p>Nanley Chery (1):</p>
|
||||
<ul>
|
||||
<li>anv/cmd_buffer: Disable CCS on BDW input attachments</li>
|
||||
</ul>
|
||||
|
||||
<p>Nicolai Hähnle (4):</p>
|
||||
<ul>
|
||||
<li>mesa: fix remaining xfb prims check for GLES with multiple instances</li>
|
||||
<li>mesa: extract need_xfb_remaining_prims_check</li>
|
||||
<li>mesa: move glMultiDrawArrays to vbo and fix error handling</li>
|
||||
<li>vbo: fix gl_DrawID handling in glMultiDrawArrays</li>
|
||||
</ul>
|
||||
|
||||
<p>Rob Clark (1):</p>
|
||||
<ul>
|
||||
<li>util/queue: don't hang at exit</li>
|
||||
</ul>
|
||||
|
||||
<p>Timothy Arceri (1):</p>
|
||||
<ul>
|
||||
<li>mesa: validate sampler type across the whole program</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@@ -570,7 +570,7 @@ void radv_GetPhysicalDeviceProperties(
|
||||
.storageImageSampleCounts = VK_SAMPLE_COUNT_1_BIT,
|
||||
.maxSampleMaskWords = 1,
|
||||
.timestampComputeAndGraphics = false,
|
||||
.timestampPeriod = 100000.0 / pdevice->rad_info.clock_crystal_freq,
|
||||
.timestampPeriod = 1000000.0 / pdevice->rad_info.clock_crystal_freq,
|
||||
.maxClipDistances = 8,
|
||||
.maxCullDistances = 8,
|
||||
.maxCombinedClipAndCullDistances = 8,
|
||||
|
@@ -94,7 +94,7 @@ struct radeon_info {
|
||||
uint32_t compute_rings;
|
||||
uint32_t vce_fw_version;
|
||||
uint32_t vce_harvest_config;
|
||||
uint32_t clock_crystal_freq;
|
||||
uint32_t clock_crystal_freq; /* in kHz */
|
||||
|
||||
/* Kernel info. */
|
||||
uint32_t drm_major; /* version */
|
||||
|
@@ -927,7 +927,8 @@ nir_visitor::visit(ir_call *ir)
|
||||
nir_builder_instr_insert(&b, &instr->instr);
|
||||
break;
|
||||
case nir_intrinsic_shader_clock:
|
||||
nir_ssa_dest_init(&instr->instr, &instr->dest, 1, 32, NULL);
|
||||
nir_ssa_dest_init(&instr->instr, &instr->dest, 2, 32, NULL);
|
||||
instr->num_components = 2;
|
||||
nir_builder_instr_insert(&b, &instr->instr);
|
||||
break;
|
||||
case nir_intrinsic_store_ssbo: {
|
||||
|
@@ -91,7 +91,7 @@ BARRIER(memory_barrier)
|
||||
* The latter can be used as code motion barrier, which is currently not
|
||||
* feasible with NIR.
|
||||
*/
|
||||
INTRINSIC(shader_clock, 0, ARR(0), true, 1, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE)
|
||||
INTRINSIC(shader_clock, 0, ARR(0), true, 2, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE)
|
||||
|
||||
/*
|
||||
* Memory barrier with semantics analogous to the compute shader
|
||||
|
@@ -294,9 +294,18 @@ util_queue_add_job(struct util_queue *queue,
|
||||
struct util_queue_job *ptr;
|
||||
|
||||
assert(fence->signalled);
|
||||
fence->signalled = false;
|
||||
|
||||
pipe_mutex_lock(queue->lock);
|
||||
if (queue->kill_threads) {
|
||||
pipe_mutex_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 */
|
||||
|
@@ -58,6 +58,7 @@ private:
|
||||
void setImmediateS8(const ValueRef&);
|
||||
void setSUConst16(const Instruction *, const int s);
|
||||
void setSUPred(const Instruction *, const int s);
|
||||
void setPDSTL(const Instruction *, const int d);
|
||||
|
||||
void emitCondCode(CondCode cc, int pos);
|
||||
void emitInterpMode(const Instruction *);
|
||||
@@ -373,6 +374,16 @@ void CodeEmitterNVC0::setImmediateS8(const ValueRef &ref)
|
||||
code[0] |= (s8 >> 6) << 8;
|
||||
}
|
||||
|
||||
void CodeEmitterNVC0::setPDSTL(const Instruction *i, const int d)
|
||||
{
|
||||
assert(d < 0 || (i->defExists(d) && i->def(d).getFile() == FILE_PREDICATE));
|
||||
|
||||
uint32_t pred = d >= 0 ? DDATA(i->def(d)).id : 7;
|
||||
|
||||
code[0] |= (pred & 3) << 8;
|
||||
code[1] |= (pred & 4) << (26 - 2);
|
||||
}
|
||||
|
||||
void
|
||||
CodeEmitterNVC0::emitForm_A(const Instruction *i, uint64_t opc)
|
||||
{
|
||||
@@ -1864,7 +1875,7 @@ CodeEmitterNVC0::emitSTORE(const Instruction *i)
|
||||
if (i->src(0).getFile() == FILE_MEMORY_SHARED &&
|
||||
i->subOp == NV50_IR_SUBOP_STORE_UNLOCKED) {
|
||||
assert(i->defExists(0));
|
||||
defId(i->def(0), 8);
|
||||
setPDSTL(i, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1936,7 +1947,7 @@ CodeEmitterNVC0::emitLOAD(const Instruction *i)
|
||||
|
||||
if (p >= 0) {
|
||||
if (targ->getChipset() >= NVISA_GK104_CHIPSET)
|
||||
defId(i->def(p), 8);
|
||||
setPDSTL(i, p);
|
||||
else
|
||||
defId(i->def(p), 32 + 18);
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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));
|
||||
}
|
||||
|
@@ -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
|
||||
- clang::LangAS::Offset]) {
|
||||
|
@@ -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 (...) {
|
||||
|
@@ -118,18 +118,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
|
||||
|
@@ -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();
|
||||
}
|
||||
|
@@ -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 {
|
||||
|
@@ -683,6 +683,11 @@ void anv_CmdUpdateBuffer(
|
||||
|
||||
assert(max_update_size < MAX_SURFACE_DIM * 4);
|
||||
|
||||
/* We're about to read data that was written from the CPU. Flush the
|
||||
* texture cache so we don't get anything stale.
|
||||
*/
|
||||
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT;
|
||||
|
||||
while (dataSize) {
|
||||
const uint32_t copy_size = MIN2(dataSize, max_update_size);
|
||||
|
||||
@@ -691,6 +696,9 @@ void anv_CmdUpdateBuffer(
|
||||
|
||||
memcpy(tmp_data.map, pData, copy_size);
|
||||
|
||||
if (!cmd_buffer->device->info.has_llc)
|
||||
anv_state_clflush(tmp_data);
|
||||
|
||||
int bs = 16;
|
||||
bs = gcd_pow2_u64(bs, dstOffset);
|
||||
bs = gcd_pow2_u64(bs, copy_size);
|
||||
@@ -1122,6 +1130,9 @@ anv_cmd_buffer_flush_attachments(struct anv_cmd_buffer *cmd_buffer,
|
||||
|
||||
for (uint32_t i = 0; i < subpass->color_count; ++i) {
|
||||
uint32_t att = subpass->color_attachments[i];
|
||||
if (att == VK_ATTACHMENT_UNUSED)
|
||||
continue;
|
||||
|
||||
assert(att < pass->attachment_count);
|
||||
if (attachment_needs_flush(cmd_buffer, &pass->attachments[att], stage)) {
|
||||
cmd_buffer->state.pending_pipe_bits |=
|
||||
@@ -1149,14 +1160,19 @@ subpass_needs_clear(const struct anv_cmd_buffer *cmd_buffer)
|
||||
|
||||
for (uint32_t i = 0; i < cmd_state->subpass->color_count; ++i) {
|
||||
uint32_t a = cmd_state->subpass->color_attachments[i];
|
||||
if (a == VK_ATTACHMENT_UNUSED)
|
||||
continue;
|
||||
|
||||
assert(a < cmd_state->pass->attachment_count);
|
||||
if (cmd_state->attachments[a].pending_clear_aspects) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (ds != VK_ATTACHMENT_UNUSED &&
|
||||
cmd_state->attachments[ds].pending_clear_aspects) {
|
||||
return true;
|
||||
if (ds != VK_ATTACHMENT_UNUSED) {
|
||||
assert(ds < cmd_state->pass->attachment_count);
|
||||
if (cmd_state->attachments[ds].pending_clear_aspects)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -1188,6 +1204,10 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer *cmd_buffer)
|
||||
struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
|
||||
for (uint32_t i = 0; i < cmd_state->subpass->color_count; ++i) {
|
||||
const uint32_t a = cmd_state->subpass->color_attachments[i];
|
||||
if (a == VK_ATTACHMENT_UNUSED)
|
||||
continue;
|
||||
|
||||
assert(a < cmd_state->pass->attachment_count);
|
||||
struct anv_attachment_state *att_state = &cmd_state->attachments[a];
|
||||
|
||||
if (!att_state->pending_clear_aspects)
|
||||
@@ -1246,6 +1266,7 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer *cmd_buffer)
|
||||
}
|
||||
|
||||
const uint32_t ds = cmd_state->subpass->depth_stencil_attachment;
|
||||
assert(ds == VK_ATTACHMENT_UNUSED || ds < cmd_state->pass->attachment_count);
|
||||
|
||||
if (ds != VK_ATTACHMENT_UNUSED &&
|
||||
cmd_state->attachments[ds].pending_clear_aspects) {
|
||||
@@ -1551,8 +1572,12 @@ anv_cmd_buffer_resolve_subpass(struct anv_cmd_buffer *cmd_buffer)
|
||||
blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
|
||||
|
||||
for (uint32_t i = 0; i < subpass->color_count; ++i) {
|
||||
ccs_resolve_attachment(cmd_buffer, &batch,
|
||||
subpass->color_attachments[i]);
|
||||
const uint32_t att = subpass->color_attachments[i];
|
||||
if (att == VK_ATTACHMENT_UNUSED)
|
||||
continue;
|
||||
|
||||
assert(att < cmd_buffer->state.pass->attachment_count);
|
||||
ccs_resolve_attachment(cmd_buffer, &batch, att);
|
||||
}
|
||||
|
||||
anv_cmd_buffer_flush_attachments(cmd_buffer, SUBPASS_STAGE_DRAW);
|
||||
@@ -1565,6 +1590,9 @@ anv_cmd_buffer_resolve_subpass(struct anv_cmd_buffer *cmd_buffer)
|
||||
if (dst_att == VK_ATTACHMENT_UNUSED)
|
||||
continue;
|
||||
|
||||
assert(src_att < cmd_buffer->state.pass->attachment_count);
|
||||
assert(dst_att < cmd_buffer->state.pass->attachment_count);
|
||||
|
||||
if (cmd_buffer->state.attachments[dst_att].pending_clear_aspects) {
|
||||
/* From the Vulkan 1.0 spec:
|
||||
*
|
||||
|
@@ -272,26 +272,21 @@ color_attachment_compute_aux_usage(struct anv_device *device,
|
||||
att_state->input_aux_usage = ISL_AUX_USAGE_CCS_E;
|
||||
} else if (att_state->fast_clear) {
|
||||
att_state->aux_usage = ISL_AUX_USAGE_CCS_D;
|
||||
if (GEN_GEN >= 9) {
|
||||
/* 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
|
||||
* Clear. In addition, if the surface is bound to the sampling
|
||||
* engine, Surface Format must be supported for Render Target
|
||||
* Compression for surfaces bound to the sampling engine."
|
||||
*
|
||||
* In other words, we can't sample from a fast-cleared image if it
|
||||
* doesn't also support color compression.
|
||||
*/
|
||||
att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
|
||||
} else if (GEN_GEN == 8) {
|
||||
/* Broadwell can sample from fast-cleared images */
|
||||
/* 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
|
||||
* Clear. In addition, if the surface is bound to the sampling
|
||||
* 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.
|
||||
*/
|
||||
if (isl_format_supports_lossless_compression(&device->info, iview->isl.format))
|
||||
att_state->input_aux_usage = ISL_AUX_USAGE_CCS_D;
|
||||
} else {
|
||||
/* Ivy Bridge and Haswell cannot */
|
||||
else
|
||||
att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
|
||||
}
|
||||
} else {
|
||||
att_state->aux_usage = ISL_AUX_USAGE_NONE;
|
||||
att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
|
||||
@@ -418,23 +413,15 @@ genX(cmd_buffer_setup_attachments)(struct anv_cmd_buffer *cmd_buffer,
|
||||
abort();
|
||||
}
|
||||
|
||||
bool need_null_state = false;
|
||||
unsigned num_states = 0;
|
||||
/* Reserve one for the NULL state. */
|
||||
unsigned num_states = 1;
|
||||
for (uint32_t i = 0; i < pass->attachment_count; ++i) {
|
||||
if (vk_format_is_color(pass->attachments[i].format)) {
|
||||
if (vk_format_is_color(pass->attachments[i].format))
|
||||
num_states++;
|
||||
} else {
|
||||
/* We need a null state for any depth-stencil-only subpasses.
|
||||
* Importantly, this includes depth/stencil clears so we create one
|
||||
* whenever we have depth or stencil
|
||||
*/
|
||||
need_null_state = true;
|
||||
}
|
||||
|
||||
if (need_input_attachment_state(&pass->attachments[i]))
|
||||
num_states++;
|
||||
}
|
||||
num_states += need_null_state;
|
||||
|
||||
const uint32_t ss_stride = align_u32(isl_dev->ss.size, isl_dev->ss.align);
|
||||
state->render_pass_states =
|
||||
@@ -444,11 +431,9 @@ genX(cmd_buffer_setup_attachments)(struct anv_cmd_buffer *cmd_buffer,
|
||||
struct anv_state next_state = state->render_pass_states;
|
||||
next_state.alloc_size = isl_dev->ss.size;
|
||||
|
||||
if (need_null_state) {
|
||||
state->null_surface_state = next_state;
|
||||
next_state.offset += ss_stride;
|
||||
next_state.map += ss_stride;
|
||||
}
|
||||
state->null_surface_state = next_state;
|
||||
next_state.offset += ss_stride;
|
||||
next_state.map += ss_stride;
|
||||
|
||||
for (uint32_t i = 0; i < pass->attachment_count; ++i) {
|
||||
if (vk_format_is_color(pass->attachments[i].format)) {
|
||||
@@ -470,24 +455,22 @@ genX(cmd_buffer_setup_attachments)(struct anv_cmd_buffer *cmd_buffer,
|
||||
ANV_FROM_HANDLE(anv_framebuffer, framebuffer, begin->framebuffer);
|
||||
assert(pass->attachment_count == framebuffer->attachment_count);
|
||||
|
||||
if (need_null_state) {
|
||||
struct GENX(RENDER_SURFACE_STATE) null_ss = {
|
||||
.SurfaceType = SURFTYPE_NULL,
|
||||
.SurfaceArray = framebuffer->layers > 0,
|
||||
.SurfaceFormat = ISL_FORMAT_R8G8B8A8_UNORM,
|
||||
struct GENX(RENDER_SURFACE_STATE) null_ss = {
|
||||
.SurfaceType = SURFTYPE_NULL,
|
||||
.SurfaceArray = framebuffer->layers > 0,
|
||||
.SurfaceFormat = ISL_FORMAT_R8G8B8A8_UNORM,
|
||||
#if GEN_GEN >= 8
|
||||
.TileMode = YMAJOR,
|
||||
.TileMode = YMAJOR,
|
||||
#else
|
||||
.TiledSurface = true,
|
||||
.TiledSurface = true,
|
||||
#endif
|
||||
.Width = framebuffer->width - 1,
|
||||
.Height = framebuffer->height - 1,
|
||||
.Depth = framebuffer->layers - 1,
|
||||
.RenderTargetViewExtent = framebuffer->layers - 1,
|
||||
};
|
||||
GENX(RENDER_SURFACE_STATE_pack)(NULL, state->null_surface_state.map,
|
||||
&null_ss);
|
||||
}
|
||||
.Width = framebuffer->width - 1,
|
||||
.Height = framebuffer->height - 1,
|
||||
.Depth = framebuffer->layers - 1,
|
||||
.RenderTargetViewExtent = framebuffer->layers - 1,
|
||||
};
|
||||
GENX(RENDER_SURFACE_STATE_pack)(NULL, state->null_surface_state.map,
|
||||
&null_ss);
|
||||
|
||||
for (uint32_t i = 0; i < pass->attachment_count; ++i) {
|
||||
struct anv_render_pass_attachment *att = &pass->attachments[i];
|
||||
@@ -603,6 +586,18 @@ genX(BeginCommandBuffer)(
|
||||
|
||||
genX(cmd_buffer_emit_state_base_address)(cmd_buffer);
|
||||
|
||||
/* We sometimes store vertex data in the dynamic state buffer for blorp
|
||||
* operations and our dynamic state stream may re-use data from previous
|
||||
* command buffers. In order to prevent stale cache data, we flush the VF
|
||||
* cache. We could do this on every blorp call but that's not really
|
||||
* needed as all of the data will get written by the CPU prior to the GPU
|
||||
* executing anything. The chances are fairly high that they will use
|
||||
* blorp at least once per primary command buffer so it shouldn't be
|
||||
* wasted.
|
||||
*/
|
||||
if (cmd_buffer->level == VK_COMMAND_BUFFER_LEVEL_PRIMARY)
|
||||
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_VF_CACHE_INVALIDATE_BIT;
|
||||
|
||||
if (cmd_buffer->usage_flags &
|
||||
VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
|
||||
cmd_buffer->state.pass =
|
||||
@@ -1153,7 +1148,18 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
|
||||
assert(binding->binding == 0);
|
||||
if (binding->index < subpass->color_count) {
|
||||
const unsigned att = subpass->color_attachments[binding->index];
|
||||
surface_state = cmd_buffer->state.attachments[att].color_rt_state;
|
||||
|
||||
/* From the Vulkan 1.0.46 spec:
|
||||
*
|
||||
* "If any color or depth/stencil attachments are
|
||||
* VK_ATTACHMENT_UNUSED, then no writes occur for those
|
||||
* attachments."
|
||||
*/
|
||||
if (att == VK_ATTACHMENT_UNUSED) {
|
||||
surface_state = cmd_buffer->state.null_surface_state;
|
||||
} else {
|
||||
surface_state = cmd_buffer->state.attachments[att].color_rt_state;
|
||||
}
|
||||
} else {
|
||||
surface_state = cmd_buffer->state.null_surface_state;
|
||||
}
|
||||
|
@@ -10190,7 +10190,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 *"/>
|
||||
|
@@ -96,6 +96,7 @@ endif
|
||||
|
||||
AM_CPPFLAGS = $(DEFINES) $(INCLUDE_DIRS)
|
||||
AM_CFLAGS = \
|
||||
$(VDPAU_CFLAGS) \
|
||||
$(LLVM_CFLAGS) \
|
||||
$(VISIBILITY_CFLAGS) \
|
||||
$(MSVC2013_COMPAT_CFLAGS)
|
||||
|
@@ -822,12 +822,11 @@ fs_visitor::choose_spill_reg(struct ra_graph *g)
|
||||
foreach_block_and_inst(block, fs_inst, inst, cfg) {
|
||||
for (unsigned int i = 0; i < inst->sources; i++) {
|
||||
if (inst->src[i].file == VGRF)
|
||||
spill_costs[inst->src[i].nr] += loop_scale;
|
||||
spill_costs[inst->src[i].nr] += regs_read(inst, i) * loop_scale;
|
||||
}
|
||||
|
||||
if (inst->dst.file == VGRF)
|
||||
spill_costs[inst->dst.nr] += DIV_ROUND_UP(inst->size_written, REG_SIZE)
|
||||
* loop_scale;
|
||||
spill_costs[inst->dst.nr] += regs_written(inst) * loop_scale;
|
||||
|
||||
switch (inst->opcode) {
|
||||
|
||||
|
@@ -1066,6 +1066,13 @@ vec4_instruction::can_reswizzle(const struct gen_device_info *devinfo,
|
||||
if (devinfo->gen == 6 && is_math() && swizzle != BRW_SWIZZLE_XYZW)
|
||||
return false;
|
||||
|
||||
/* We can't swizzle implicit accumulator access. We'd have to
|
||||
* reswizzle the producer of the accumulator value in addition
|
||||
* to the consumer (i.e. both MUL and MACH). Just skip this.
|
||||
*/
|
||||
if (reads_accumulator_implicitly())
|
||||
return false;
|
||||
|
||||
if (!can_do_writemask(devinfo) && dst_writemask != WRITEMASK_XYZW)
|
||||
return false;
|
||||
|
||||
|
@@ -795,25 +795,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):
|
||||
*
|
||||
@@ -841,10 +826,33 @@ 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)..."
|
||||
*/
|
||||
if (_mesa_is_gles3(ctx) && _mesa_is_xfb_active_and_unpaused(ctx) &&
|
||||
!_mesa_has_OES_geometry_shader(ctx) &&
|
||||
!_mesa_has_OES_tessellation_shader(ctx)) {
|
||||
size_t prim_count = vbo_count_tessellated_primitives(mode, count, 1);
|
||||
return _mesa_is_gles3(ctx) && _mesa_is_xfb_active_and_unpaused(ctx) &&
|
||||
!_mesa_has_OES_geometry_shader(ctx) &&
|
||||
!_mesa_has_OES_tessellation_shader(ctx);
|
||||
}
|
||||
|
||||
|
||||
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) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"%s(exceeds transform feedback size)", func);
|
||||
@@ -892,6 +900,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,
|
||||
|
@@ -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,
|
||||
|
@@ -856,6 +856,8 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
|
||||
*/
|
||||
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];
|
||||
|
||||
|
@@ -68,15 +68,14 @@ _mesa_update_shader_textures_used(struct gl_shader_program *shProg,
|
||||
struct gl_program *prog)
|
||||
{
|
||||
GLbitfield mask = prog->SamplersUsed;
|
||||
struct gl_linked_shader *shader =
|
||||
shProg->_LinkedShaders[_mesa_program_enum_to_shader_stage(prog->Target)];
|
||||
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));
|
||||
|
||||
shProg->SamplersValidated = GL_TRUE;
|
||||
|
||||
while (mask) {
|
||||
const int s = u_bit_scan(&mask);
|
||||
GLuint unit = prog->SamplerUnits[s];
|
||||
@@ -92,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);
|
||||
}
|
||||
|
@@ -1546,24 +1546,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->CurrentDispatch, (mode, first[i], count[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* GL_IBM_multimode_draw_arrays */
|
||||
void GLAPIENTRY
|
||||
_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first,
|
||||
|
@@ -3060,6 +3060,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 = GL_FALSE;
|
||||
}
|
||||
|
@@ -301,6 +301,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) {
|
||||
|
@@ -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];
|
||||
@@ -418,6 +419,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;
|
||||
|
||||
/* Implement the primitive restart index */
|
||||
@@ -614,7 +616,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);
|
||||
@@ -642,7 +644,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);
|
||||
@@ -672,13 +674,52 @@ 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);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 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.
|
||||
@@ -1272,7 +1313,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;
|
||||
}
|
||||
|
||||
@@ -1683,6 +1724,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) {
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user