Compare commits
38 Commits
mesa-11.0.
...
mesa-11.0.
Author | SHA1 | Date | |
---|---|---|---|
|
4f1e500150 | ||
|
bd46093103 | ||
|
766d11e8f0 | ||
|
5923bd6d78 | ||
|
d0cf5100b5 | ||
|
e36ca8c2bb | ||
|
901744b2ff | ||
|
c62f82980c | ||
|
151f84f2db | ||
|
7d79ad95fd | ||
|
2becc98645 | ||
|
7cca7f71da | ||
|
94b8f60146 | ||
|
94bf2e2e05 | ||
|
78612aba51 | ||
|
0878187488 | ||
|
4ae2ffbff1 | ||
|
b0578c0061 | ||
|
b3dfd67feb | ||
|
017085efaf | ||
|
9e3528a844 | ||
|
84060d35bb | ||
|
2c581d04cc | ||
|
a1ac93fc4b | ||
|
1f2b601f8b | ||
|
4ca5756766 | ||
|
7023899ab9 | ||
|
2190f218ad | ||
|
2c27775a44 | ||
|
b7b8d4982d | ||
|
0d1f600c94 | ||
|
0c9f66829c | ||
|
11dc43424d | ||
|
ec9bafda70 | ||
|
6654483bc6 | ||
|
4b1ef5e842 | ||
|
95bc059c50 | ||
|
254a07841d |
@@ -42,6 +42,7 @@ LOCAL_CFLAGS += \
|
||||
-DANDROID_VERSION=0x0$(MESA_ANDROID_MAJOR_VERSION)0$(MESA_ANDROID_MINOR_VERSION)
|
||||
|
||||
LOCAL_CFLAGS += \
|
||||
-D__STDC_LIMIT_MACROS \
|
||||
-DHAVE___BUILTIN_EXPECT \
|
||||
-DHAVE___BUILTIN_FFS \
|
||||
-DHAVE___BUILTIN_FFSLL \
|
||||
@@ -70,7 +71,7 @@ endif
|
||||
|
||||
ifeq ($(MESA_ENABLE_LLVM),true)
|
||||
LOCAL_CFLAGS += \
|
||||
-DHAVE_LLVM=0x0305 -DLLVM_VERSION_PATCH=2 \
|
||||
-DHAVE_LLVM=0x0305 -DMESA_LLVM_VERSION_PATCH=2 \
|
||||
-D__STDC_CONSTANT_MACROS \
|
||||
-D__STDC_FORMAT_MACROS \
|
||||
-D__STDC_LIMIT_MACROS
|
||||
|
@@ -14,7 +14,7 @@
|
||||
<iframe src="../contents.html"></iframe>
|
||||
<div class="content">
|
||||
|
||||
<h1>Mesa 11.0.0 Release Notes / TBD</h1>
|
||||
<h1>Mesa 11.0.0 Release Notes / September 12, 2015</h1>
|
||||
|
||||
<p>
|
||||
Mesa 11.0.0 is a new development release.
|
||||
@@ -83,13 +83,175 @@ Note: some of the new features are only available with certain drivers.
|
||||
<li>EGL 1.5 on r600, radeonsi, nv50, nvc0</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
|
||||
TBD.
|
||||
<p>This list is likely incomplete.</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=51658">Bug 51658</a> - r200 (& possibly radeon) DRI fixes for gnome shell on Mesa 8.0.3</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=65525">Bug 65525</a> - [llvmpipe] lp_scene.h:210:lp_scene_alloc: Assertion `size <= (64 * 1024)' failed.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=66346">Bug 66346</a> - shader_query.cpp:49: error: invalid conversion from 'void*' to 'GLuint'</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=73512">Bug 73512</a> - [clover] mesa.icd. should contain full path</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=73528">Bug 73528</a> - Deferred lighting in Second Life causes system hiccups and screen flickering</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=74329">Bug 74329</a> - Please expose OES_texture_float and OES_texture_half_float on the ES3 context</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=80500">Bug 80500</a> - Flickering shadows in unreleased title trace</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=82186">Bug 82186</a> - [r600g] BARTS GPU lockup with minecraft shaders</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=84225">Bug 84225</a> - Allow constant-index-expression sampler array indexing with GLSL-ES < 300</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=84677">Bug 84677</a> - Triangle disappears with glPolygonMode GL_LINE</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=85252">Bug 85252</a> - Segfault in compiler while processing ternary operator with void arguments</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89131">Bug 89131</a> - [Bisected] Graphical corruption in Weston, shows old framebuffer pieces</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90000">Bug 90000</a> - [i965 Bisected NIR] Piglit/gglean_fragprog1-z-write_test fail</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90073">Bug 90073</a> - Leaks in xcb_dri3_open_reply_fds() and get_render_node_from_id_path_tag</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90249">Bug 90249</a> - Fails to build egl_dri2 on osx</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90310">Bug 90310</a> - Fails to build gallium_dri.so at linking stage with clang because of multiple redefinitions</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90347">Bug 90347</a> - [NVE0+] Failure to insert texbar under some circumstances (causing bad colors in Terasology)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90466">Bug 90466</a> - arm: linker error ndefined reference to `nir_metadata_preserve'</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90520">Bug 90520</a> - Register spilling clobbers registers used elsewhere in the shader</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90537">Bug 90537</a> - radeonsi bo/va conflict on RADEON_GEM_VA (rscreen->ws->buffer_from_handle returns NULL)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90547">Bug 90547</a> - [BDW/BSW/SKL Bisected]Piglit/glean@vertprog1-rsq_test_2_(reciprocal_square_root_of_negative_value) fais</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90580">Bug 90580</a> - [HSW bisected] integer multiplication bug</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90600">Bug 90600</a> - IOError: [Errno 2] No such file or directory: 'gl_API.xml'</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90621">Bug 90621</a> - Mesa fail to build from git</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90629">Bug 90629</a> - [i965] SIMD16 dual_source_blend assertion `src[i].file != GRF || src[i].width == dst.width' failed</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90691">Bug 90691</a> - [BSW]Piglit/spec/nv_conditional_render/dlist fails intermittently</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90728">Bug 90728</a> - dvd playback with vlc and vdpau causes segmentation fault</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90734">Bug 90734</a> - glBufferSubData is corrupting data when buffer is > 32k</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90748">Bug 90748</a> - [BDW Bisected]dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.rg_half_float_oes fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90749">Bug 90749</a> - [BDW Bisected]dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives.lines_wide fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90751">Bug 90751</a> - [BDW Bisected]dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.stencil_index8 fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90797">Bug 90797</a> - [ALL bisected] Mesa change cause performance case manhattan fail.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90817">Bug 90817</a> - swrast fails to load with certain remote X servers</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90830">Bug 90830</a> - [bsw bisected regression] GPU hang for spec.arb_gpu_shader5.execution.sampler_array_indexing.vs-nonzero-base</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90839">Bug 90839</a> - [10.5.5/10.6 regression, bisected] PBO glDrawPixels no longer using blit fastpath</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90873">Bug 90873</a> - Kernel hang, TearFree On, Mate desktop environment</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90887">Bug 90887</a> - PhiMovesPass in register allocator broken</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90895">Bug 90895</a> - [IVB/HSW/BDW/BSW Bisected] GLB2.7 Egypt, GfxBench3.0 T-Rex & ALU and many SynMark cases performance reduced by 10-23%</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90902">Bug 90902</a> - [bsw][regression] dEQP: "Found invalid pixel values"</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90903">Bug 90903</a> - egl_dri2.c:dri2_load fails to load libglapi on osx</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90904">Bug 90904</a> - OSX: EXC_BAD_ACCESS when using translate_sse + gallium + softpipe/llvmpipe</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90905">Bug 90905</a> - mesa: Finish subdir-objects transition</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90925">Bug 90925</a> - "high fidelity": Segfault in _mesa_program_resource_find_name</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91022">Bug 91022</a> - [g45 g965 bisected] assertions generated from textureGrad cube samplers fix</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91047">Bug 91047</a> - [SNB Bisected] Messed up Fog in Super Smash Bros. Melee in Dolphin</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91056">Bug 91056</a> - The Bard's Tale (2005, native) has rendering issues</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91077">Bug 91077</a> - dri2_glx.c:1186: undefined reference to `loader_open_device'</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91099">Bug 91099</a> - [llvmpipe] piglit glsl-max-varyings >max_varying_components regression</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91101">Bug 91101</a> - [softpipe] piglit glsl-1.50@execution@geometry@max-input-components regression</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91117">Bug 91117</a> - Nimbus (running in wine) has rendering issues, objects are semi-transparent</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91124">Bug 91124</a> - Civilization V (in Wine) has rendering issues: text missing, menu bar corrupted</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91173">Bug 91173</a> - Oddworld: Stranger's Wrath HD: disfigured models in wrong colors</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91193">Bug 91193</a> - [290x] Dota2 reborn ingame rendering breaks with git-af4b9c7</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91222">Bug 91222</a> - lp_test_format regression on CentOS 7</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91226">Bug 91226</a> - Crash in glLinkProgram (NEW)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91231">Bug 91231</a> - [NV92] Psychonauts (native) segfaults on start when DRI3 enabled</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91254">Bug 91254</a> - (regresion) video using VA-API on Intel slow and freeze system with mesa 10.6 or 10.6.1</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91290">Bug 91290</a> - SIGSEGV glcpp/glcpp-parse.y:1077</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91292">Bug 91292</a> - [BDW+] glVertexAttribDivisor not working in combination with glPolygonMode</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91337">Bug 91337</a> - OSMesaGetProcAdress("OSMesaPixelStore") returns nil</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91418">Bug 91418</a> - Visual Studio 2015 vsnprintf build error</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91425">Bug 91425</a> - [regression, bisected] Piglit spec/ext_packed_float/ getteximage-invalid-format-for-packed-type fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91441">Bug 91441</a> - make check DispatchSanity_test.GL30 regression</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91444">Bug 91444</a> - regression bisected radeonsi: don't change pipe_resource in resource_copy_region</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91461">Bug 91461</a> - gl_TessLevel* writes have no effect for all but the last TCS invocation</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91513">Bug 91513</a> - [IVB/HSW/BDW/SKL Bisected] Lightsmark performance reduced by 7%-10%</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91526">Bug 91526</a> - World of Warcraft (on Wine) has UI corruption with nouveau</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91544">Bug 91544</a> - [i965, regression, bisected] regression of several tests in 93977d3a151675946c03e</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91551">Bug 91551</a> - DXTn compressed normal maps produce severe artifacts on all NV5x and NVDx chipsets</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91570">Bug 91570</a> - Upgrading mesa to 10.6 causes segfault in OpenGL applications with GeForce4 MX 440 / AGP 8X</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91591">Bug 91591</a> - rounding.h:102:2: error: #error "Unsupported or undefined LONG_BIT"</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91610">Bug 91610</a> - [BSW] GPU hang for spec.shaders.point-vertex-id gl_instanceid divisor</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91673">Bug 91673</a> - Segfault when calling glTexSubImage2D on storage texture to bound FBO</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91726">Bug 91726</a> - R600 asserts in tgsi_cmp/make_src_for_op3</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91847">Bug 91847</a> - glGenerateTextureMipmap not working (no errors) unless glActiveTexture(GL_TEXTURE1) is called before</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91857">Bug 91857</a> - Mesa 10.6.3 linker is slow</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91881">Bug 91881</a> - regression: GPU lockups since mesa-11.0.0_rc1 on RV620 (r600) driver</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91890">Bug 91890</a> - [nve7] witcher2: blurry image & DATA_ERRORs (class 0xa097 mthd 0x2380/0x238c)</li>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
|
||||
TBD.
|
||||
<li>Removed the EGL loader from the Linux SCons build.</li>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
|
@@ -38,18 +38,23 @@ libgallium_la_SOURCES += \
|
||||
|
||||
endif
|
||||
|
||||
indices/u_indices_gen.c: $(srcdir)/indices/u_indices_gen.py
|
||||
$(AM_V_at)$(MKDIR_P) indices
|
||||
$(AM_V_GEN) $(PYTHON2) $< > $@
|
||||
MKDIR_GEN = $(AM_V_at)$(MKDIR_P) $(@D)
|
||||
PYTHON_GEN = $(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS)
|
||||
|
||||
indices/u_unfilled_gen.c: $(srcdir)/indices/u_unfilled_gen.py
|
||||
$(AM_V_at)$(MKDIR_P) indices
|
||||
$(AM_V_GEN) $(PYTHON2) $< > $@
|
||||
indices/u_indices_gen.c: indices/u_indices_gen.py
|
||||
$(MKDIR_GEN)
|
||||
$(PYTHON_GEN) $(srcdir)/indices/u_indices_gen.py > $@
|
||||
|
||||
util/u_format_table.c: $(srcdir)/util/u_format_table.py $(srcdir)/util/u_format_pack.py $(srcdir)/util/u_format_parse.py $(srcdir)/util/u_format.csv
|
||||
$(AM_V_at)$(MKDIR_P) util
|
||||
$(AM_V_GEN) $(PYTHON2) $(srcdir)/util/u_format_table.py $(srcdir)/util/u_format.csv > $@
|
||||
indices/u_unfilled_gen.c: indices/u_unfilled_gen.py
|
||||
$(MKDIR_GEN)
|
||||
$(PYTHON_GEN) $(srcdir)/indices/u_unfilled_gen.py > $@
|
||||
|
||||
util/u_format_table.c: util/u_format_table.py \
|
||||
util/u_format_pack.py \
|
||||
util/u_format_parse.py \
|
||||
util/u_format.csv
|
||||
$(MKDIR_GEN)
|
||||
$(PYTHON_GEN) $(srcdir)/util/u_format_table.py $(srcdir)/util/u_format.csv > $@
|
||||
|
||||
noinst_LTLIBRARIES += libgalliumvl_stub.la
|
||||
libgalliumvl_stub_la_SOURCES = \
|
||||
|
@@ -884,7 +884,7 @@ CodeEmitterNV50::emitINTERP(const Instruction *i)
|
||||
defId(i->def(0), 2);
|
||||
srcAddr8(i->src(0), 16);
|
||||
|
||||
if (i->getInterpMode() == NV50_IR_INTERP_FLAT) {
|
||||
if (i->encSize != 8 && i->getInterpMode() == NV50_IR_INTERP_FLAT) {
|
||||
code[0] |= 1 << 8;
|
||||
} else {
|
||||
if (i->op == OP_PINTERP) {
|
||||
@@ -896,10 +896,11 @@ CodeEmitterNV50::emitINTERP(const Instruction *i)
|
||||
}
|
||||
|
||||
if (i->encSize == 8) {
|
||||
code[1] =
|
||||
(code[0] & (3 << 24)) >> (24 - 16) |
|
||||
(code[0] & (1 << 8)) << (18 - 8);
|
||||
code[0] &= ~0x03000100;
|
||||
if (i->getInterpMode() == NV50_IR_INTERP_FLAT)
|
||||
code[1] = 4 << 16;
|
||||
else
|
||||
code[1] = (code[0] & (3 << 24)) >> (24 - 16);
|
||||
code[0] &= ~0x03000000;
|
||||
code[0] |= 1;
|
||||
emitFlagsRd(i);
|
||||
}
|
||||
|
@@ -202,7 +202,10 @@ NV50LegalizePostRA::visit(Function *fn)
|
||||
Program *prog = fn->getProgram();
|
||||
|
||||
r63 = new_LValue(fn, FILE_GPR);
|
||||
r63->reg.data.id = 63;
|
||||
if (prog->maxGPR < 63)
|
||||
r63->reg.data.id = 63;
|
||||
else
|
||||
r63->reg.data.id = 127;
|
||||
|
||||
// this is actually per-program, but we can do it all on visiting main()
|
||||
std::list<Instruction *> *outWrites =
|
||||
|
@@ -2602,6 +2602,10 @@ NV50PostRaConstantFolding::visit(BasicBlock *bb)
|
||||
!isFloatType(i->dType))
|
||||
break;
|
||||
|
||||
if (i->getDef(0)->reg.data.id >= 64 ||
|
||||
i->getSrc(0)->reg.data.id >= 64)
|
||||
break;
|
||||
|
||||
def = i->getSrc(1)->getInsn();
|
||||
if (def->op == OP_MOV && def->src(0).getFile() == FILE_IMMEDIATE) {
|
||||
vtmp = i->getSrc(1);
|
||||
|
@@ -411,7 +411,7 @@ int ImmediateValue::print(char *buf, size_t size, DataType ty) const
|
||||
case TYPE_U64:
|
||||
case TYPE_S64:
|
||||
default:
|
||||
PRINT("0x%016"PRIx64, reg.data.u64);
|
||||
PRINT("0x%016" PRIx64, reg.data.u64);
|
||||
break;
|
||||
}
|
||||
return pos;
|
||||
|
@@ -25,6 +25,7 @@
|
||||
|
||||
#include <stack>
|
||||
#include <limits>
|
||||
#include <tr1/unordered_map>
|
||||
|
||||
namespace nv50_ir {
|
||||
|
||||
@@ -222,6 +223,7 @@ private:
|
||||
private:
|
||||
virtual bool visit(BasicBlock *);
|
||||
inline bool needNewElseBlock(BasicBlock *b, BasicBlock *p);
|
||||
inline void splitEdges(BasicBlock *b);
|
||||
};
|
||||
|
||||
class ArgumentMovesPass : public Pass {
|
||||
@@ -345,28 +347,55 @@ RegAlloc::PhiMovesPass::needNewElseBlock(BasicBlock *b, BasicBlock *p)
|
||||
return (n == 2);
|
||||
}
|
||||
|
||||
// For each operand of each PHI in b, generate a new value by inserting a MOV
|
||||
// at the end of the block it is coming from and replace the operand with its
|
||||
// result. This eliminates liveness conflicts and enables us to let values be
|
||||
// copied to the right register if such a conflict exists nonetheless.
|
||||
struct PhiMapHash {
|
||||
size_t operator()(const std::pair<Instruction *, BasicBlock *>& val) const {
|
||||
return std::tr1::hash<Instruction*>()(val.first) * 31 +
|
||||
std::tr1::hash<BasicBlock*>()(val.second);
|
||||
}
|
||||
};
|
||||
|
||||
typedef std::tr1::unordered_map<
|
||||
std::pair<Instruction *, BasicBlock *>, Value *, PhiMapHash> PhiMap;
|
||||
|
||||
// Critical edges need to be split up so that work can be inserted along
|
||||
// specific edge transitions. Unfortunately manipulating incident edges into a
|
||||
// BB invalidates all the PHI nodes since their sources are implicitly ordered
|
||||
// by incident edge order.
|
||||
//
|
||||
// These MOVs are also crucial in making sure the live intervals of phi srces
|
||||
// are extended until the end of the loop, since they are not included in the
|
||||
// live-in sets.
|
||||
bool
|
||||
RegAlloc::PhiMovesPass::visit(BasicBlock *bb)
|
||||
// TODO: Make it so that that is not the case, and PHI nodes store pointers to
|
||||
// the original BBs.
|
||||
void
|
||||
RegAlloc::PhiMovesPass::splitEdges(BasicBlock *bb)
|
||||
{
|
||||
Instruction *phi, *mov;
|
||||
BasicBlock *pb, *pn;
|
||||
|
||||
Instruction *phi;
|
||||
Graph::EdgeIterator ei;
|
||||
std::stack<BasicBlock *> stack;
|
||||
int j = 0;
|
||||
|
||||
for (Graph::EdgeIterator ei = bb->cfg.incident(); !ei.end(); ei.next()) {
|
||||
for (ei = bb->cfg.incident(); !ei.end(); ei.next()) {
|
||||
pb = BasicBlock::get(ei.getNode());
|
||||
assert(pb);
|
||||
if (needNewElseBlock(bb, pb))
|
||||
stack.push(pb);
|
||||
}
|
||||
|
||||
// No critical edges were found, no need to perform any work.
|
||||
if (stack.empty())
|
||||
return;
|
||||
|
||||
// We're about to, potentially, reorder the inbound edges. This means that
|
||||
// we need to hold on to the (phi, bb) -> src mapping, and fix up the phi
|
||||
// nodes after the graph has been modified.
|
||||
PhiMap phis;
|
||||
|
||||
j = 0;
|
||||
for (ei = bb->cfg.incident(); !ei.end(); ei.next(), j++) {
|
||||
pb = BasicBlock::get(ei.getNode());
|
||||
for (phi = bb->getPhi(); phi && phi->op == OP_PHI; phi = phi->next)
|
||||
phis.insert(std::make_pair(std::make_pair(phi, pb), phi->getSrc(j)));
|
||||
}
|
||||
|
||||
while (!stack.empty()) {
|
||||
pb = stack.top();
|
||||
pn = new BasicBlock(func);
|
||||
@@ -379,12 +408,47 @@ RegAlloc::PhiMovesPass::visit(BasicBlock *bb)
|
||||
assert(pb->getExit()->op != OP_CALL);
|
||||
if (pb->getExit()->asFlow()->target.bb == bb)
|
||||
pb->getExit()->asFlow()->target.bb = pn;
|
||||
|
||||
for (phi = bb->getPhi(); phi && phi->op == OP_PHI; phi = phi->next) {
|
||||
PhiMap::iterator it = phis.find(std::make_pair(phi, pb));
|
||||
assert(it != phis.end());
|
||||
phis.insert(std::make_pair(std::make_pair(phi, pn), it->second));
|
||||
phis.erase(it);
|
||||
}
|
||||
}
|
||||
|
||||
// Now go through and fix up all of the phi node sources.
|
||||
j = 0;
|
||||
for (ei = bb->cfg.incident(); !ei.end(); ei.next(), j++) {
|
||||
pb = BasicBlock::get(ei.getNode());
|
||||
for (phi = bb->getPhi(); phi && phi->op == OP_PHI; phi = phi->next) {
|
||||
PhiMap::const_iterator it = phis.find(std::make_pair(phi, pb));
|
||||
assert(it != phis.end());
|
||||
|
||||
phi->setSrc(j, it->second);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// For each operand of each PHI in b, generate a new value by inserting a MOV
|
||||
// at the end of the block it is coming from and replace the operand with its
|
||||
// result. This eliminates liveness conflicts and enables us to let values be
|
||||
// copied to the right register if such a conflict exists nonetheless.
|
||||
//
|
||||
// These MOVs are also crucial in making sure the live intervals of phi srces
|
||||
// are extended until the end of the loop, since they are not included in the
|
||||
// live-in sets.
|
||||
bool
|
||||
RegAlloc::PhiMovesPass::visit(BasicBlock *bb)
|
||||
{
|
||||
Instruction *phi, *mov;
|
||||
|
||||
splitEdges(bb);
|
||||
|
||||
// insert MOVs (phi->src(j) should stem from j-th in-BB)
|
||||
int j = 0;
|
||||
for (Graph::EdgeIterator ei = bb->cfg.incident(); !ei.end(); ei.next()) {
|
||||
pb = BasicBlock::get(ei.getNode());
|
||||
BasicBlock *pb = BasicBlock::get(ei.getNode());
|
||||
if (!pb->isTerminated())
|
||||
pb->insertTail(new_FlowInstruction(func, OP_BRA, bb));
|
||||
|
||||
|
@@ -206,8 +206,8 @@ nouveau_transfer_write(struct nouveau_context *nv, struct nouveau_transfer *tx,
|
||||
nv->copy_data(nv, buf->bo, buf->offset + base, buf->domain,
|
||||
tx->bo, tx->offset + offset, NOUVEAU_BO_GART, size);
|
||||
else
|
||||
if ((buf->base.bind & PIPE_BIND_CONSTANT_BUFFER) && nv->push_cb && can_cb)
|
||||
nv->push_cb(nv, buf->bo, buf->domain, buf->offset, buf->base.width0,
|
||||
if (nv->push_cb && can_cb)
|
||||
nv->push_cb(nv, buf,
|
||||
base, size / 4, (const uint32_t *)data);
|
||||
else
|
||||
nv->push_data(nv, buf->bo, buf->offset + base, buf->domain, size, data);
|
||||
|
@@ -41,6 +41,8 @@ struct nv04_resource {
|
||||
uint8_t status;
|
||||
uint8_t domain;
|
||||
|
||||
uint16_t cb_bindings[6]; /* per-shader per-slot bindings */
|
||||
|
||||
struct nouveau_fence *fence;
|
||||
struct nouveau_fence *fence_wr;
|
||||
|
||||
|
@@ -6,6 +6,8 @@
|
||||
|
||||
#define NOUVEAU_MAX_SCRATCH_BUFS 4
|
||||
|
||||
struct nv04_resource;
|
||||
|
||||
struct nouveau_context {
|
||||
struct pipe_context pipe;
|
||||
struct nouveau_screen *screen;
|
||||
@@ -23,8 +25,7 @@ struct nouveau_context {
|
||||
unsigned, const void *);
|
||||
/* base, size refer to the whole constant buffer */
|
||||
void (*push_cb)(struct nouveau_context *,
|
||||
struct nouveau_bo *, unsigned domain,
|
||||
unsigned base, unsigned size,
|
||||
struct nv04_resource *,
|
||||
unsigned offset, unsigned words, const uint32_t *);
|
||||
|
||||
/* @return: @ref reduced by nr of references found in context */
|
||||
|
@@ -149,14 +149,50 @@ static void
|
||||
nv30_resource_resolve(struct nv30_context *nv30,
|
||||
const struct pipe_blit_info *info)
|
||||
{
|
||||
struct nv30_miptree *src_mt = nv30_miptree(info->src.resource);
|
||||
struct nv30_rect src, dst;
|
||||
unsigned x, x0, x1, y, y1, w, h;
|
||||
|
||||
define_rect(info->src.resource, 0, info->src.box.z, info->src.box.x,
|
||||
info->src.box.y, info->src.box.width, info->src.box.height, &src);
|
||||
define_rect(info->dst.resource, 0, info->dst.box.z, info->dst.box.x,
|
||||
info->dst.box.y, info->dst.box.width, info->dst.box.height, &dst);
|
||||
|
||||
nv30_transfer_rect(nv30, BILINEAR, &src, &dst);
|
||||
x0 = src.x0;
|
||||
x1 = src.x1;
|
||||
y1 = src.y1;
|
||||
|
||||
/* On nv3x we must use sifm which is restricted to 1024x1024 tiles */
|
||||
for (y = src.y0; y < y1; y += h) {
|
||||
h = y1 - y;
|
||||
if (h > 1024)
|
||||
h = 1024;
|
||||
|
||||
src.y0 = 0;
|
||||
src.y1 = h;
|
||||
src.h = h;
|
||||
|
||||
dst.y1 = dst.y0 + (h >> src_mt->ms_y);
|
||||
dst.h = h >> src_mt->ms_y;
|
||||
|
||||
for (x = x0; x < x1; x += w) {
|
||||
w = x1 - x;
|
||||
if (w > 1024)
|
||||
w = 1024;
|
||||
|
||||
src.offset = y * src.pitch + x * src.cpp;
|
||||
src.x0 = 0;
|
||||
src.x1 = w;
|
||||
src.w = w;
|
||||
|
||||
dst.offset = (y >> src_mt->ms_y) * dst.pitch +
|
||||
(x >> src_mt->ms_x) * dst.cpp;
|
||||
dst.x1 = dst.x0 + (w >> src_mt->ms_x);
|
||||
dst.w = w >> src_mt->ms_x;
|
||||
|
||||
nv30_transfer_rect(nv30, BILINEAR, &src, &dst);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@@ -319,8 +319,9 @@ nv30_screen_is_format_supported(struct pipe_screen *pscreen,
|
||||
unsigned sample_count,
|
||||
unsigned bindings)
|
||||
{
|
||||
if (sample_count > 4)
|
||||
if (sample_count > nv30_screen(pscreen)->max_sample_count)
|
||||
return false;
|
||||
|
||||
if (!(0x00000017 & (1 << sample_count)))
|
||||
return false;
|
||||
|
||||
@@ -450,6 +451,23 @@ nv30_screen_create(struct nouveau_device *dev)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some modern apps try to use msaa without keeping in mind the
|
||||
* restrictions on videomem of older cards. Resulting in dmesg saying:
|
||||
* [ 1197.850642] nouveau E[soffice.bin[3785]] fail ttm_validate
|
||||
* [ 1197.850648] nouveau E[soffice.bin[3785]] validating bo list
|
||||
* [ 1197.850654] nouveau E[soffice.bin[3785]] validate: -12
|
||||
*
|
||||
* Because we are running out of video memory, after which the program
|
||||
* using the msaa visual freezes, and eventually the entire system freezes.
|
||||
*
|
||||
* To work around this we do not allow msaa visauls by default and allow
|
||||
* the user to override this via NV30_MAX_MSAA.
|
||||
*/
|
||||
screen->max_sample_count = debug_get_num_option("NV30_MAX_MSAA", 0);
|
||||
if (screen->max_sample_count > 4)
|
||||
screen->max_sample_count = 4;
|
||||
|
||||
pscreen = &screen->base.base;
|
||||
pscreen->destroy = nv30_screen_destroy;
|
||||
pscreen->get_param = nv30_screen_get_param;
|
||||
|
@@ -38,6 +38,8 @@ struct nv30_screen {
|
||||
/*XXX: nvfx state */
|
||||
struct nouveau_heap *vp_exec_heap;
|
||||
struct nouveau_heap *vp_data_heap;
|
||||
|
||||
unsigned max_sample_count;
|
||||
};
|
||||
|
||||
static inline struct nv30_screen *
|
||||
|
@@ -371,7 +371,7 @@ nv30_transfer_rect_blit(XFER_ARGS)
|
||||
static bool
|
||||
nv30_transfer_sifm(XFER_ARGS)
|
||||
{
|
||||
if (!src->pitch || (src->w | src->h) > 1024 || src->w < 2 || src->h < 2)
|
||||
if (!src->pitch || src->w > 1024 || src->h > 1024 || src->w < 2 || src->h < 2)
|
||||
return false;
|
||||
|
||||
if (src->d > 1 || dst->d > 1)
|
||||
@@ -381,7 +381,7 @@ nv30_transfer_sifm(XFER_ARGS)
|
||||
return false;
|
||||
|
||||
if (!dst->pitch) {
|
||||
if ((dst->w | dst->h) > 2048 || dst->w < 2 || dst->h < 2)
|
||||
if (dst->w > 2048 || dst->h > 2048 || dst->w < 2 || dst->h < 2)
|
||||
return false;
|
||||
} else {
|
||||
if (dst->domain != NOUVEAU_BO_VRAM)
|
||||
|
@@ -203,8 +203,10 @@ const struct nv50_format nv50_format_table[PIPE_FORMAT_COUNT] =
|
||||
F3B(B5G6R5_UNORM, B5G6R5_UNORM, C2, C1, C0, xx, UNORM, 5_6_5, TD),
|
||||
C4B(B5G5R5A1_UNORM, BGR5_A1_UNORM, C2, C1, C0, C3, UNORM, 5_5_5_1, TD),
|
||||
F3B(B5G5R5X1_UNORM, BGR5_X1_UNORM, C2, C1, C0, xx, UNORM, 5_5_5_1, TD),
|
||||
#if NOUVEAU_DRIVER != 0xc0
|
||||
C4B(B4G4R4A4_UNORM, NONE, C2, C1, C0, C3, UNORM, 4_4_4_4, T),
|
||||
F3B(B4G4R4X4_UNORM, NONE, C2, C1, C0, xx, UNORM, 4_4_4_4, T),
|
||||
#endif
|
||||
F3B(R9G9B9E5_FLOAT, NONE, C0, C1, C2, xx, FLOAT, 9_9_9_E5, T),
|
||||
|
||||
C4A(R10G10B10A2_UNORM, RGB10_A2_UNORM, C0, C1, C2, C3, UNORM, 10_10_10_2,
|
||||
|
@@ -299,10 +299,10 @@ nve4_p2mf_push_linear(struct nouveau_context *nv,
|
||||
struct nouveau_bo *dst, unsigned offset, unsigned domain,
|
||||
unsigned size, const void *data);
|
||||
void
|
||||
nvc0_cb_push(struct nouveau_context *,
|
||||
struct nouveau_bo *bo, unsigned domain,
|
||||
unsigned base, unsigned size,
|
||||
unsigned offset, unsigned words, const uint32_t *data);
|
||||
nvc0_cb_bo_push(struct nouveau_context *,
|
||||
struct nouveau_bo *bo, unsigned domain,
|
||||
unsigned base, unsigned size,
|
||||
unsigned offset, unsigned words, const uint32_t *data);
|
||||
|
||||
/* nvc0_vbo.c */
|
||||
void nvc0_draw_vbo(struct pipe_context *, const struct pipe_draw_info *);
|
||||
|
@@ -449,7 +449,7 @@ nvc0_fp_gen_header(struct nvc0_program *fp, struct nv50_ir_prog_info *info)
|
||||
|
||||
for (i = 0; i < info->numOutputs; ++i) {
|
||||
if (info->out[i].sn == TGSI_SEMANTIC_COLOR)
|
||||
fp->hdr[18] |= info->out[i].mask << info->out[i].slot[0];
|
||||
fp->hdr[18] |= 0xf << info->out[i].slot[0];
|
||||
}
|
||||
|
||||
fp->fp.early_z = info->prop.fp.earlyFragTests;
|
||||
|
@@ -831,6 +831,8 @@ nvc0_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
|
||||
}
|
||||
nvc0->constbuf_dirty[s] |= 1 << i;
|
||||
|
||||
if (nvc0->constbuf[s][i].u.buf)
|
||||
nv04_resource(nvc0->constbuf[s][i].u.buf)->cb_bindings[s] &= ~(1 << i);
|
||||
pipe_resource_reference(&nvc0->constbuf[s][i].u.buf, res);
|
||||
|
||||
nvc0->constbuf[s][i].user = (cb && cb->user_buffer) ? true : false;
|
||||
|
@@ -440,7 +440,7 @@ nvc0_constbufs_validate(struct nvc0_context *nvc0)
|
||||
BEGIN_NVC0(push, NVC0_3D(CB_BIND(s)), 1);
|
||||
PUSH_DATA (push, (0 << 4) | 1);
|
||||
}
|
||||
nvc0_cb_push(&nvc0->base, bo, NV_VRAM_DOMAIN(&nvc0->screen->base),
|
||||
nvc0_cb_bo_push(&nvc0->base, bo, NV_VRAM_DOMAIN(&nvc0->screen->base),
|
||||
base, nvc0->state.uniform_buffer_bound[s],
|
||||
0, (size + 3) / 4,
|
||||
nvc0->constbuf[s][0].u.data);
|
||||
@@ -458,6 +458,7 @@ nvc0_constbufs_validate(struct nvc0_context *nvc0)
|
||||
BCTX_REFN(nvc0->bufctx_3d, CB(s, i), res, RD);
|
||||
|
||||
nvc0->cb_dirty = 1; /* Force cache flush for UBO. */
|
||||
res->cb_bindings[s] |= 1 << i;
|
||||
} else {
|
||||
BEGIN_NVC0(push, NVC0_3D(CB_BIND(s)), 1);
|
||||
PUSH_DATA (push, (i << 4) | 0);
|
||||
|
@@ -506,11 +506,48 @@ nvc0_miptree_transfer_unmap(struct pipe_context *pctx,
|
||||
}
|
||||
|
||||
/* This happens rather often with DTD9/st. */
|
||||
void
|
||||
static void
|
||||
nvc0_cb_push(struct nouveau_context *nv,
|
||||
struct nouveau_bo *bo, unsigned domain,
|
||||
unsigned base, unsigned size,
|
||||
struct nv04_resource *res,
|
||||
unsigned offset, unsigned words, const uint32_t *data)
|
||||
{
|
||||
struct nvc0_context *nvc0 = nvc0_context(&nv->pipe);
|
||||
struct nvc0_constbuf *cb = NULL;
|
||||
int s;
|
||||
|
||||
/* Go through all the constbuf binding points of this buffer and try to
|
||||
* find one which contains the region to be updated.
|
||||
*/
|
||||
for (s = 0; s < 6 && !cb; s++) {
|
||||
uint16_t bindings = res->cb_bindings[s];
|
||||
while (bindings) {
|
||||
int i = ffs(bindings) - 1;
|
||||
uint32_t cb_offset = nvc0->constbuf[s][i].offset;
|
||||
|
||||
bindings &= ~(1 << i);
|
||||
if (cb_offset <= offset &&
|
||||
cb_offset + nvc0->constbuf[s][i].size >= offset + words * 4) {
|
||||
cb = &nvc0->constbuf[s][i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (cb) {
|
||||
nvc0_cb_bo_push(nv, res->bo, res->domain,
|
||||
res->offset + cb->offset, cb->size,
|
||||
offset - cb->offset, words, data);
|
||||
} else {
|
||||
nv->push_data(nv, res->bo, res->offset + offset, res->domain,
|
||||
words * 4, data);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nvc0_cb_bo_push(struct nouveau_context *nv,
|
||||
struct nouveau_bo *bo, unsigned domain,
|
||||
unsigned base, unsigned size,
|
||||
unsigned offset, unsigned words, const uint32_t *data)
|
||||
{
|
||||
struct nouveau_pushbuf *push = nv->pushbuf;
|
||||
|
||||
@@ -520,6 +557,9 @@ nvc0_cb_push(struct nouveau_context *nv,
|
||||
assert(!(offset & 3));
|
||||
size = align(size, 0x100);
|
||||
|
||||
assert(offset < size);
|
||||
assert(offset + words * 4 <= size);
|
||||
|
||||
BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3);
|
||||
PUSH_DATA (push, size);
|
||||
PUSH_DATAh(push, bo->offset + base);
|
||||
|
@@ -1853,7 +1853,7 @@ static void evergreen_emit_vertex_buffers(struct r600_context *rctx,
|
||||
radeon_emit(cs, PKT3(PKT3_SET_RESOURCE, 8, 0) | pkt_flags);
|
||||
radeon_emit(cs, (resource_offset + buffer_index) * 8);
|
||||
radeon_emit(cs, va); /* RESOURCEi_WORD0 */
|
||||
radeon_emit(cs, rbuffer->buf->size - vb->buffer_offset - 1); /* RESOURCEi_WORD1 */
|
||||
radeon_emit(cs, rbuffer->b.b.width0 - vb->buffer_offset - 1); /* RESOURCEi_WORD1 */
|
||||
radeon_emit(cs, /* RESOURCEi_WORD2 */
|
||||
S_030008_ENDIAN_SWAP(r600_endian_swap(32)) |
|
||||
S_030008_STRIDE(vb->stride) |
|
||||
@@ -1923,7 +1923,7 @@ static void evergreen_emit_constant_buffers(struct r600_context *rctx,
|
||||
radeon_emit(cs, PKT3(PKT3_SET_RESOURCE, 8, 0) | pkt_flags);
|
||||
radeon_emit(cs, (buffer_id_base + buffer_index) * 8);
|
||||
radeon_emit(cs, va); /* RESOURCEi_WORD0 */
|
||||
radeon_emit(cs, rbuffer->buf->size - cb->buffer_offset - 1); /* RESOURCEi_WORD1 */
|
||||
radeon_emit(cs, rbuffer->b.b.width0 - cb->buffer_offset - 1); /* RESOURCEi_WORD1 */
|
||||
radeon_emit(cs, /* RESOURCEi_WORD2 */
|
||||
S_030008_ENDIAN_SWAP(gs_ring_buffer ? ENDIAN_NONE : r600_endian_swap(32)) |
|
||||
S_030008_STRIDE(gs_ring_buffer ? 4 : 16) |
|
||||
|
@@ -141,7 +141,7 @@ int r600_pipe_shader_create(struct pipe_context *ctx,
|
||||
bool dump = r600_can_dump_shader(&rctx->screen->b, sel->tokens);
|
||||
unsigned use_sb = !(rctx->screen->b.debug_flags & DBG_NO_SB);
|
||||
unsigned sb_disasm = use_sb || (rctx->screen->b.debug_flags & DBG_SB_DISASM);
|
||||
unsigned export_shader = key.vs.as_es;
|
||||
unsigned export_shader;
|
||||
|
||||
shader->shader.bc.isa = rctx->isa;
|
||||
|
||||
@@ -220,6 +220,7 @@ int r600_pipe_shader_create(struct pipe_context *ctx,
|
||||
}
|
||||
break;
|
||||
case TGSI_PROCESSOR_VERTEX:
|
||||
export_shader = key.vs.as_es;
|
||||
if (rctx->b.chip_class >= EVERGREEN) {
|
||||
if (export_shader)
|
||||
evergreen_update_es_state(ctx, shader);
|
||||
@@ -1830,8 +1831,6 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
|
||||
ctx.shader = shader;
|
||||
ctx.native_integers = true;
|
||||
|
||||
shader->vs_as_gs_a = key.vs.as_gs_a;
|
||||
shader->vs_as_es = key.vs.as_es;
|
||||
|
||||
r600_bytecode_init(ctx.bc, rscreen->b.chip_class, rscreen->b.family,
|
||||
rscreen->has_compressed_msaa_texturing);
|
||||
@@ -1844,9 +1843,14 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
|
||||
shader->processor_type = ctx.type;
|
||||
ctx.bc->type = shader->processor_type;
|
||||
|
||||
ring_outputs = key.vs.as_es || (ctx.type == TGSI_PROCESSOR_GEOMETRY);
|
||||
if (ctx.type == TGSI_PROCESSOR_VERTEX) {
|
||||
shader->vs_as_gs_a = key.vs.as_gs_a;
|
||||
shader->vs_as_es = key.vs.as_es;
|
||||
}
|
||||
|
||||
if (key.vs.as_es) {
|
||||
ring_outputs = shader->vs_as_es || ctx.type == TGSI_PROCESSOR_GEOMETRY;
|
||||
|
||||
if (shader->vs_as_es) {
|
||||
ctx.gs_for_vs = &rctx->gs_shader->current->shader;
|
||||
} else {
|
||||
ctx.gs_for_vs = NULL;
|
||||
@@ -1866,7 +1870,8 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
|
||||
shader->nr_ps_color_exports = 0;
|
||||
shader->nr_ps_max_color_exports = 0;
|
||||
|
||||
shader->two_side = key.ps.color_two_side;
|
||||
if (ctx.type == TGSI_PROCESSOR_FRAGMENT)
|
||||
shader->two_side = key.ps.color_two_side;
|
||||
|
||||
/* register allocations */
|
||||
/* Values [0,127] correspond to GPR[0..127].
|
||||
@@ -2270,7 +2275,7 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
|
||||
convert_edgeflag_to_int(&ctx);
|
||||
|
||||
if (ring_outputs) {
|
||||
if (key.vs.as_es)
|
||||
if (shader->vs_as_es)
|
||||
emit_gs_ring_writes(&ctx, FALSE);
|
||||
} else {
|
||||
/* Export output */
|
||||
|
@@ -1007,7 +1007,7 @@ static void r600_init_color_surface(struct r600_context *rctx,
|
||||
|
||||
/* CMASK. */
|
||||
if (!rctx->dummy_cmask ||
|
||||
rctx->dummy_cmask->buf->size < cmask.size ||
|
||||
rctx->dummy_cmask->b.b.width0 < cmask.size ||
|
||||
rctx->dummy_cmask->buf->alignment % cmask.alignment != 0) {
|
||||
struct pipe_transfer *transfer;
|
||||
void *ptr;
|
||||
@@ -1025,7 +1025,7 @@ static void r600_init_color_surface(struct r600_context *rctx,
|
||||
|
||||
/* FMASK. */
|
||||
if (!rctx->dummy_fmask ||
|
||||
rctx->dummy_fmask->buf->size < fmask.size ||
|
||||
rctx->dummy_fmask->b.b.width0 < fmask.size ||
|
||||
rctx->dummy_fmask->buf->alignment % fmask.alignment != 0) {
|
||||
pipe_resource_reference((struct pipe_resource**)&rctx->dummy_fmask, NULL);
|
||||
rctx->dummy_fmask = r600_buffer_create_helper(rscreen, fmask.size, fmask.alignment);
|
||||
@@ -1694,7 +1694,7 @@ static void r600_emit_vertex_buffers(struct r600_context *rctx, struct r600_atom
|
||||
radeon_emit(cs, PKT3(PKT3_SET_RESOURCE, 7, 0));
|
||||
radeon_emit(cs, (320 + buffer_index) * 7);
|
||||
radeon_emit(cs, offset); /* RESOURCEi_WORD0 */
|
||||
radeon_emit(cs, rbuffer->buf->size - offset - 1); /* RESOURCEi_WORD1 */
|
||||
radeon_emit(cs, rbuffer->b.b.width0 - offset - 1); /* RESOURCEi_WORD1 */
|
||||
radeon_emit(cs, /* RESOURCEi_WORD2 */
|
||||
S_038008_ENDIAN_SWAP(r600_endian_swap(32)) |
|
||||
S_038008_STRIDE(vb->stride));
|
||||
@@ -1743,7 +1743,7 @@ static void r600_emit_constant_buffers(struct r600_context *rctx,
|
||||
radeon_emit(cs, PKT3(PKT3_SET_RESOURCE, 7, 0));
|
||||
radeon_emit(cs, (buffer_id_base + buffer_index) * 7);
|
||||
radeon_emit(cs, offset); /* RESOURCEi_WORD0 */
|
||||
radeon_emit(cs, rbuffer->buf->size - offset - 1); /* RESOURCEi_WORD1 */
|
||||
radeon_emit(cs, rbuffer->b.b.width0 - offset - 1); /* RESOURCEi_WORD1 */
|
||||
radeon_emit(cs, /* RESOURCEi_WORD2 */
|
||||
S_038008_ENDIAN_SWAP(gs_ring_buffer ? ENDIAN_NONE : r600_endian_swap(32)) |
|
||||
S_038008_STRIDE(gs_ring_buffer ? 4 : 16));
|
||||
|
@@ -195,9 +195,7 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen, void *
|
||||
r600_target = radeon_llvm_get_r600_target(triple);
|
||||
sctx->tm = LLVMCreateTargetMachine(r600_target, triple,
|
||||
r600_get_llvm_processor_name(sscreen->b.family),
|
||||
sctx->b.chip_class >= VI ?
|
||||
"+DumpCode" :
|
||||
"+DumpCode,+vgpr-spilling",
|
||||
"+DumpCode,+vgpr-spilling",
|
||||
LLVMCodeGenLevelDefault,
|
||||
LLVMRelocDefault,
|
||||
LLVMCodeModelDefault);
|
||||
|
@@ -465,7 +465,7 @@ namespace {
|
||||
const bool is_write_only = access_qual == "write_only";
|
||||
const bool is_read_only = access_qual == "read_only";
|
||||
|
||||
typename module::argument::type marg_type;
|
||||
enum module::argument::type marg_type;
|
||||
if (is_image2d && is_read_only) {
|
||||
marg_type = module::argument::image2d_rd;
|
||||
} else if (is_image2d && is_write_only) {
|
||||
|
@@ -110,7 +110,7 @@ static boolean do_winsys_init(struct amdgpu_winsys *ws)
|
||||
struct amdgpu_heap_info vram, gtt;
|
||||
struct drm_amdgpu_info_hw_ip dma = {}, uvd = {}, vce = {};
|
||||
uint32_t vce_version = 0, vce_feature = 0;
|
||||
int r;
|
||||
int r, i, j;
|
||||
|
||||
/* Query hardware and driver information. */
|
||||
r = amdgpu_query_gpu_info(ws->dev, &ws->amdinfo);
|
||||
@@ -248,7 +248,6 @@ static boolean do_winsys_init(struct amdgpu_winsys *ws)
|
||||
ws->info.vram_size = vram.heap_size;
|
||||
/* convert the shader clock from KHz to MHz */
|
||||
ws->info.max_sclk = ws->amdinfo.max_engine_clk / 1000;
|
||||
ws->info.max_compute_units = 1; /* TODO */
|
||||
ws->info.max_se = ws->amdinfo.num_shader_engines;
|
||||
ws->info.max_sh_per_se = ws->amdinfo.num_shader_arrays_per_engine;
|
||||
ws->info.has_uvd = uvd.available_rings != 0;
|
||||
@@ -263,6 +262,18 @@ static boolean do_winsys_init(struct amdgpu_winsys *ws)
|
||||
ws->info.r600_virtual_address = TRUE;
|
||||
ws->info.r600_has_dma = dma.available_rings != 0;
|
||||
|
||||
/* Guess what the maximum compute unit number is by looking at the mask
|
||||
* of enabled CUs.
|
||||
*/
|
||||
for (i = 0; i < ws->info.max_se; i++)
|
||||
for (j = 0; j < ws->info.max_sh_per_se; j++) {
|
||||
unsigned max = util_last_bit(ws->amdinfo.cu_bitmap[i][j]);
|
||||
|
||||
if (ws->info.max_compute_units < max)
|
||||
ws->info.max_compute_units = max;
|
||||
}
|
||||
ws->info.max_compute_units *= ws->info.max_se * ws->info.max_sh_per_se;
|
||||
|
||||
memcpy(ws->info.si_tile_mode_array, ws->amdinfo.gb_tile_mode,
|
||||
sizeof(ws->amdinfo.gb_tile_mode));
|
||||
ws->info.si_tile_mode_array_valid = TRUE;
|
||||
|
@@ -29,18 +29,7 @@ endif
|
||||
|
||||
intermediates := $(call local-generated-sources-dir)
|
||||
|
||||
sources := \
|
||||
glsl_lexer.cpp \
|
||||
glsl_parser.cpp \
|
||||
glcpp/glcpp-lex.c \
|
||||
glcpp/glcpp-parse.c \
|
||||
nir/nir_builder_opcodes.h \
|
||||
nir/nir_constant_expressions.c \
|
||||
nir/nir_opcodes.c \
|
||||
nir/nir_opcodes.h \
|
||||
nir/nir_opt_algebraic.c
|
||||
|
||||
LOCAL_SRC_FILES := $(filter-out $(sources), $(LOCAL_SRC_FILES))
|
||||
LOCAL_SRC_FILES := $(LOCAL_SRC_FILES)
|
||||
|
||||
LOCAL_C_INCLUDES += \
|
||||
$(intermediates)/glcpp \
|
||||
@@ -51,8 +40,10 @@ LOCAL_C_INCLUDES += \
|
||||
LOCAL_EXPORT_C_INCLUDE_DIRS += \
|
||||
$(intermediates)/nir
|
||||
|
||||
sources := $(addprefix $(intermediates)/, $(sources))
|
||||
LOCAL_GENERATED_SOURCES += $(sources)
|
||||
LOCAL_GENERATED_SOURCES += $(addprefix $(intermediates)/, \
|
||||
$(LIBGLCPP_GENERATED_FILES) \
|
||||
$(NIR_GENERATED_FILES) \
|
||||
$(LIBGLSL_GENERATED_CXX_FILES))
|
||||
|
||||
define local-l-or-ll-to-c-or-cpp
|
||||
@mkdir -p $(dir $@)
|
||||
@@ -102,8 +93,7 @@ $(intermediates)/nir/nir_builder_opcodes.h: $(nir_builder_opcodes_deps)
|
||||
nir_constant_expressions_gen := $(LOCAL_PATH)/nir/nir_constant_expressions.py
|
||||
nir_constant_expressions_deps := \
|
||||
$(LOCAL_PATH)/nir/nir_opcodes.py \
|
||||
$(LOCAL_PATH)/nir/nir_constant_expressions.py \
|
||||
$(LOCAL_PATH)/nir/nir_constant_expressions.h
|
||||
$(LOCAL_PATH)/nir/nir_constant_expressions.py
|
||||
|
||||
$(intermediates)/nir/nir_constant_expressions.c: $(nir_constant_expressions_deps)
|
||||
@mkdir -p $(dir $@)
|
||||
|
@@ -140,13 +140,16 @@ libglsl_la_SOURCES = \
|
||||
glsl_parser.cpp \
|
||||
glsl_parser.h \
|
||||
$(LIBGLSL_FILES) \
|
||||
$(NIR_FILES)
|
||||
$(NIR_FILES) \
|
||||
$(NIR_GENERATED_FILES)
|
||||
|
||||
|
||||
libnir_la_SOURCES = \
|
||||
glsl_types.cpp \
|
||||
builtin_types.cpp \
|
||||
glsl_symbol_table.cpp \
|
||||
$(NIR_FILES)
|
||||
$(NIR_FILES) \
|
||||
$(NIR_GENERATED_FILES)
|
||||
|
||||
glsl_compiler_SOURCES = \
|
||||
$(GLSL_COMPILER_CXX_FILES)
|
||||
@@ -197,19 +200,23 @@ am__v_YACC_ = $(am__v_YACC_$(AM_DEFAULT_VERBOSITY))
|
||||
am__v_YACC_0 = @echo " YACC " $@;
|
||||
am__v_YACC_1 =
|
||||
|
||||
MKDIR_GEN = $(AM_V_at)$(MKDIR_P) $(@D)
|
||||
YACC_GEN = $(AM_V_YACC)$(YACC) $(YFLAGS)
|
||||
LEX_GEN = $(AM_V_LEX)$(LEX) $(LFLAGS)
|
||||
|
||||
glsl_parser.cpp glsl_parser.h: glsl_parser.yy
|
||||
$(AM_V_YACC) $(YACC) $(YFLAGS) -o $@ -p "_mesa_glsl_" --defines=$(builddir)/glsl_parser.h $<
|
||||
$(YACC_GEN) -o $@ -p "_mesa_glsl_" --defines=$(builddir)/glsl_parser.h $(srcdir)/glsl_parser.yy
|
||||
|
||||
glsl_lexer.cpp: glsl_lexer.ll
|
||||
$(AM_V_LEX) $(LEX) $(LFLAGS) -o $@ $<
|
||||
$(LEX_GEN) -o $@ $(srcdir)/glsl_lexer.ll
|
||||
|
||||
glcpp/glcpp-parse.c glcpp/glcpp-parse.h: glcpp/glcpp-parse.y
|
||||
$(AM_V_at)$(MKDIR_P) glcpp
|
||||
$(AM_V_YACC) $(YACC) $(YFLAGS) -o $@ -p "glcpp_parser_" --defines=$(builddir)/glcpp/glcpp-parse.h $<
|
||||
$(MKDIR_GEN)
|
||||
$(YACC_GEN) -o $@ -p "glcpp_parser_" --defines=$(builddir)/glcpp/glcpp-parse.h $(srcdir)/glcpp/glcpp-parse.y
|
||||
|
||||
glcpp/glcpp-lex.c: glcpp/glcpp-lex.l
|
||||
$(AM_V_at)$(MKDIR_P) glcpp
|
||||
$(AM_V_LEX) $(LEX) $(LFLAGS) -o $@ $<
|
||||
$(MKDIR_GEN)
|
||||
$(LEX_GEN) -o $@ $(srcdir)/glcpp/glcpp-lex.l
|
||||
|
||||
# Only the parsers (specifically the header files generated at the same time)
|
||||
# need to be in BUILT_SOURCES. Though if we list the parser headers YACC is
|
||||
@@ -222,11 +229,7 @@ BUILT_SOURCES = \
|
||||
glsl_lexer.cpp \
|
||||
glcpp/glcpp-parse.c \
|
||||
glcpp/glcpp-lex.c \
|
||||
nir/nir_builder_opcodes.h \
|
||||
nir/nir_constant_expressions.c \
|
||||
nir/nir_opcodes.c \
|
||||
nir/nir_opcodes.h \
|
||||
nir/nir_opt_algebraic.c
|
||||
$(NIR_GENERATED_FILES)
|
||||
CLEANFILES = \
|
||||
glcpp/glcpp-parse.h \
|
||||
glsl_parser.h \
|
||||
@@ -239,22 +242,24 @@ dist-hook:
|
||||
$(RM) glcpp/tests/*.out
|
||||
$(RM) glcpp/tests/subtest*/*.out
|
||||
|
||||
nir/nir_builder_opcodes.h: nir/nir_opcodes.py nir/nir_builder_opcodes_h.py
|
||||
$(AM_V_at)$(MKDIR_P) nir
|
||||
$(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS) $(srcdir)/nir/nir_builder_opcodes_h.py > $@
|
||||
PYTHON_GEN = $(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS)
|
||||
|
||||
nir/nir_constant_expressions.c: nir/nir_opcodes.py nir/nir_constant_expressions.py nir/nir_constant_expressions.h
|
||||
$(AM_V_at)$(MKDIR_P) nir
|
||||
$(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS) $(srcdir)/nir/nir_constant_expressions.py > $@
|
||||
nir/nir_builder_opcodes.h: nir/nir_opcodes.py nir/nir_builder_opcodes_h.py
|
||||
$(MKDIR_GEN)
|
||||
$(PYTHON_GEN) $(srcdir)/nir/nir_builder_opcodes_h.py > $@
|
||||
|
||||
nir/nir_constant_expressions.c: nir/nir_opcodes.py nir/nir_constant_expressions.py
|
||||
$(MKDIR_GEN)
|
||||
$(PYTHON_GEN) $(srcdir)/nir/nir_constant_expressions.py > $@
|
||||
|
||||
nir/nir_opcodes.h: nir/nir_opcodes.py nir/nir_opcodes_h.py
|
||||
$(AM_V_at)$(MKDIR_P) nir
|
||||
$(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS) $(srcdir)/nir/nir_opcodes_h.py > $@
|
||||
$(MKDIR_GEN)
|
||||
$(PYTHON_GEN) $(srcdir)/nir/nir_opcodes_h.py > $@
|
||||
|
||||
nir/nir_opcodes.c: nir/nir_opcodes.py nir/nir_opcodes_c.py
|
||||
$(AM_V_at)$(MKDIR_P) nir
|
||||
$(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS) $(srcdir)/nir/nir_opcodes_c.py > $@
|
||||
$(MKDIR_GEN)
|
||||
$(PYTHON_GEN) $(srcdir)/nir/nir_opcodes_c.py > $@
|
||||
|
||||
nir/nir_opt_algebraic.c: nir/nir_opt_algebraic.py nir/nir_algebraic.py
|
||||
$(AM_V_at)$(MKDIR_P) nir
|
||||
$(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS) $(srcdir)/nir/nir_opt_algebraic.py > $@
|
||||
$(MKDIR_GEN)
|
||||
$(PYTHON_GEN) $(srcdir)/nir/nir_opt_algebraic.py > $@
|
||||
|
@@ -69,8 +69,7 @@ NIR_FILES = \
|
||||
nir/nir_vla.h \
|
||||
nir/nir_worklist.c \
|
||||
nir/nir_worklist.h \
|
||||
nir/nir_types.cpp \
|
||||
$(NIR_GENERATED_FILES)
|
||||
nir/nir_types.cpp
|
||||
|
||||
# libglsl
|
||||
|
||||
|
@@ -40,6 +40,7 @@
|
||||
#include "ir_basic_block.h"
|
||||
#include "ir_optimization.h"
|
||||
#include "glsl_types.h"
|
||||
#include "util/hash_table.h"
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -95,7 +96,8 @@ public:
|
||||
killed_all = false;
|
||||
mem_ctx = ralloc_context(0);
|
||||
this->acp = new(mem_ctx) exec_list;
|
||||
this->kills = new(mem_ctx) exec_list;
|
||||
this->kills = _mesa_hash_table_create(mem_ctx, _mesa_hash_pointer,
|
||||
_mesa_key_pointer_equal);
|
||||
}
|
||||
~ir_constant_propagation_visitor()
|
||||
{
|
||||
@@ -123,7 +125,7 @@ public:
|
||||
* List of kill_entry: The masks of variables whose values were
|
||||
* killed in this block.
|
||||
*/
|
||||
exec_list *kills;
|
||||
hash_table *kills;
|
||||
|
||||
bool progress;
|
||||
|
||||
@@ -263,11 +265,12 @@ ir_constant_propagation_visitor::visit_enter(ir_function_signature *ir)
|
||||
* main() at link time, so they're irrelevant to us.
|
||||
*/
|
||||
exec_list *orig_acp = this->acp;
|
||||
exec_list *orig_kills = this->kills;
|
||||
hash_table *orig_kills = this->kills;
|
||||
bool orig_killed_all = this->killed_all;
|
||||
|
||||
this->acp = new(mem_ctx) exec_list;
|
||||
this->kills = new(mem_ctx) exec_list;
|
||||
this->kills = _mesa_hash_table_create(mem_ctx, _mesa_hash_pointer,
|
||||
_mesa_key_pointer_equal);
|
||||
this->killed_all = false;
|
||||
|
||||
visit_list_elements(this, &ir->body);
|
||||
@@ -352,11 +355,12 @@ void
|
||||
ir_constant_propagation_visitor::handle_if_block(exec_list *instructions)
|
||||
{
|
||||
exec_list *orig_acp = this->acp;
|
||||
exec_list *orig_kills = this->kills;
|
||||
hash_table *orig_kills = this->kills;
|
||||
bool orig_killed_all = this->killed_all;
|
||||
|
||||
this->acp = new(mem_ctx) exec_list;
|
||||
this->kills = new(mem_ctx) exec_list;
|
||||
this->kills = _mesa_hash_table_create(mem_ctx, _mesa_hash_pointer,
|
||||
_mesa_key_pointer_equal);
|
||||
this->killed_all = false;
|
||||
|
||||
/* Populate the initial acp with a constant of the original */
|
||||
@@ -370,12 +374,14 @@ ir_constant_propagation_visitor::handle_if_block(exec_list *instructions)
|
||||
orig_acp->make_empty();
|
||||
}
|
||||
|
||||
exec_list *new_kills = this->kills;
|
||||
hash_table *new_kills = this->kills;
|
||||
this->kills = orig_kills;
|
||||
this->acp = orig_acp;
|
||||
this->killed_all = this->killed_all || orig_killed_all;
|
||||
|
||||
foreach_in_list(kill_entry, k, new_kills) {
|
||||
hash_entry *htk;
|
||||
hash_table_foreach(new_kills, htk) {
|
||||
kill_entry *k = (kill_entry *) htk->data;
|
||||
kill(k->var, k->write_mask);
|
||||
}
|
||||
}
|
||||
@@ -397,7 +403,7 @@ ir_visitor_status
|
||||
ir_constant_propagation_visitor::visit_enter(ir_loop *ir)
|
||||
{
|
||||
exec_list *orig_acp = this->acp;
|
||||
exec_list *orig_kills = this->kills;
|
||||
hash_table *orig_kills = this->kills;
|
||||
bool orig_killed_all = this->killed_all;
|
||||
|
||||
/* FINISHME: For now, the initial acp for loops is totally empty.
|
||||
@@ -405,7 +411,8 @@ ir_constant_propagation_visitor::visit_enter(ir_loop *ir)
|
||||
* cloned minus the killed entries after the first run through.
|
||||
*/
|
||||
this->acp = new(mem_ctx) exec_list;
|
||||
this->kills = new(mem_ctx) exec_list;
|
||||
this->kills = _mesa_hash_table_create(mem_ctx, _mesa_hash_pointer,
|
||||
_mesa_key_pointer_equal);
|
||||
this->killed_all = false;
|
||||
|
||||
visit_list_elements(this, &ir->body_instructions);
|
||||
@@ -414,12 +421,14 @@ ir_constant_propagation_visitor::visit_enter(ir_loop *ir)
|
||||
orig_acp->make_empty();
|
||||
}
|
||||
|
||||
exec_list *new_kills = this->kills;
|
||||
hash_table *new_kills = this->kills;
|
||||
this->kills = orig_kills;
|
||||
this->acp = orig_acp;
|
||||
this->killed_all = this->killed_all || orig_killed_all;
|
||||
|
||||
foreach_in_list(kill_entry, k, new_kills) {
|
||||
hash_entry *htk;
|
||||
hash_table_foreach(new_kills, htk) {
|
||||
kill_entry *k = (kill_entry *) htk->data;
|
||||
kill(k->var, k->write_mask);
|
||||
}
|
||||
|
||||
@@ -448,14 +457,15 @@ ir_constant_propagation_visitor::kill(ir_variable *var, unsigned write_mask)
|
||||
/* Add this writemask of the variable to the list of killed
|
||||
* variables in this block.
|
||||
*/
|
||||
foreach_in_list(kill_entry, entry, this->kills) {
|
||||
if (entry->var == var) {
|
||||
entry->write_mask |= write_mask;
|
||||
return;
|
||||
}
|
||||
hash_entry *kill_hash_entry = _mesa_hash_table_search(this->kills, var);
|
||||
if (kill_hash_entry) {
|
||||
kill_entry *entry = (kill_entry *) kill_hash_entry->data;
|
||||
entry->write_mask |= write_mask;
|
||||
return;
|
||||
}
|
||||
/* Not already in the list. Make new entry. */
|
||||
this->kills->push_tail(new(this->mem_ctx) kill_entry(var, write_mask));
|
||||
_mesa_hash_table_insert(this->kills, var,
|
||||
new(this->mem_ctx) kill_entry(var, write_mask));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -36,11 +36,11 @@
|
||||
#include "ir_visitor.h"
|
||||
#include "ir_optimization.h"
|
||||
#include "glsl_types.h"
|
||||
#include "util/hash_table.h"
|
||||
|
||||
namespace {
|
||||
|
||||
struct assignment_entry {
|
||||
exec_node link;
|
||||
int assignment_count;
|
||||
ir_variable *var;
|
||||
ir_constant *constval;
|
||||
@@ -54,31 +54,32 @@ public:
|
||||
virtual ir_visitor_status visit_enter(ir_assignment *);
|
||||
virtual ir_visitor_status visit_enter(ir_call *);
|
||||
|
||||
exec_list list;
|
||||
struct hash_table *ht;
|
||||
};
|
||||
|
||||
} /* unnamed namespace */
|
||||
|
||||
static struct assignment_entry *
|
||||
get_assignment_entry(ir_variable *var, exec_list *list)
|
||||
get_assignment_entry(ir_variable *var, struct hash_table *ht)
|
||||
{
|
||||
struct hash_entry *hte = _mesa_hash_table_search(ht, var);
|
||||
struct assignment_entry *entry;
|
||||
|
||||
foreach_list_typed(struct assignment_entry, entry, link, list) {
|
||||
if (entry->var == var)
|
||||
return entry;
|
||||
if (hte) {
|
||||
entry = (struct assignment_entry *) hte->data;
|
||||
} else {
|
||||
entry = (struct assignment_entry *) calloc(1, sizeof(*entry));
|
||||
entry->var = var;
|
||||
_mesa_hash_table_insert(ht, var, entry);
|
||||
}
|
||||
|
||||
entry = (struct assignment_entry *)calloc(1, sizeof(*entry));
|
||||
entry->var = var;
|
||||
list->push_head(&entry->link);
|
||||
return entry;
|
||||
}
|
||||
|
||||
ir_visitor_status
|
||||
ir_constant_variable_visitor::visit(ir_variable *ir)
|
||||
{
|
||||
struct assignment_entry *entry = get_assignment_entry(ir, &this->list);
|
||||
struct assignment_entry *entry = get_assignment_entry(ir, this->ht);
|
||||
entry->our_scope = true;
|
||||
return visit_continue;
|
||||
}
|
||||
@@ -97,7 +98,7 @@ ir_constant_variable_visitor::visit_enter(ir_assignment *ir)
|
||||
ir_constant *constval;
|
||||
struct assignment_entry *entry;
|
||||
|
||||
entry = get_assignment_entry(ir->lhs->variable_referenced(), &this->list);
|
||||
entry = get_assignment_entry(ir->lhs->variable_referenced(), this->ht);
|
||||
assert(entry);
|
||||
entry->assignment_count++;
|
||||
|
||||
@@ -150,7 +151,7 @@ ir_constant_variable_visitor::visit_enter(ir_call *ir)
|
||||
struct assignment_entry *entry;
|
||||
|
||||
assert(var);
|
||||
entry = get_assignment_entry(var, &this->list);
|
||||
entry = get_assignment_entry(var, this->ht);
|
||||
entry->assignment_count++;
|
||||
}
|
||||
}
|
||||
@@ -161,7 +162,7 @@ ir_constant_variable_visitor::visit_enter(ir_call *ir)
|
||||
struct assignment_entry *entry;
|
||||
|
||||
assert(var);
|
||||
entry = get_assignment_entry(var, &this->list);
|
||||
entry = get_assignment_entry(var, this->ht);
|
||||
entry->assignment_count++;
|
||||
}
|
||||
|
||||
@@ -177,20 +178,22 @@ do_constant_variable(exec_list *instructions)
|
||||
bool progress = false;
|
||||
ir_constant_variable_visitor v;
|
||||
|
||||
v.ht = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
|
||||
_mesa_key_pointer_equal);
|
||||
v.run(instructions);
|
||||
|
||||
while (!v.list.is_empty()) {
|
||||
|
||||
struct assignment_entry *entry;
|
||||
entry = exec_node_data(struct assignment_entry, v.list.head, link);
|
||||
struct hash_entry *hte;
|
||||
hash_table_foreach(v.ht, hte) {
|
||||
struct assignment_entry *entry = (struct assignment_entry *) hte->data;
|
||||
|
||||
if (entry->assignment_count == 1 && entry->constval && entry->our_scope) {
|
||||
entry->var->constant_value = entry->constval;
|
||||
progress = true;
|
||||
}
|
||||
entry->link.remove();
|
||||
hte->data = NULL;
|
||||
free(entry);
|
||||
}
|
||||
_mesa_hash_table_destroy(v.ht, NULL);
|
||||
|
||||
return progress;
|
||||
}
|
||||
|
@@ -50,19 +50,14 @@ AM_CPPFLAGS = \
|
||||
|
||||
include Makefile.sources
|
||||
|
||||
MKDIR_GEN = $(AM_V_at)$(MKDIR_P) $(@D)
|
||||
PYTHON_GEN = $(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS)
|
||||
|
||||
glapi_gen_mapi_deps := \
|
||||
mapi_abi.py \
|
||||
$(wildcard glapi/gen/*.xml) \
|
||||
$(wildcard glapi/gen/*.py)
|
||||
|
||||
# $(1): path to an XML file
|
||||
# $(2): name of the printer
|
||||
define glapi_gen_mapi
|
||||
@$(MKDIR_P) $(dir $@)
|
||||
$(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS) $(srcdir)/mapi_abi.py \
|
||||
--mode lib --printer $(2) $(1) > $@
|
||||
endef
|
||||
|
||||
if HAVE_SHARED_GLAPI
|
||||
BUILT_SOURCES += shared-glapi/glapi_mapi_tmp.h
|
||||
|
||||
@@ -93,7 +88,9 @@ shared_glapi_test_LDADD = \
|
||||
endif
|
||||
|
||||
shared-glapi/glapi_mapi_tmp.h : glapi/gen/gl_and_es_API.xml $(glapi_gen_mapi_deps)
|
||||
$(call glapi_gen_mapi,$<,shared-glapi)
|
||||
$(MKDIR_GEN)
|
||||
$(PYTHON_GEN) $(srcdir)/mapi_abi.py --mode lib --printer shared-glapi \
|
||||
$(srcdir)/glapi/gen/gl_and_es_API.xml > $@
|
||||
|
||||
if HAVE_OPENGL
|
||||
noinst_LTLIBRARIES = glapi/libglapi.la
|
||||
@@ -185,7 +182,9 @@ endif
|
||||
endif
|
||||
|
||||
es1api/glapi_mapi_tmp.h: glapi/gen/gl_and_es_API.xml $(glapi_gen_mapi_deps)
|
||||
$(call glapi_gen_mapi,$<,es1api)
|
||||
$(MKDIR_GEN)
|
||||
$(PYTHON_GEN) $(srcdir)/mapi_abi.py --mode lib --printer es1api \
|
||||
$(srcdir)/glapi/gen/gl_and_es_API.xml > $@
|
||||
|
||||
if HAVE_OPENGL_ES2
|
||||
TESTS += es2api/ABI-check
|
||||
@@ -229,6 +228,8 @@ endif
|
||||
endif
|
||||
|
||||
es2api/glapi_mapi_tmp.h: glapi/gen/gl_and_es_API.xml $(glapi_gen_mapi_deps)
|
||||
$(call glapi_gen_mapi,$<,es2api)
|
||||
$(MKDIR_GEN)
|
||||
$(PYTHON_GEN) $(srcdir)/mapi_abi.py --mode lib --printer es2api \
|
||||
$(srcdir)/glapi/gen/gl_and_es_API.xml > $@
|
||||
|
||||
include $(top_srcdir)/install-lib-links.mk
|
||||
|
@@ -20,7 +20,7 @@ XORG_INDENT_FLAGS = -linux -bad -bap -blf -bli0 -cbi0 -cdw -nce -cs -i4 -lc80 -p
|
||||
|
||||
MESA_DIR = $(top_builddir)/src/mesa
|
||||
MESA_GLAPI_DIR = $(top_builddir)/src/mapi/glapi
|
||||
MESA_MAPI_DIR = $(top_builddir)/src/mapi
|
||||
MESA_MAPI_DIR = $(top_srcdir)/src/mapi
|
||||
MESA_GLX_DIR = $(top_builddir)/src/glx
|
||||
|
||||
MESA_GLAPI_OUTPUTS = \
|
||||
@@ -209,7 +209,7 @@ COMMON = $(API_XML) \
|
||||
|
||||
COMMON_GLX = $(COMMON) glX_API.xml glX_XML.py glX_proto_common.py
|
||||
|
||||
PYTHON_GEN = $(AM_V_GEN) $(PYTHON2) $(PYTHON_FLAGS)
|
||||
PYTHON_GEN = $(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS)
|
||||
|
||||
######################################################################
|
||||
|
||||
@@ -241,65 +241,65 @@ $(XORG_GLAPI_DIR)/%.h: $(MESA_GLAPI_DIR)/%.h
|
||||
######################################################################
|
||||
|
||||
$(MESA_GLAPI_DIR)/glapi_mapi_tmp.h: $(MESA_MAPI_DIR)/mapi_abi.py $(COMMON)
|
||||
$(PYTHON_GEN) $< \
|
||||
$(PYTHON_GEN) $(MESA_MAPI_DIR)/mapi_abi.py \
|
||||
--printer glapi --mode lib $(srcdir)/gl_and_es_API.xml > $@
|
||||
|
||||
$(MESA_GLAPI_DIR)/glprocs.h: gl_procs.py $(COMMON)
|
||||
$(PYTHON_GEN) $< -c -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
$(PYTHON_GEN) $(srcdir)/gl_procs.py -c -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
|
||||
$(MESA_GLAPI_DIR)/glapitemp.h: gl_apitemp.py $(COMMON)
|
||||
$(PYTHON_GEN) $< -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
$(PYTHON_GEN) $(srcdir)/gl_apitemp.py -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
|
||||
$(MESA_GLAPI_DIR)/glapitable.h: gl_table.py $(COMMON)
|
||||
$(PYTHON_GEN) $< -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
$(PYTHON_GEN) $(srcdir)/gl_table.py -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
|
||||
$(MESA_GLAPI_DIR)/glapi_gentable.c: gl_gentable.py $(COMMON)
|
||||
$(PYTHON_GEN) $< -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
$(PYTHON_GEN) $(srcdir)/gl_gentable.py -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
|
||||
######################################################################
|
||||
|
||||
$(MESA_GLAPI_DIR)/glapi_x86.S: gl_x86_asm.py $(COMMON)
|
||||
$(PYTHON_GEN) $< -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
$(PYTHON_GEN) $(srcdir)/gl_x86_asm.py -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
|
||||
$(MESA_GLAPI_DIR)/glapi_x86-64.S: gl_x86-64_asm.py $(COMMON)
|
||||
$(PYTHON_GEN) $< -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
$(PYTHON_GEN) $(srcdir)/gl_x86-64_asm.py -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
|
||||
$(MESA_GLAPI_DIR)/glapi_sparc.S: gl_SPARC_asm.py $(COMMON)
|
||||
$(PYTHON_GEN) $< -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
$(PYTHON_GEN) $(srcdir)/gl_SPARC_asm.py -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
|
||||
######################################################################
|
||||
|
||||
$(MESA_DIR)/main/enums.c: gl_enums.py $(COMMON)
|
||||
$(PYTHON_GEN) $< -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
$(PYTHON_GEN) $(srcdir)/gl_enums.py -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
|
||||
$(MESA_DIR)/main/api_exec.c: gl_genexec.py apiexec.py $(COMMON)
|
||||
$(PYTHON_GEN) $< -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
$(PYTHON_GEN) $(srcdir)/gl_genexec.py -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
|
||||
$(MESA_DIR)/main/dispatch.h: gl_table.py $(COMMON)
|
||||
$(PYTHON_GEN) $< -f $(srcdir)/gl_and_es_API.xml -m remap_table > $@
|
||||
$(PYTHON_GEN) $(srcdir)/gl_table.py -f $(srcdir)/gl_and_es_API.xml -m remap_table > $@
|
||||
|
||||
$(MESA_DIR)/main/remap_helper.h: remap_helper.py $(COMMON)
|
||||
$(PYTHON_GEN) $< -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
$(PYTHON_GEN) $(srcdir)/remap_helper.py -f $(srcdir)/gl_and_es_API.xml > $@
|
||||
|
||||
######################################################################
|
||||
|
||||
$(MESA_GLX_DIR)/indirect.c: glX_proto_send.py $(COMMON_GLX)
|
||||
$(PYTHON_GEN) $< -f $(srcdir)/gl_API.xml -m proto \
|
||||
$(PYTHON_GEN) $(srcdir)/glX_proto_send.py -f $(srcdir)/gl_API.xml -m proto \
|
||||
| $(INDENT) $(INDENT_FLAGS) > $@
|
||||
|
||||
$(MESA_GLX_DIR)/indirect.h: glX_proto_send.py $(COMMON_GLX)
|
||||
$(PYTHON_GEN) $< -f $(srcdir)/gl_API.xml -m init_h > $@
|
||||
$(PYTHON_GEN) $(srcdir)/glX_proto_send.py -f $(srcdir)/gl_API.xml -m init_h > $@
|
||||
|
||||
$(MESA_GLX_DIR)/indirect_init.c: glX_proto_send.py $(COMMON_GLX)
|
||||
$(PYTHON_GEN) $< -f $(srcdir)/gl_API.xml -m init_c > $@
|
||||
$(PYTHON_GEN) $(srcdir)/glX_proto_send.py -f $(srcdir)/gl_API.xml -m init_c > $@
|
||||
|
||||
$(MESA_GLX_DIR)/indirect_size.h $(XORG_GLX_DIR)/indirect_size.h: glX_proto_size.py $(COMMON_GLX)
|
||||
$(PYTHON_GEN) $< -f $(srcdir)/gl_API.xml -m size_h --only-set \
|
||||
$(PYTHON_GEN) $(srcdir)/glX_proto_size.py -f $(srcdir)/gl_API.xml -m size_h --only-set \
|
||||
--header-tag _INDIRECT_SIZE_H_ \
|
||||
| $(INDENT) $(INDENT_FLAGS) > $@
|
||||
|
||||
$(MESA_GLX_DIR)/indirect_size.c: glX_proto_size.py $(COMMON_GLX)
|
||||
$(PYTHON_GEN) $< -f $(srcdir)/gl_API.xml -m size_c --only-set \
|
||||
$(PYTHON_GEN) $(srcdir)/glX_proto_size.py -f $(srcdir)/gl_API.xml -m size_c --only-set \
|
||||
| $(INDENT) $(INDENT_FLAGS) > $@
|
||||
|
||||
######################################################################
|
||||
|
@@ -90,37 +90,24 @@ CLEANFILES = \
|
||||
program/program_parse.tab.h \
|
||||
main/git_sha1.h.tmp
|
||||
|
||||
GET_HASH_GEN = main/get_hash_generator.py
|
||||
PYTHON_GEN = $(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS)
|
||||
|
||||
main/get_hash.h: ../mapi/glapi/gen/gl_and_es_API.xml main/get_hash_params.py \
|
||||
$(GET_HASH_GEN)
|
||||
$(AM_V_GEN)set -e; \
|
||||
$(PYTHON2) $(PYTHON_FLAGS) $(srcdir)/$(GET_HASH_GEN) \
|
||||
-f $< > $@.tmp; \
|
||||
mv $@.tmp $@;
|
||||
main/get_hash.h: ../mapi/glapi/gen/gl_and_es_API.xml main/get_hash_params.py \
|
||||
main/get_hash_generator.py
|
||||
$(PYTHON_GEN) $(srcdir)/main/get_hash_generator.py \
|
||||
-f $(srcdir)/../mapi/glapi/gen/gl_and_es_API.xml > $@
|
||||
|
||||
main/format_info.h: main/formats.csv \
|
||||
main/format_info.h: main/formats.csv \
|
||||
main/format_parser.py main/format_info.py
|
||||
$(AM_V_GEN)set -e; \
|
||||
$(PYTHON2) $(PYTHON_FLAGS) $(srcdir)/main/format_info.py \
|
||||
$< > $@.tmp; \
|
||||
mv $@.tmp $@;
|
||||
$(PYTHON_GEN) $(srcdir)/main/format_info.py $(srcdir)/main/formats.csv > $@
|
||||
|
||||
main/format_pack.c: main/format_pack.py main/formats.csv \
|
||||
main/format_pack.c: main/format_pack.py main/formats.csv \
|
||||
main/format_parser.py
|
||||
$(AM_V_GEN)set -e; \
|
||||
$(PYTHON2) $(PYTHON_FLAGS) \
|
||||
$(srcdir)/main/format_pack.py \
|
||||
$(srcdir)/main/formats.csv \
|
||||
| $(INDENT) $(INDENT_FLAGS) > $@;
|
||||
$(PYTHON_GEN) $(srcdir)/main/format_pack.py $(srcdir)/main/formats.csv > $@
|
||||
|
||||
main/format_unpack.c: main/format_unpack.py main/formats.csv \
|
||||
main/format_parser.py
|
||||
$(AM_V_GEN)set -e; \
|
||||
$(PYTHON2) $(PYTHON_FLAGS) \
|
||||
$(srcdir)/main/format_unpack.py \
|
||||
$(srcdir)/main/formats.csv \
|
||||
| $(INDENT) $(INDENT_FLAGS) > $@;
|
||||
$(PYTHON_GEN) $(srcdir)/main/format_unpack.py $(srcdir)/main/formats.csv > $@
|
||||
|
||||
main/formats.c: main/format_info.h
|
||||
|
||||
@@ -201,13 +188,17 @@ libmesa_sse41_la_CFLAGS = $(AM_CFLAGS) $(SSE41_CFLAGS)
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = gl.pc
|
||||
|
||||
MKDIR_GEN = $(AM_V_at)$(MKDIR_P) $(@D)
|
||||
YACC_GEN = $(AM_V_GEN)$(YACC) $(YFLAGS)
|
||||
LEX_GEN = $(AM_V_GEN)$(LEX) $(LFLAGS)
|
||||
|
||||
program/lex.yy.c: program/program_lexer.l
|
||||
$(AM_V_at)$(MKDIR_P) program
|
||||
$(AM_V_GEN) $(LEX) --never-interactive --outfile=$@ $<
|
||||
$(MKDIR_GEN)
|
||||
$(LEX_GEN) -o $@ $(srcdir)/program/program_lexer.l
|
||||
|
||||
program/program_parse.tab.c program/program_parse.tab.h: program/program_parse.y
|
||||
$(AM_V_at)$(MKDIR_P) program
|
||||
$(AM_V_GEN) $(YACC) -p "_mesa_program_" -v -d --output=program/program_parse.tab.c $<
|
||||
$(MKDIR_GEN)
|
||||
$(YACC_GEN) -o $@ -p "_mesa_program_" --defines=$(builddir)/program/program_parse.tab.h $(srcdir)/program/program_parse.y
|
||||
|
||||
if GEN_ASM_OFFSETS
|
||||
matypes.h: $(gen_matypes_SOURCES)
|
||||
|
@@ -163,7 +163,6 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target,
|
||||
const GLuint maxLevel = texObj->MaxLevel;
|
||||
const GLint maxLevelSave = texObj->MaxLevel;
|
||||
const GLboolean genMipmapSave = texObj->GenerateMipmap;
|
||||
const GLuint currentTexUnitSave = ctx->Texture.CurrentUnit;
|
||||
const GLboolean use_glsl_version = ctx->Extensions.ARB_vertex_shader &&
|
||||
ctx->Extensions.ARB_fragment_shader;
|
||||
GLenum faceTarget;
|
||||
@@ -202,8 +201,12 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target,
|
||||
samplerSave = ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler ?
|
||||
ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler->Name : 0;
|
||||
|
||||
if (currentTexUnitSave != 0)
|
||||
_mesa_BindTexture(target, texObj->Name);
|
||||
/* We may have been called from glGenerateTextureMipmap with CurrentUnit
|
||||
* still set to 0, so we don't know when we can skip binding the texture.
|
||||
* Assume that _mesa_BindTexture will be fast if we're rebinding the same
|
||||
* texture.
|
||||
*/
|
||||
_mesa_BindTexture(target, texObj->Name);
|
||||
|
||||
if (!mipmap->Sampler) {
|
||||
_mesa_GenSamplers(1, &mipmap->Sampler);
|
||||
|
@@ -67,7 +67,7 @@ CLEANFILES = \
|
||||
$(MOS)
|
||||
|
||||
# Default target options.h
|
||||
options.h: LOCALEDIR := .
|
||||
LOCALEDIR := .
|
||||
options.h: t_options.h $(MOS)
|
||||
$(AM_V_GEN) $(PYTHON2) $(PYTHON_FLAGS) $(srcdir)/gen_xmlpool.py $(srcdir)/t_options.h $(LOCALEDIR) $(LANGS) > options.h
|
||||
|
||||
|
@@ -215,6 +215,10 @@ brw_blorp_copytexsubimage(struct brw_context *brw,
|
||||
struct intel_renderbuffer *src_irb = intel_renderbuffer(src_rb);
|
||||
struct intel_texture_image *intel_image = intel_texture_image(dst_image);
|
||||
|
||||
/* No pixel transfer operations (zoom, bias, mapping), just a blit */
|
||||
if (brw->ctx._ImageTransferState)
|
||||
return false;
|
||||
|
||||
/* Sync up the state of window system buffers. We need to do this before
|
||||
* we go looking at the src renderbuffer's miptree.
|
||||
*/
|
||||
|
@@ -323,6 +323,15 @@ brw_initialize_context_constants(struct brw_context *brw)
|
||||
|
||||
ctx->Const.StripTextureBorder = true;
|
||||
|
||||
ctx->Const.MaxUniformBlockSize = 65536;
|
||||
for (int i = 0; i < MESA_SHADER_STAGES; i++) {
|
||||
struct gl_program_constants *prog = &ctx->Const.Program[i];
|
||||
prog->MaxUniformBlocks = 12;
|
||||
prog->MaxCombinedUniformComponents =
|
||||
prog->MaxUniformComponents +
|
||||
ctx->Const.MaxUniformBlockSize / 4 * prog->MaxUniformBlocks;
|
||||
}
|
||||
|
||||
ctx->Const.MaxDualSourceDrawBuffers = 1;
|
||||
ctx->Const.MaxDrawBuffers = BRW_MAX_DRAW_BUFFERS;
|
||||
ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = max_samplers;
|
||||
|
@@ -43,6 +43,7 @@
|
||||
#include "glsl/ir_visitor.h"
|
||||
#include "glsl/ir_rvalue_visitor.h"
|
||||
#include "glsl/glsl_types.h"
|
||||
#include "util/hash_table.h"
|
||||
|
||||
static bool debug = false;
|
||||
|
||||
@@ -72,7 +73,8 @@ public:
|
||||
ir_vector_reference_visitor(void)
|
||||
{
|
||||
this->mem_ctx = ralloc_context(NULL);
|
||||
this->variable_list.make_empty();
|
||||
this->ht = _mesa_hash_table_create(mem_ctx, _mesa_hash_pointer,
|
||||
_mesa_key_pointer_equal);
|
||||
}
|
||||
|
||||
~ir_vector_reference_visitor(void)
|
||||
@@ -89,7 +91,7 @@ public:
|
||||
variable_entry *get_variable_entry(ir_variable *var);
|
||||
|
||||
/* List of variable_entry */
|
||||
exec_list variable_list;
|
||||
struct hash_table *ht;
|
||||
|
||||
void *mem_ctx;
|
||||
};
|
||||
@@ -119,13 +121,12 @@ ir_vector_reference_visitor::get_variable_entry(ir_variable *var)
|
||||
break;
|
||||
}
|
||||
|
||||
foreach_in_list(variable_entry, entry, &variable_list) {
|
||||
if (entry->var == var)
|
||||
return entry;
|
||||
}
|
||||
struct hash_entry *hte = _mesa_hash_table_search(ht, var);
|
||||
if (hte)
|
||||
return (struct variable_entry *) hte->data;
|
||||
|
||||
variable_entry *entry = new(mem_ctx) variable_entry(var);
|
||||
this->variable_list.push_tail(entry);
|
||||
_mesa_hash_table_insert(ht, var, entry);
|
||||
return entry;
|
||||
}
|
||||
|
||||
@@ -195,9 +196,9 @@ ir_vector_reference_visitor::visit_enter(ir_function_signature *ir)
|
||||
|
||||
class ir_vector_splitting_visitor : public ir_rvalue_visitor {
|
||||
public:
|
||||
ir_vector_splitting_visitor(exec_list *vars)
|
||||
ir_vector_splitting_visitor(struct hash_table *vars)
|
||||
{
|
||||
this->variable_list = vars;
|
||||
this->ht = vars;
|
||||
}
|
||||
|
||||
virtual ir_visitor_status visit_leave(ir_assignment *);
|
||||
@@ -205,7 +206,7 @@ public:
|
||||
void handle_rvalue(ir_rvalue **rvalue);
|
||||
variable_entry *get_splitting_entry(ir_variable *var);
|
||||
|
||||
exec_list *variable_list;
|
||||
struct hash_table *ht;
|
||||
};
|
||||
|
||||
variable_entry *
|
||||
@@ -216,13 +217,8 @@ ir_vector_splitting_visitor::get_splitting_entry(ir_variable *var)
|
||||
if (!var->type->is_vector())
|
||||
return NULL;
|
||||
|
||||
foreach_in_list(variable_entry, entry, variable_list) {
|
||||
if (entry->var == var) {
|
||||
return entry;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
struct hash_entry *hte = _mesa_hash_table_search(ht, var);
|
||||
return hte ? (struct variable_entry *) hte->data : NULL;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -329,12 +325,15 @@ ir_vector_splitting_visitor::visit_leave(ir_assignment *ir)
|
||||
bool
|
||||
brw_do_vector_splitting(exec_list *instructions)
|
||||
{
|
||||
struct hash_entry *hte;
|
||||
|
||||
ir_vector_reference_visitor refs;
|
||||
|
||||
visit_list_elements(&refs, instructions);
|
||||
|
||||
/* Trim out variables we can't split. */
|
||||
foreach_in_list_safe(variable_entry, entry, &refs.variable_list) {
|
||||
hash_table_foreach(refs.ht, hte) {
|
||||
struct variable_entry *entry = (struct variable_entry *) hte->data;
|
||||
if (debug) {
|
||||
fprintf(stderr, "vector %s@%p: whole_access %d\n",
|
||||
entry->var->name, (void *) entry->var,
|
||||
@@ -342,11 +341,11 @@ brw_do_vector_splitting(exec_list *instructions)
|
||||
}
|
||||
|
||||
if (entry->whole_vector_access) {
|
||||
entry->remove();
|
||||
_mesa_hash_table_remove(refs.ht, hte);
|
||||
}
|
||||
}
|
||||
|
||||
if (refs.variable_list.is_empty())
|
||||
if (refs.ht->entries == 0)
|
||||
return false;
|
||||
|
||||
void *mem_ctx = ralloc_context(NULL);
|
||||
@@ -354,7 +353,8 @@ brw_do_vector_splitting(exec_list *instructions)
|
||||
/* Replace the decls of the vectors to be split with their split
|
||||
* components.
|
||||
*/
|
||||
foreach_in_list(variable_entry, entry, &refs.variable_list) {
|
||||
hash_table_foreach(refs.ht, hte) {
|
||||
struct variable_entry *entry = (struct variable_entry *) hte->data;
|
||||
const struct glsl_type *type;
|
||||
type = glsl_type::get_instance(entry->var->type->base_type, 1, 1);
|
||||
|
||||
@@ -378,7 +378,7 @@ brw_do_vector_splitting(exec_list *instructions)
|
||||
entry->var->remove();
|
||||
}
|
||||
|
||||
ir_vector_splitting_visitor split(&refs.variable_list);
|
||||
ir_vector_splitting_visitor split(refs.ht);
|
||||
visit_list_elements(&split, instructions);
|
||||
|
||||
ralloc_free(mem_ctx);
|
||||
|
@@ -55,6 +55,10 @@ intel_copy_texsubimage(struct brw_context *brw,
|
||||
const GLenum internalFormat = intelImage->base.Base.InternalFormat;
|
||||
bool ret;
|
||||
|
||||
/* No pixel transfer operations (zoom, bias, mapping), just a blit */
|
||||
if (brw->ctx._ImageTransferState)
|
||||
return false;
|
||||
|
||||
intel_prepare_render(brw);
|
||||
|
||||
/* glCopyTexSubImage() can be called on a multisampled renderbuffer (if
|
||||
|
@@ -873,8 +873,13 @@ void st_init_extensions(struct pipe_screen *screen,
|
||||
|
||||
consts->MaxViewports = screen->get_param(screen, PIPE_CAP_MAX_VIEWPORTS);
|
||||
if (consts->MaxViewports >= 16) {
|
||||
consts->ViewportBounds.Min = -16384.0;
|
||||
consts->ViewportBounds.Max = 16384.0;
|
||||
if (glsl_feature_level >= 400) {
|
||||
consts->ViewportBounds.Min = -32768.0;
|
||||
consts->ViewportBounds.Max = 32767.0;
|
||||
} else {
|
||||
consts->ViewportBounds.Min = -16384.0;
|
||||
consts->ViewportBounds.Max = 16383.0;
|
||||
}
|
||||
extensions->ARB_viewport_array = GL_TRUE;
|
||||
extensions->ARB_fragment_layer_viewport = GL_TRUE;
|
||||
if (extensions->AMD_vertex_shader_layer)
|
||||
|
@@ -1270,46 +1270,40 @@ static const struct format_mapping format_map[] = {
|
||||
/* 32-bit float formats */
|
||||
{
|
||||
{ GL_RGBA32F_ARB, 0 },
|
||||
{ PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
|
||||
{ PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
|
||||
},
|
||||
{
|
||||
{ GL_RGB32F_ARB, 0 },
|
||||
{ PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32X32_FLOAT,
|
||||
PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
|
||||
PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
|
||||
},
|
||||
{
|
||||
{ GL_LUMINANCE_ALPHA32F_ARB, 0 },
|
||||
{ PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT,
|
||||
PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
|
||||
{ PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
|
||||
},
|
||||
{
|
||||
{ GL_ALPHA32F_ARB, 0 },
|
||||
{ PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
|
||||
PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_A16_FLOAT,
|
||||
PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
|
||||
PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
|
||||
},
|
||||
{
|
||||
{ GL_INTENSITY32F_ARB, 0 },
|
||||
{ PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
|
||||
PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_I16_FLOAT,
|
||||
PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
|
||||
PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
|
||||
},
|
||||
{
|
||||
{ GL_LUMINANCE32F_ARB, 0 },
|
||||
{ PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
|
||||
PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_L16_FLOAT,
|
||||
PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
|
||||
PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
|
||||
},
|
||||
{
|
||||
{ GL_R32F, 0 },
|
||||
{ PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32G32_FLOAT,
|
||||
PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16_FLOAT,
|
||||
PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
|
||||
PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
|
||||
},
|
||||
{
|
||||
{ GL_RG32F, 0 },
|
||||
{ PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT,
|
||||
PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
|
||||
{ PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
|
||||
},
|
||||
|
||||
/* R, RG formats */
|
||||
|
@@ -52,5 +52,7 @@ BUILT_SOURCES = $(MESA_UTIL_GENERATED_FILES)
|
||||
CLEANFILES = $(BUILT_SOURCES)
|
||||
EXTRA_DIST = format_srgb.py SConscript
|
||||
|
||||
format_srgb.c: $(srcdir)/format_srgb.py
|
||||
$(AM_V_GEN) $(PYTHON2) $< > $@
|
||||
PYTHON_GEN = $(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS)
|
||||
|
||||
format_srgb.c: format_srgb.py
|
||||
$(PYTHON_GEN) $(srcdir)/format_srgb.py > $@
|
||||
|
Reference in New Issue
Block a user