Compare commits
53 Commits
mesa-10.3
...
mesa-10.3.
Author | SHA1 | Date | |
---|---|---|---|
|
3b6a4758fa | ||
|
e0aaa9591b | ||
|
724f71ef39 | ||
|
6fa07d1d48 | ||
|
8f6f6a28fa | ||
|
10d8287074 | ||
|
c759d1b6bf | ||
|
b37c1d4642 | ||
|
fb20a5aa98 | ||
|
4f33ded115 | ||
|
13a4fd2430 | ||
|
5e6ee119c0 | ||
|
85d7eb730a | ||
|
64c2bdc334 | ||
|
125cd86cd4 | ||
|
e3e68a36db | ||
|
745a0bfd62 | ||
|
ada5fd6e85 | ||
|
ecd2d078ac | ||
|
08f7e3591d | ||
|
fa98c74692 | ||
|
088d350178 | ||
|
85421100fb | ||
|
c90cd077bd | ||
|
dffbee6668 | ||
|
58ba481e8e | ||
|
ccf908e382 | ||
|
ed440234d4 | ||
|
d95520d297 | ||
|
3e980357c5 | ||
|
384816c6db | ||
|
d556ed889d | ||
|
d9444533aa | ||
|
9328440ef7 | ||
|
1ac204121b | ||
|
fef6059a81 | ||
|
34809f8eef | ||
|
9a79018840 | ||
|
5aff846a60 | ||
|
fb4e23626f | ||
|
607d0b9578 | ||
|
4fce87bcee | ||
|
8e2d0f59f7 | ||
|
4748d2f065 | ||
|
f74bca93b4 | ||
|
ceebec140b | ||
|
095a6a0af1 | ||
|
04a9d7d44a | ||
|
d4289fc37b | ||
|
9599cd6a2f | ||
|
27f70a9273 | ||
|
0a6e33ea74 | ||
|
18571edea8 |
@@ -81,6 +81,7 @@ SUBDIRS := \
|
||||
src/mapi \
|
||||
src/glsl \
|
||||
src/mesa \
|
||||
src/util \
|
||||
src/egl/main
|
||||
|
||||
ifeq ($(strip $(MESA_BUILD_CLASSIC)),true)
|
||||
|
@@ -1704,11 +1704,10 @@ if test "x$enable_gallium_llvm" = xyes; then
|
||||
AC_COMPUTE_INT([LLVM_VERSION_MINOR], [LLVM_VERSION_MINOR],
|
||||
[#include "${LLVM_INCLUDEDIR}/llvm/Config/llvm-config.h"])
|
||||
|
||||
dnl In LLVM 3.4.1 patch level was defined in config.h and not
|
||||
dnl llvm-config.h
|
||||
AC_COMPUTE_INT([LLVM_VERSION_PATCH], [LLVM_VERSION_PATCH],
|
||||
[#include "${LLVM_INCLUDEDIR}/llvm/Config/config.h"],
|
||||
LLVM_VERSION_PATCH=0) dnl Default if LLVM_VERSION_PATCH not found
|
||||
LLVM_VERSION_PATCH=`echo $LLVM_VERSION | cut -d. -f3 | egrep -o '^[[0-9]]+'`
|
||||
if test -z "$LLVM_VERSION_PATCH"; then
|
||||
LLVM_VERSION_PATCH=0
|
||||
fi
|
||||
|
||||
if test -n "${LLVM_VERSION_MAJOR}"; then
|
||||
LLVM_VERSION_INT="${LLVM_VERSION_MAJOR}0${LLVM_VERSION_MINOR}"
|
||||
|
@@ -16,6 +16,17 @@
|
||||
|
||||
<h1>News</h1>
|
||||
|
||||
<h2>September 19, 2014</h2>
|
||||
<p>
|
||||
<a href="relnotes/10.3.html">Mesa 10.3</a> is released. This is a new
|
||||
development release. See the release notes for more information about
|
||||
the release.
|
||||
</p>
|
||||
<p>
|
||||
Also, <a href="relnotes/10.2.8.html">Mesa 10.2.8</a> is released.
|
||||
This is a bug fix release from the 10.2 branch.
|
||||
</p>
|
||||
|
||||
<h2>August 19, 2014</h2>
|
||||
<p>
|
||||
<a href="relnotes/10.2.6.html">Mesa 10.2.6</a> is released.
|
||||
|
@@ -21,6 +21,8 @@ The release notes summarize what's new or changed in each Mesa release.
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="relnotes/10.3.html">10.3 release notes</a>
|
||||
<li><a href="relnotes/10.2.8.html">10.2.8 release notes</a>
|
||||
<li><a href="relnotes/10.2.6.html">10.2.6 release notes</a>
|
||||
<li><a href="relnotes/10.2.5.html">10.2.5 release notes</a>
|
||||
<li><a href="relnotes/10.2.4.html">10.2.4 release notes</a>
|
||||
|
158
docs/relnotes/10.3.1.html
Normal file
158
docs/relnotes/10.3.1.html
Normal file
@@ -0,0 +1,158 @@
|
||||
<!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 10.3.1 Release Notes / October 12, 2014</h1>
|
||||
|
||||
<p>
|
||||
Mesa 10.3.1 is a bug fix release which fixes bugs found since the 10.3 release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 10.3.1 implements the OpenGL 3.3 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 3.3. OpenGL
|
||||
3.3 is <strong>only</strong> available if requested at context creation
|
||||
because compatibility contexts are not supported.
|
||||
</p>
|
||||
|
||||
<h2>SHA256 checksums</h2>
|
||||
<pre>
|
||||
155afcbad17be8bb80282c761b957d5cc716c14a1fa16c4f5ee04e76df729c6d MesaLib-10.3.1.tar.gz
|
||||
b081d077d717e5d56f2d59677490856052c41573e50378ff86d6c72456714add MesaLib-10.3.1.tar.bz2
|
||||
07a14febfed06412d519e091a62d24513fee6745f1a6f8a8f1956bfe04b77d15 MesaLib-10.3.1.zip
|
||||
</pre>
|
||||
|
||||
<h2>New features</h2>
|
||||
<p>None</p>
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
|
||||
<p>This list is likely incomplete.</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=79462">Bug 79462</a> - [NVC0/Codegen] Shader compilation falis in spill logic</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=82932">Bug 82932</a> - [SNB+ Bisected]Ogles3conform ES3-CTS.shaders.indexing.vector_subscript.vec3_static_loop_subscript_write_direct_read_vertex fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=83506">Bug 83506</a> - [UBO] row_major layout ignored inside structures</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=83533">Bug 83533</a> - [UBO] nested structures don't get appropriate padding</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=83570">Bug 83570</a> - Glyphy demo throws unhandled Integer division by zero exception</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=83741">Bug 83741</a> - [UBO] row_major layout partially ignored for arrays of structures</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=84178">Bug 84178</a> - Big glamor regression in Xorg server 1.6.99.1 GIT: x11perf 1.5 Test: PutImage XY 500x500 Square</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<h2>Changes</h2>
|
||||
|
||||
<p>Andreas Pokorny (2):</p>
|
||||
<ul>
|
||||
<li>egl/drm: expose KHR_image_pixmap extension</li>
|
||||
<li>i915: Fix black buffers when importing prime fds</li>
|
||||
</ul>
|
||||
|
||||
<p>Brian Paul (1):</p>
|
||||
<ul>
|
||||
<li>mesa: fix prog_optimize.c assertions triggered by SWZ opcode</li>
|
||||
</ul>
|
||||
|
||||
<p>Emil Velikov (2):</p>
|
||||
<ul>
|
||||
<li>docs: Add 10.3 sha256 sums, news item and link release notes</li>
|
||||
<li>Update VERSION to 10.3.1</li>
|
||||
</ul>
|
||||
|
||||
<p>Ian Romanick (4):</p>
|
||||
<ul>
|
||||
<li>glsl: Make sure fields after small structs have correct padding</li>
|
||||
<li>glsl: Make sure row-major array-of-structure get correct layout</li>
|
||||
<li>glsl: Round struct size up to at least 16 bytes</li>
|
||||
<li>glsl: Strip arrayness from ir_type_dereference_variable too</li>
|
||||
</ul>
|
||||
|
||||
<p>Ilia Mirkin (5):</p>
|
||||
<ul>
|
||||
<li>nv50/ir: avoid deleting pseudo instructions too early</li>
|
||||
<li>gm107/ir: fix manual TXD for array targets</li>
|
||||
<li>gm107/ir: fix texture argument order</li>
|
||||
<li>gm107/ir: add support for indirect const buffer selection</li>
|
||||
<li>gm107/ir: take relative pfetch offset into account</li>
|
||||
</ul>
|
||||
|
||||
<p>Keith Packard (1):</p>
|
||||
<ul>
|
||||
<li>glx/dri3: Provide error diagnostics when DRI3 allocation fails</li>
|
||||
</ul>
|
||||
|
||||
<p>Kenneth Graunke (2):</p>
|
||||
<ul>
|
||||
<li>mesa: Use proper structure for glGet*(GL_TEXTURE_COORD_ARRAY*).</li>
|
||||
<li>mesa: Set correct array element in vbo_exec_vtx_init.</li>
|
||||
</ul>
|
||||
|
||||
<p>Marek Olšák (3):</p>
|
||||
<ul>
|
||||
<li>radeonsi: release GS rings at context destruction</li>
|
||||
<li>radeonsi: properly destroy the GS copy shader and scratch_bo for compute</li>
|
||||
<li>st/dri: remove GALLIUM_MSAA and __GL_FSAA_MODE environment variables</li>
|
||||
</ul>
|
||||
|
||||
<p>Michel Dänzer (1):</p>
|
||||
<ul>
|
||||
<li>st/mesa: Use PIPE_USAGE_STAGING for GL_STATIC/DYNAMIC/STREAM_READ buffers</li>
|
||||
</ul>
|
||||
|
||||
<p>Richard Sandiford (2):</p>
|
||||
<ul>
|
||||
<li>mesa: Fix alpha component in unpack_R8G8B8X8_SRGB.</li>
|
||||
<li>swrast: Fix handling of MESA_FORMAT_L8A8_SRGB for big-endian</li>
|
||||
</ul>
|
||||
|
||||
<p>Roland Scheidegger (1):</p>
|
||||
<ul>
|
||||
<li>gallivm: fix idiv</li>
|
||||
</ul>
|
||||
|
||||
<p>Thomas Hellstrom (1):</p>
|
||||
<ul>
|
||||
<li>st/xa: Fix regression in xa_yuv_planar_blit()</li>
|
||||
</ul>
|
||||
|
||||
<p>Tom Stellard (2):</p>
|
||||
<ul>
|
||||
<li>clover: Add support to mem objects for multiple destructor callbacks v2</li>
|
||||
<li>configure.ac: Compute LLVM_VERSION_PATCH using llvm-config</li>
|
||||
</ul>
|
||||
|
||||
<p>Tomasz Figa (3):</p>
|
||||
<ul>
|
||||
<li>util: Include in Android builds</li>
|
||||
<li>st/mesa: Generate format_info.c in Android builds</li>
|
||||
<li>st/mesa: Fix paths used in Android builds</li>
|
||||
</ul>
|
||||
|
||||
<p>rconde (1):</p>
|
||||
<ul>
|
||||
<li>gallivm,tgsi: fix idiv by zero crash</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
113
docs/relnotes/10.3.2.html
Normal file
113
docs/relnotes/10.3.2.html
Normal file
@@ -0,0 +1,113 @@
|
||||
<!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 10.3.2 Release Notes / October 24, 2014</h1>
|
||||
|
||||
<p>
|
||||
Mesa 10.3.2 is a bug fix release which fixes bugs found since the 10.3 release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 10.3.2 implements the OpenGL 3.3 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 3.3. OpenGL
|
||||
3.3 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>
|
||||
|
||||
<p>This list is likely incomplete.</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=54372">Bug 54372</a> - GLX_INTEL_swap_event crashes driver when swapping window buffers</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=81680">Bug 81680</a> - [r600g] Firefox crashes with hardware acceleration turned on</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=84140">Bug 84140</a> - mplayer crashes playing some files using vdpau output</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=84662">Bug 84662</a> - Long pauses with Unreal demo Elemental on R9270X since : Always flush the HDP cache before submitting a CS to the GPU</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=85267">Bug 85267</a> - vlc crashes with vdpau (Radeon 3850HD) [r600]</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<h2>Changes</h2>
|
||||
|
||||
<p>Brian Paul (3):</p>
|
||||
<ul>
|
||||
<li>mesa: fix spurious wglGetProcAddress / GL_INVALID_OPERATION error</li>
|
||||
<li>st/wgl: add WINAPI qualifiers on wgl function typedefs</li>
|
||||
<li>glsl: fix several use-after-free bugs</li>
|
||||
</ul>
|
||||
|
||||
<p>Daniel Manjarres (1):</p>
|
||||
<ul>
|
||||
<li>glx: Fix glxUseXFont for glxWindow and glxPixmaps</li>
|
||||
</ul>
|
||||
|
||||
<p>Dave Airlie (1):</p>
|
||||
<ul>
|
||||
<li>mesa: fix GetTexImage for 1D array depth textures</li>
|
||||
</ul>
|
||||
|
||||
<p>Emil Velikov (2):</p>
|
||||
<ul>
|
||||
<li>docs: Add sha256 sums for the 10.3.1 release</li>
|
||||
<li>Update VERSION to 10.3.2</li>
|
||||
</ul>
|
||||
|
||||
<p>Ilia Mirkin (4):</p>
|
||||
<ul>
|
||||
<li>gm107/ir: add dnz emission for fmul</li>
|
||||
<li>gk110/ir: add dnz flag emission for fmul/fmad</li>
|
||||
<li>nouveau: 3d textures are unsupported, limit 3d levels to 1</li>
|
||||
<li>st/gbm: fix order of arguments passed to is_format_supported</li>
|
||||
</ul>
|
||||
|
||||
<p>Kenneth Graunke (3):</p>
|
||||
<ul>
|
||||
<li>i965: Add a BRW_MOCS_PTE #define.</li>
|
||||
<li>i965: Use BDW_MOCS_PTE for renderbuffers.</li>
|
||||
<li>i965: Fix register write checks.</li>
|
||||
</ul>
|
||||
|
||||
<p>Marek Olšák (2):</p>
|
||||
<ul>
|
||||
<li>st/mesa: use pipe_sampler_view_release for releasing sampler views</li>
|
||||
<li>glsl_to_tgsi: fix the value of gl_FrontFacing with native integers</li>
|
||||
</ul>
|
||||
|
||||
<p>Michel Dänzer (4):</p>
|
||||
<ul>
|
||||
<li>radeonsi: Clear sampler view flags when binding a buffer</li>
|
||||
<li>r600g,radeonsi: Always use GTT again for PIPE_USAGE_STREAM buffers</li>
|
||||
<li>winsys/radeon: Use separate caching buffer manager for each set of flags</li>
|
||||
<li>r600g: Drop references to destroyed blend state</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@@ -31,9 +31,11 @@ because compatibility contexts are not supported.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<h2>SHA256 checksums</h2>
|
||||
<pre>
|
||||
TBD.
|
||||
9a1bf52040fc3dda81e83a35f944f1c3f532847dbe9fdf57161265cf71ea1bae MesaLib-10.3.0.tar.gz
|
||||
0283bfe710fa449ed82e465cfa09612a269e19abb7e0382082608062ce7960b5 MesaLib-10.3.0.tar.bz2
|
||||
221420763c2c3a244836a736e735612c4a6a0377b4e5223fca1e612f49906789 MesaLib-10.3.0.zip
|
||||
</pre>
|
||||
|
||||
|
||||
|
@@ -681,6 +681,7 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
|
||||
i + 1, EGL_WINDOW_BIT, attr_list, NULL);
|
||||
}
|
||||
|
||||
disp->Extensions.KHR_image_pixmap = EGL_TRUE;
|
||||
if (dri2_dpy->dri2)
|
||||
disp->Extensions.EXT_buffer_age = EGL_TRUE;
|
||||
|
||||
|
@@ -143,6 +143,7 @@ LOCAL_STATIC_LIBRARIES := \
|
||||
libmesa_st_egl \
|
||||
$(gallium_DRIVERS) \
|
||||
libmesa_st_mesa \
|
||||
libmesa_util \
|
||||
libmesa_glsl \
|
||||
libmesa_glsl_utils \
|
||||
libmesa_gallium \
|
||||
|
@@ -30,7 +30,9 @@ include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_SRC_FILES := $(C_SOURCES)
|
||||
|
||||
LOCAL_C_INCLUDES := $(GALLIUM_TOP)/auxiliary/util
|
||||
LOCAL_C_INCLUDES := \
|
||||
$(GALLIUM_TOP)/auxiliary/util \
|
||||
$(MESA_TOP)/src
|
||||
|
||||
LOCAL_MODULE := libmesa_gallium
|
||||
|
||||
|
@@ -1248,8 +1248,24 @@ idiv_emit_cpu(
|
||||
struct lp_build_tgsi_context * bld_base,
|
||||
struct lp_build_emit_data * emit_data)
|
||||
{
|
||||
emit_data->output[emit_data->chan] = lp_build_div(&bld_base->int_bld,
|
||||
emit_data->args[0], emit_data->args[1]);
|
||||
LLVMBuilderRef builder = bld_base->base.gallivm->builder;
|
||||
LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint_bld,
|
||||
PIPE_FUNC_EQUAL, emit_data->args[1],
|
||||
bld_base->uint_bld.zero);
|
||||
/* We want to make sure that we never divide/mod by zero to not
|
||||
* generate sigfpe. We don't want to crash just because the
|
||||
* shader is doing something weird. */
|
||||
LLVMValueRef divisor = LLVMBuildOr(builder,
|
||||
div_mask,
|
||||
emit_data->args[1], "");
|
||||
LLVMValueRef result = lp_build_div(&bld_base->int_bld,
|
||||
emit_data->args[0], divisor);
|
||||
LLVMValueRef not_div_mask = LLVMBuildNot(builder,
|
||||
div_mask,"");
|
||||
/* idiv by zero doesn't have a guaranteed return value chose 0 for now. */
|
||||
emit_data->output[emit_data->chan] = LLVMBuildAnd(builder,
|
||||
not_div_mask,
|
||||
result, "");
|
||||
}
|
||||
|
||||
/* TGSI_OPCODE_INEG (CPU Only) */
|
||||
@@ -1675,15 +1691,15 @@ udiv_emit_cpu(
|
||||
LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint_bld,
|
||||
PIPE_FUNC_EQUAL, emit_data->args[1],
|
||||
bld_base->uint_bld.zero);
|
||||
/* We want to make sure that we never divide/mod by zero to not
|
||||
* generate sigfpe. We don't want to crash just because the
|
||||
/* We want to make sure that we never divide/mod by zero to not
|
||||
* generate sigfpe. We don't want to crash just because the
|
||||
* shader is doing something weird. */
|
||||
LLVMValueRef divisor = LLVMBuildOr(builder,
|
||||
div_mask,
|
||||
emit_data->args[1], "");
|
||||
LLVMValueRef result = lp_build_div(&bld_base->uint_bld,
|
||||
emit_data->args[0], divisor);
|
||||
/* udiv by zero is guaranteed to return 0xffffffff */
|
||||
/* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
|
||||
emit_data->output[emit_data->chan] = LLVMBuildOr(builder,
|
||||
div_mask,
|
||||
result, "");
|
||||
|
@@ -3340,10 +3340,10 @@ micro_idiv(union tgsi_exec_channel *dst,
|
||||
const union tgsi_exec_channel *src0,
|
||||
const union tgsi_exec_channel *src1)
|
||||
{
|
||||
dst->i[0] = src0->i[0] / src1->i[0];
|
||||
dst->i[1] = src0->i[1] / src1->i[1];
|
||||
dst->i[2] = src0->i[2] / src1->i[2];
|
||||
dst->i[3] = src0->i[3] / src1->i[3];
|
||||
dst->i[0] = src1->i[0] ? src0->i[0] / src1->i[0] : 0;
|
||||
dst->i[1] = src1->i[1] ? src0->i[1] / src1->i[1] : 0;
|
||||
dst->i[2] = src1->i[2] ? src0->i[2] / src1->i[2] : 0;
|
||||
dst->i[3] = src1->i[3] ? src0->i[3] / src1->i[3] : 0;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -140,6 +140,7 @@ private:
|
||||
code[(0x##b) / 32] |= 1 << ((0x##b) % 32)
|
||||
|
||||
#define FTZ_(b) if (i->ftz) code[(0x##b) / 32] |= 1 << ((0x##b) % 32)
|
||||
#define DNZ_(b) if (i->dnz) code[(0x##b) / 32] |= 1 << ((0x##b) % 32)
|
||||
|
||||
#define SAT_(b) if (i->saturate) code[(0x##b) / 32] |= 1 << ((0x##b) % 32)
|
||||
|
||||
@@ -464,6 +465,7 @@ CodeEmitterGK110::emitFMAD(const Instruction *i)
|
||||
SAT_(35);
|
||||
RND_(36, F);
|
||||
FTZ_(38);
|
||||
DNZ_(39);
|
||||
|
||||
bool neg1 = (i->src(0).mod ^ i->src(1).mod).neg();
|
||||
|
||||
@@ -487,6 +489,7 @@ CodeEmitterGK110::emitFMUL(const Instruction *i)
|
||||
emitForm_L(i, 0x200, 0x2, Modifier(0));
|
||||
|
||||
FTZ_(38);
|
||||
DNZ_(39);
|
||||
SAT_(3a);
|
||||
if (neg)
|
||||
code[1] ^= 1 << 22;
|
||||
@@ -499,6 +502,7 @@ CodeEmitterGK110::emitFMUL(const Instruction *i)
|
||||
|
||||
RND_(2a, F);
|
||||
FTZ_(2f);
|
||||
DNZ_(30);
|
||||
SAT_(35);
|
||||
|
||||
if (code[0] & 0x1) {
|
||||
|
@@ -432,7 +432,7 @@ CodeEmitterGM107::emitNEG2(int pos, const ValueRef &a, const ValueRef &b)
|
||||
void
|
||||
CodeEmitterGM107::emitFMZ(int pos, int len)
|
||||
{
|
||||
emitField(pos, len, /*XXX: insn->dnz << 1 | */ insn->ftz);
|
||||
emitField(pos, len, insn->dnz << 1 | insn->ftz);
|
||||
}
|
||||
|
||||
void
|
||||
|
@@ -58,6 +58,7 @@ GM107LoweringPass::handleManualTXD(TexInstruction *i)
|
||||
Value *zero = bld.loadImm(bld.getSSA(), 0);
|
||||
int l, c;
|
||||
const int dim = i->tex.target.getDim();
|
||||
const int array = i->tex.target.isArray();
|
||||
|
||||
i->op = OP_TEX; // no need to clone dPdx/dPdy later
|
||||
|
||||
@@ -69,7 +70,7 @@ GM107LoweringPass::handleManualTXD(TexInstruction *i)
|
||||
// mov coordinates from lane l to all lanes
|
||||
bld.mkOp(OP_QUADON, TYPE_NONE, NULL);
|
||||
for (c = 0; c < dim; ++c) {
|
||||
bld.mkOp2(OP_SHFL, TYPE_F32, crd[c], i->getSrc(c), bld.mkImm(l));
|
||||
bld.mkOp2(OP_SHFL, TYPE_F32, crd[c], i->getSrc(c + array), bld.mkImm(l));
|
||||
add = bld.mkOp2(OP_QUADOP, TYPE_F32, crd[c], crd[c], zero);
|
||||
add->subOp = 0x00;
|
||||
add->lanes = 1; /* abused for .ndv */
|
||||
@@ -94,7 +95,7 @@ GM107LoweringPass::handleManualTXD(TexInstruction *i)
|
||||
// texture
|
||||
bld.insert(tex = cloneForward(func, i));
|
||||
for (c = 0; c < dim; ++c)
|
||||
tex->setSrc(c, crd[c]);
|
||||
tex->setSrc(c + array, crd[c]);
|
||||
bld.mkOp(OP_QUADPOP, TYPE_NONE, NULL);
|
||||
|
||||
// save results
|
||||
@@ -158,7 +159,10 @@ GM107LoweringPass::handlePFETCH(Instruction *i)
|
||||
bld.mkOp2(OP_SHR , TYPE_U32, tmp1, tmp0, bld.mkImm(16));
|
||||
bld.mkOp2(OP_AND , TYPE_U32, tmp0, tmp0, bld.mkImm(0xff));
|
||||
bld.mkOp2(OP_AND , TYPE_U32, tmp1, tmp1, bld.mkImm(0xff));
|
||||
bld.mkOp1(OP_MOV , TYPE_U32, tmp2, bld.mkImm(i->getSrc(0)->reg.data.u32));
|
||||
if (i->getSrc(1))
|
||||
bld.mkOp2(OP_ADD , TYPE_U32, tmp2, i->getSrc(0), i->getSrc(1));
|
||||
else
|
||||
bld.mkOp1(OP_MOV , TYPE_U32, tmp2, i->getSrc(0));
|
||||
bld.mkOp3(OP_MAD , TYPE_U32, tmp0, tmp0, tmp1, tmp2);
|
||||
i->setSrc(0, tmp0);
|
||||
i->setSrc(1, NULL);
|
||||
@@ -240,6 +244,20 @@ GM107LoweringPass::visit(Instruction *i)
|
||||
i->op = OP_VFETCH;
|
||||
assert(prog->getType() != Program::TYPE_FRAGMENT); // INTERP
|
||||
}
|
||||
} else if (i->src(0).getFile() == FILE_MEMORY_CONST) {
|
||||
if (i->src(0).isIndirect(1)) {
|
||||
Value *ptr;
|
||||
if (i->src(0).isIndirect(0))
|
||||
ptr = bld.mkOp3v(OP_INSBF, TYPE_U32, bld.getSSA(),
|
||||
i->getIndirect(0, 1), bld.mkImm(0x1010),
|
||||
i->getIndirect(0, 0));
|
||||
else
|
||||
ptr = bld.mkOp2v(OP_SHL, TYPE_U32, bld.getSSA(),
|
||||
i->getIndirect(0, 1), bld.mkImm(16));
|
||||
i->setIndirect(0, 1, NULL);
|
||||
i->setIndirect(0, 0, ptr);
|
||||
i->subOp = NV50_IR_SUBOP_LDC_IS;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case OP_ATOM:
|
||||
|
@@ -607,6 +607,21 @@ NVC0LoweringPass::handleTEX(TexInstruction *i)
|
||||
// lod bias
|
||||
// depth compare
|
||||
// offsets (same as fermi, except txd which takes it with array)
|
||||
//
|
||||
// Maxwell (tex):
|
||||
// array
|
||||
// coords
|
||||
// indirect handle
|
||||
// sample
|
||||
// lod bias
|
||||
// depth compare
|
||||
// offsets
|
||||
//
|
||||
// Maxwell (txd):
|
||||
// indirect handle
|
||||
// coords
|
||||
// array + offsets
|
||||
// derivatives
|
||||
|
||||
if (chipset >= NVISA_GK104_CHIPSET) {
|
||||
if (i->tex.rIndirectSrc >= 0 || i->tex.sIndirectSrc >= 0) {
|
||||
@@ -640,12 +655,17 @@ NVC0LoweringPass::handleTEX(TexInstruction *i)
|
||||
const int sat = (i->op == OP_TXF) ? 1 : 0;
|
||||
DataType sTy = (i->op == OP_TXF) ? TYPE_U32 : TYPE_F32;
|
||||
bld.mkCvt(OP_CVT, TYPE_U16, layer, sTy, src)->saturate = sat;
|
||||
for (int s = dim; s >= 1; --s)
|
||||
i->setSrc(s, i->getSrc(s - 1));
|
||||
i->setSrc(0, layer);
|
||||
if (i->op != OP_TXD || chipset < NVISA_GM107_CHIPSET) {
|
||||
for (int s = dim; s >= 1; --s)
|
||||
i->setSrc(s, i->getSrc(s - 1));
|
||||
i->setSrc(0, layer);
|
||||
} else {
|
||||
i->setSrc(dim, layer);
|
||||
}
|
||||
}
|
||||
// Move the indirect reference to the first place
|
||||
if (i->tex.rIndirectSrc >= 0) {
|
||||
if (i->tex.rIndirectSrc >= 0 && (
|
||||
i->op == OP_TXD || chipset < NVISA_GM107_CHIPSET)) {
|
||||
Value *hnd = i->getIndirectR();
|
||||
|
||||
i->setIndirectR(NULL);
|
||||
@@ -748,8 +768,10 @@ NVC0LoweringPass::handleTEX(TexInstruction *i)
|
||||
// create it if it's not already there, and INSBF it if it already
|
||||
// is.
|
||||
s = (i->tex.rIndirectSrc >= 0) ? 1 : 0;
|
||||
if (chipset >= NVISA_GM107_CHIPSET)
|
||||
s += dim;
|
||||
if (i->tex.target.isArray()) {
|
||||
bld.mkOp3(OP_INSBF, TYPE_U32, i->getSrc(0),
|
||||
bld.mkOp3(OP_INSBF, TYPE_U32, i->getSrc(s),
|
||||
bld.loadImm(NULL, imm), bld.mkImm(0xc10),
|
||||
i->getSrc(s));
|
||||
} else {
|
||||
|
@@ -25,6 +25,7 @@
|
||||
|
||||
#include <stack>
|
||||
#include <limits>
|
||||
#include <tr1/unordered_set>
|
||||
|
||||
namespace nv50_ir {
|
||||
|
||||
@@ -1547,6 +1548,11 @@ SpillCodeInserter::run(const std::list<ValuePair>& lst)
|
||||
LValue *lval = it->first->asLValue();
|
||||
Symbol *mem = it->second ? it->second->asSym() : NULL;
|
||||
|
||||
// Keep track of which instructions to delete later. Deleting them
|
||||
// inside the loop is unsafe since a single instruction may have
|
||||
// multiple destinations that all need to be spilled (like OP_SPLIT).
|
||||
std::tr1::unordered_set<Instruction *> to_del;
|
||||
|
||||
for (Value::DefIterator d = lval->defs.begin(); d != lval->defs.end();
|
||||
++d) {
|
||||
Value *slot = mem ?
|
||||
@@ -1579,7 +1585,7 @@ SpillCodeInserter::run(const std::list<ValuePair>& lst)
|
||||
d = lval->defs.erase(d);
|
||||
--d;
|
||||
if (slot->reg.file == FILE_MEMORY_LOCAL)
|
||||
delete_Instruction(func->getProgram(), defi);
|
||||
to_del.insert(defi);
|
||||
else
|
||||
defi->setDef(0, slot);
|
||||
} else {
|
||||
@@ -1587,6 +1593,9 @@ SpillCodeInserter::run(const std::list<ValuePair>& lst)
|
||||
}
|
||||
}
|
||||
|
||||
for (std::tr1::unordered_set<Instruction *>::const_iterator it = to_del.begin();
|
||||
it != to_del.end(); ++it)
|
||||
delete_Instruction(func->getProgram(), *it);
|
||||
}
|
||||
|
||||
// TODO: We're not trying to reuse old slots in a potential next iteration.
|
||||
@@ -1912,6 +1921,13 @@ RegAlloc::InsertConstraintsPass::texConstraintGM107(TexInstruction *tex)
|
||||
if (isTextureOp(tex->op)) {
|
||||
if (tex->op != OP_TXQ) {
|
||||
s = tex->tex.target.getArgCount() - tex->tex.target.isMS();
|
||||
if (tex->op == OP_TXD) {
|
||||
// Indirect handle belongs in the first arg
|
||||
if (tex->tex.rIndirectSrc >= 0)
|
||||
s++;
|
||||
if (!tex->tex.target.isArray() && tex->tex.useOffsets)
|
||||
s++;
|
||||
}
|
||||
n = tex->srcCount(0xff) - s;
|
||||
} else {
|
||||
s = tex->srcCount(0xff);
|
||||
|
@@ -158,8 +158,10 @@ static void r600_bind_blend_state(struct pipe_context *ctx, void *state)
|
||||
struct r600_context *rctx = (struct r600_context *)ctx;
|
||||
struct r600_blend_state *blend = (struct r600_blend_state *)state;
|
||||
|
||||
if (blend == NULL)
|
||||
if (blend == NULL) {
|
||||
r600_set_cso_state_with_cb(&rctx->blend_state, NULL, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
r600_bind_blend_state_internal(rctx, blend, rctx->force_blend_disable);
|
||||
}
|
||||
@@ -447,8 +449,13 @@ static void r600_delete_sampler_state(struct pipe_context *ctx, void *state)
|
||||
|
||||
static void r600_delete_blend_state(struct pipe_context *ctx, void *state)
|
||||
{
|
||||
struct r600_context *rctx = (struct r600_context *)ctx;
|
||||
struct r600_blend_state *blend = (struct r600_blend_state*)state;
|
||||
|
||||
if (rctx->blend_state.cso == state) {
|
||||
ctx->bind_blend_state(ctx, NULL);
|
||||
}
|
||||
|
||||
r600_release_command_buffer(&blend->buffer);
|
||||
r600_release_command_buffer(&blend->buffer_no_blend);
|
||||
FREE(blend);
|
||||
|
@@ -110,11 +110,13 @@ bool r600_init_resource(struct r600_common_screen *rscreen,
|
||||
enum radeon_bo_flag flags = 0;
|
||||
|
||||
switch (res->b.b.usage) {
|
||||
case PIPE_USAGE_STREAM:
|
||||
flags = RADEON_FLAG_GTT_WC;
|
||||
/* fall through */
|
||||
case PIPE_USAGE_STAGING:
|
||||
/* Transfers are likely to occur more often with these resources. */
|
||||
res->domains = RADEON_DOMAIN_GTT;
|
||||
break;
|
||||
case PIPE_USAGE_STREAM:
|
||||
case PIPE_USAGE_DYNAMIC:
|
||||
/* Older kernels didn't always flush the HDP cache before
|
||||
* CS execution
|
||||
|
@@ -411,6 +411,11 @@ static void si_set_sampler_views(struct pipe_context *ctx,
|
||||
si_set_sampler_view(sctx, shader, SI_FMASK_TEX_OFFSET + slot,
|
||||
NULL, NULL);
|
||||
}
|
||||
} else {
|
||||
samplers->depth_texture_mask &= ~(1 << slot);
|
||||
samplers->compressed_colortex_mask &= ~(1 << slot);
|
||||
si_set_sampler_view(sctx, shader, SI_FMASK_TEX_OFFSET + slot,
|
||||
NULL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -39,6 +39,8 @@ static void si_destroy_context(struct pipe_context *context)
|
||||
|
||||
si_release_all_descriptors(sctx);
|
||||
|
||||
pipe_resource_reference(&sctx->esgs_ring.buffer, NULL);
|
||||
pipe_resource_reference(&sctx->gsvs_ring.buffer, NULL);
|
||||
pipe_resource_reference(&sctx->null_const_buf.buffer, NULL);
|
||||
r600_resource_reference(&sctx->border_color_table, NULL);
|
||||
|
||||
|
@@ -2894,5 +2894,9 @@ out:
|
||||
|
||||
void si_pipe_shader_destroy(struct pipe_context *ctx, struct si_pipe_shader *shader)
|
||||
{
|
||||
if (shader->gs_copy_shader)
|
||||
si_pipe_shader_destroy(ctx, shader->gs_copy_shader);
|
||||
|
||||
r600_resource_reference(&shader->bo, NULL);
|
||||
r600_resource_reference(&shader->scratch_bo, NULL);
|
||||
}
|
||||
|
@@ -2316,9 +2316,10 @@ static void si_delete_shader_selector(struct pipe_context *ctx,
|
||||
|
||||
while (p) {
|
||||
c = p->next_variant;
|
||||
if (sel->type == PIPE_SHADER_GEOMETRY)
|
||||
if (sel->type == PIPE_SHADER_GEOMETRY) {
|
||||
si_pm4_delete_state(sctx, gs, p->pm4);
|
||||
else if (sel->type == PIPE_SHADER_FRAGMENT)
|
||||
si_pm4_delete_state(sctx, vs, p->gs_copy_shader->pm4);
|
||||
} else if (sel->type == PIPE_SHADER_FRAGMENT)
|
||||
si_pm4_delete_state(sctx, ps, p->pm4);
|
||||
else if (p->key.vs.as_es)
|
||||
si_pm4_delete_state(sctx, es, p->pm4);
|
||||
@@ -2331,7 +2332,7 @@ static void si_delete_shader_selector(struct pipe_context *ctx,
|
||||
|
||||
free(sel->tokens);
|
||||
free(sel);
|
||||
}
|
||||
}
|
||||
|
||||
static void si_delete_vs_shader(struct pipe_context *ctx, void *state)
|
||||
{
|
||||
|
@@ -29,14 +29,16 @@ using namespace clover;
|
||||
memory_obj::memory_obj(clover::context &ctx, cl_mem_flags flags,
|
||||
size_t size, void *host_ptr) :
|
||||
context(ctx), _flags(flags),
|
||||
_size(size), _host_ptr(host_ptr),
|
||||
_destroy_notify([]{}) {
|
||||
_size(size), _host_ptr(host_ptr) {
|
||||
if (flags & (CL_MEM_COPY_HOST_PTR | CL_MEM_USE_HOST_PTR))
|
||||
data.append((char *)host_ptr, size);
|
||||
}
|
||||
|
||||
memory_obj::~memory_obj() {
|
||||
_destroy_notify();
|
||||
while (_destroy_notify.size()) {
|
||||
_destroy_notify.top()();
|
||||
_destroy_notify.pop();
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -46,7 +48,7 @@ memory_obj::operator==(const memory_obj &obj) const {
|
||||
|
||||
void
|
||||
memory_obj::destroy_notify(std::function<void ()> f) {
|
||||
_destroy_notify = f;
|
||||
_destroy_notify.push(f);
|
||||
}
|
||||
|
||||
cl_mem_flags
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <stack>
|
||||
|
||||
#include "core/object.hpp"
|
||||
#include "core/queue.hpp"
|
||||
@@ -61,7 +62,7 @@ namespace clover {
|
||||
cl_mem_flags _flags;
|
||||
size_t _size;
|
||||
void *_host_ptr;
|
||||
std::function<void ()> _destroy_notify;
|
||||
std::stack<std::function<void ()>> _destroy_notify;
|
||||
|
||||
protected:
|
||||
std::string data;
|
||||
|
@@ -227,37 +227,6 @@ dri_fill_in_modes(struct dri_screen *screen)
|
||||
return (const __DRIconfig **)configs;
|
||||
}
|
||||
|
||||
/* The Gallium way to force MSAA. */
|
||||
DEBUG_GET_ONCE_NUM_OPTION(msaa, "GALLIUM_MSAA", 0);
|
||||
|
||||
/* The NVIDIA way to force MSAA. The same variable is used by the NVIDIA
|
||||
* driver. */
|
||||
DEBUG_GET_ONCE_NUM_OPTION(msaa_nv, "__GL_FSAA_MODE", 0);
|
||||
|
||||
static void
|
||||
dri_force_msaa_visual(struct st_visual *stvis,
|
||||
struct pipe_screen *screen)
|
||||
{
|
||||
int i;
|
||||
int samples = debug_get_option_msaa();
|
||||
|
||||
if (!samples)
|
||||
samples = debug_get_option_msaa_nv();
|
||||
|
||||
if (samples <= 1)
|
||||
return; /* nothing to do */
|
||||
|
||||
/* Choose a supported sample count greater than or equal to samples. */
|
||||
for (i = samples; i <= MSAA_VISUAL_MAX_SAMPLES; i++) {
|
||||
if (screen->is_format_supported(screen, stvis->color_format,
|
||||
PIPE_TEXTURE_2D, i,
|
||||
PIPE_BIND_RENDER_TARGET)) {
|
||||
stvis->samples = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Roughly the converse of dri_fill_in_modes.
|
||||
*/
|
||||
@@ -282,10 +251,6 @@ dri_fill_st_visual(struct st_visual *stvis, struct dri_screen *screen,
|
||||
if (mode->sampleBuffers) {
|
||||
stvis->samples = mode->samples;
|
||||
}
|
||||
else {
|
||||
/* This must be done after stvis->color_format is set. */
|
||||
dri_force_msaa_visual(stvis, screen->base.screen);
|
||||
}
|
||||
|
||||
switch (mode->depthBits) {
|
||||
default:
|
||||
|
@@ -85,7 +85,7 @@ gbm_gallium_drm_is_format_supported(struct gbm_device *gbm,
|
||||
if (pf == PIPE_FORMAT_NONE)
|
||||
return 0;
|
||||
|
||||
if (!gdrm->screen->is_format_supported(gdrm->screen, PIPE_TEXTURE_2D, pf, 0,
|
||||
if (!gdrm->screen->is_format_supported(gdrm->screen, pf, PIPE_TEXTURE_2D, 0,
|
||||
gbm_usage_to_gallium(usage)))
|
||||
return 0;
|
||||
|
||||
|
@@ -50,8 +50,8 @@
|
||||
HGLRC WINAPI
|
||||
wglCreateContextAttribsARB(HDC hDC, HGLRC hShareContext, const int *attribList)
|
||||
{
|
||||
typedef HGLRC (*wglCreateContext_t)(HDC hdc);
|
||||
typedef BOOL (*wglDeleteContext_t)(HGLRC hglrc);
|
||||
typedef HGLRC (WINAPI *wglCreateContext_t)(HDC hdc);
|
||||
typedef BOOL (WINAPI *wglDeleteContext_t)(HGLRC hglrc);
|
||||
HGLRC context;
|
||||
static HMODULE opengl_lib = 0;
|
||||
static wglCreateContext_t wglCreateContext_func = 0;
|
||||
|
@@ -530,11 +530,22 @@ renderer_draw_yuv(struct xa_context *r,
|
||||
src_x, src_y, src_w, src_h,
|
||||
dst_x, dst_y, dst_w, dst_h, srf);
|
||||
|
||||
if (!r->scissor_valid) {
|
||||
r->scissor.minx = 0;
|
||||
r->scissor.miny = 0;
|
||||
r->scissor.maxx = r->dst->tex->width0;
|
||||
r->scissor.maxy = r->dst->tex->height0;
|
||||
}
|
||||
|
||||
r->pipe->set_scissor_states(r->pipe, 0, 1, &r->scissor);
|
||||
|
||||
cso_set_vertex_elements(r->cso, num_attribs, r->velems);
|
||||
util_draw_user_vertex_buffer(r->cso, r->buffer, PIPE_PRIM_QUADS,
|
||||
4, /* verts */
|
||||
num_attribs); /* attribs/vert */
|
||||
r->buffer_size = 0;
|
||||
|
||||
xa_scissor_reset(r);
|
||||
}
|
||||
|
||||
void
|
||||
|
@@ -146,6 +146,7 @@ xa_yuv_planar_blit(struct xa_context *r,
|
||||
int w = box->x2 - box->x1;
|
||||
int h = box->y2 - box->y1;
|
||||
|
||||
xa_scissor_update(r, x, y, box->x2, box->y2);
|
||||
renderer_draw_yuv(r,
|
||||
(float)src_x + scale_x * (x - dst_x),
|
||||
(float)src_y + scale_y * (y - dst_y),
|
||||
|
@@ -811,17 +811,12 @@ radeon_winsys_bo_create(struct radeon_winsys *rws,
|
||||
desc.flags = flags;
|
||||
|
||||
/* Assign a buffer manager. */
|
||||
assert(flags < RADEON_NUM_CACHE_MANAGERS);
|
||||
if (use_reusable_pool) {
|
||||
if (domain == RADEON_DOMAIN_VRAM) {
|
||||
if (flags & RADEON_FLAG_GTT_WC)
|
||||
provider = ws->cman_vram_gtt_wc;
|
||||
else
|
||||
provider = ws->cman_vram;
|
||||
} else if (flags & RADEON_FLAG_GTT_WC) {
|
||||
provider = ws->cman_gtt_wc;
|
||||
} else {
|
||||
provider = ws->cman_gtt;
|
||||
}
|
||||
if (domain == RADEON_DOMAIN_VRAM)
|
||||
provider = ws->cman_vram[flags];
|
||||
else
|
||||
provider = ws->cman_gtt[flags];
|
||||
} else {
|
||||
provider = ws->kman;
|
||||
}
|
||||
|
@@ -441,6 +441,7 @@ static boolean do_winsys_init(struct radeon_drm_winsys *ws)
|
||||
static void radeon_winsys_destroy(struct radeon_winsys *rws)
|
||||
{
|
||||
struct radeon_drm_winsys *ws = (struct radeon_drm_winsys*)rws;
|
||||
int i;
|
||||
|
||||
if (ws->thread) {
|
||||
ws->kill_thread = 1;
|
||||
@@ -453,10 +454,10 @@ static void radeon_winsys_destroy(struct radeon_winsys *rws)
|
||||
pipe_mutex_destroy(ws->cmask_owner_mutex);
|
||||
pipe_mutex_destroy(ws->cs_stack_lock);
|
||||
|
||||
ws->cman_vram->destroy(ws->cman_vram);
|
||||
ws->cman_vram_gtt_wc->destroy(ws->cman_vram_gtt_wc);
|
||||
ws->cman_gtt->destroy(ws->cman_gtt);
|
||||
ws->cman_gtt_wc->destroy(ws->cman_gtt_wc);
|
||||
for (i = 0; i < RADEON_NUM_CACHE_MANAGERS; i++) {
|
||||
ws->cman_gtt[i]->destroy(ws->cman_gtt[i]);
|
||||
ws->cman_vram[i]->destroy(ws->cman_vram[i]);
|
||||
}
|
||||
ws->kman->destroy(ws->kman);
|
||||
if (ws->gen >= DRV_R600) {
|
||||
radeon_surface_manager_free(ws->surf_man);
|
||||
@@ -643,6 +644,7 @@ PUBLIC struct radeon_winsys *
|
||||
radeon_drm_winsys_create(int fd, radeon_screen_create_t screen_create)
|
||||
{
|
||||
struct radeon_drm_winsys *ws;
|
||||
int i;
|
||||
|
||||
pipe_mutex_lock(fd_tab_mutex);
|
||||
if (!fd_tab) {
|
||||
@@ -671,18 +673,16 @@ radeon_drm_winsys_create(int fd, radeon_screen_create_t screen_create)
|
||||
ws->kman = radeon_bomgr_create(ws);
|
||||
if (!ws->kman)
|
||||
goto fail;
|
||||
ws->cman_vram = pb_cache_manager_create(ws->kman, 1000000, 2.0f, 0);
|
||||
if (!ws->cman_vram)
|
||||
goto fail;
|
||||
ws->cman_vram_gtt_wc = pb_cache_manager_create(ws->kman, 1000000, 2.0f, 0);
|
||||
if (!ws->cman_vram_gtt_wc)
|
||||
goto fail;
|
||||
ws->cman_gtt = pb_cache_manager_create(ws->kman, 1000000, 2.0f, 0);
|
||||
if (!ws->cman_gtt)
|
||||
goto fail;
|
||||
ws->cman_gtt_wc = pb_cache_manager_create(ws->kman, 1000000, 2.0f, 0);
|
||||
if (!ws->cman_gtt_wc)
|
||||
goto fail;
|
||||
|
||||
for (i = 0; i < RADEON_NUM_CACHE_MANAGERS; i++) {
|
||||
ws->cman_vram[i] = pb_cache_manager_create(ws->kman, 1000000, 2.0f, 0);
|
||||
if (!ws->cman_vram[i])
|
||||
goto fail;
|
||||
|
||||
ws->cman_gtt[i] = pb_cache_manager_create(ws->kman, 1000000, 2.0f, 0);
|
||||
if (!ws->cman_gtt[i])
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (ws->gen >= DRV_R600) {
|
||||
ws->surf_man = radeon_surface_manager_new(fd);
|
||||
@@ -737,14 +737,12 @@ radeon_drm_winsys_create(int fd, radeon_screen_create_t screen_create)
|
||||
|
||||
fail:
|
||||
pipe_mutex_unlock(fd_tab_mutex);
|
||||
if (ws->cman_gtt)
|
||||
ws->cman_gtt->destroy(ws->cman_gtt);
|
||||
if (ws->cman_gtt_wc)
|
||||
ws->cman_gtt_wc->destroy(ws->cman_gtt_wc);
|
||||
if (ws->cman_vram)
|
||||
ws->cman_vram->destroy(ws->cman_vram);
|
||||
if (ws->cman_vram_gtt_wc)
|
||||
ws->cman_vram_gtt_wc->destroy(ws->cman_vram_gtt_wc);
|
||||
for (i = 0; i < RADEON_NUM_CACHE_MANAGERS; i++) {
|
||||
if (ws->cman_gtt[i])
|
||||
ws->cman_gtt[i]->destroy(ws->cman_gtt[i]);
|
||||
if (ws->cman_vram[i])
|
||||
ws->cman_vram[i]->destroy(ws->cman_vram[i]);
|
||||
}
|
||||
if (ws->kman)
|
||||
ws->kman->destroy(ws->kman);
|
||||
if (ws->surf_man)
|
||||
|
@@ -41,6 +41,8 @@ enum radeon_generation {
|
||||
DRV_SI
|
||||
};
|
||||
|
||||
#define RADEON_NUM_CACHE_MANAGERS 8
|
||||
|
||||
struct radeon_drm_winsys {
|
||||
struct radeon_winsys base;
|
||||
struct pipe_reference reference;
|
||||
@@ -58,10 +60,8 @@ struct radeon_drm_winsys {
|
||||
uint32_t accel_working2;
|
||||
|
||||
struct pb_manager *kman;
|
||||
struct pb_manager *cman_vram;
|
||||
struct pb_manager *cman_vram_gtt_wc;
|
||||
struct pb_manager *cman_gtt;
|
||||
struct pb_manager *cman_gtt_wc;
|
||||
struct pb_manager *cman_vram[RADEON_NUM_CACHE_MANAGERS];
|
||||
struct pb_manager *cman_gtt[RADEON_NUM_CACHE_MANAGERS];
|
||||
struct radeon_surface_manager *surf_man;
|
||||
|
||||
uint32_t num_cpus; /* Number of CPUs. */
|
||||
|
@@ -39,6 +39,7 @@ LOCAL_SRC_FILES := \
|
||||
$(LIBGLSL_FILES)
|
||||
|
||||
LOCAL_C_INCLUDES := \
|
||||
$(MESA_TOP)/src \
|
||||
$(MESA_TOP)/src/mapi \
|
||||
$(MESA_TOP)/src/mesa
|
||||
|
||||
@@ -59,10 +60,11 @@ LOCAL_SRC_FILES := \
|
||||
$(GLSL_COMPILER_CXX_FILES)
|
||||
|
||||
LOCAL_C_INCLUDES := \
|
||||
$(MESA_TOP)/src \
|
||||
$(MESA_TOP)/src/mapi \
|
||||
$(MESA_TOP)/src/mesa
|
||||
|
||||
LOCAL_STATIC_LIBRARIES := libmesa_glsl libmesa_glsl_utils
|
||||
LOCAL_STATIC_LIBRARIES := libmesa_glsl libmesa_glsl_utils libmesa_util
|
||||
|
||||
LOCAL_MODULE_TAGS := eng
|
||||
LOCAL_MODULE := glsl_compiler
|
||||
|
@@ -3760,7 +3760,7 @@ ast_declarator_list::hir(exec_list *instructions,
|
||||
earlier->data.how_declared == ir_var_declared_in_block) {
|
||||
_mesa_glsl_error(&loc, state,
|
||||
"`%s' has already been redeclared using "
|
||||
"gl_PerVertex", var->name);
|
||||
"gl_PerVertex", earlier->name);
|
||||
}
|
||||
earlier->data.how_declared = ir_var_declared_normally;
|
||||
}
|
||||
@@ -5674,17 +5674,21 @@ ast_interface_block::hir(exec_list *instructions,
|
||||
|
||||
var->data.stream = this->layout.stream;
|
||||
|
||||
/* Examine var name here since var may get deleted in the next call */
|
||||
bool var_is_gl_id = is_gl_identifier(var->name);
|
||||
|
||||
if (redeclaring_per_vertex) {
|
||||
ir_variable *earlier =
|
||||
get_variable_being_redeclared(var, loc, state,
|
||||
true /* allow_all_redeclarations */);
|
||||
if (!is_gl_identifier(var->name) || earlier == NULL) {
|
||||
if (!var_is_gl_id || earlier == NULL) {
|
||||
_mesa_glsl_error(&loc, state,
|
||||
"redeclaration of gl_PerVertex can only "
|
||||
"include built-in variables");
|
||||
} else if (earlier->data.how_declared == ir_var_declared_normally) {
|
||||
_mesa_glsl_error(&loc, state,
|
||||
"`%s' has already been redeclared", var->name);
|
||||
"`%s' has already been redeclared",
|
||||
earlier->name);
|
||||
} else {
|
||||
earlier->data.how_declared = ir_var_declared_in_block;
|
||||
earlier->reinit_interface_type(block_type);
|
||||
|
@@ -965,7 +965,7 @@ glsl_type::std140_size(bool row_major) const
|
||||
if (field_type->is_record() && (i + 1 < this->length))
|
||||
size = glsl_align(size, 16);
|
||||
}
|
||||
size = glsl_align(size, max_align);
|
||||
size = glsl_align(size, MAX2(max_align, 16));
|
||||
return size;
|
||||
}
|
||||
|
||||
|
@@ -111,7 +111,7 @@ is_dereferenced_thing_row_major(const ir_dereference *deref)
|
||||
case GLSL_MATRIX_LAYOUT_COLUMN_MAJOR:
|
||||
return false;
|
||||
case GLSL_MATRIX_LAYOUT_ROW_MAJOR:
|
||||
return matrix || deref->type->is_record();
|
||||
return matrix || deref->type->without_array()->is_record();
|
||||
}
|
||||
|
||||
unreachable("invalid matrix layout");
|
||||
@@ -301,7 +301,14 @@ lower_ubo_reference_visitor::handle_rvalue(ir_rvalue **rvalue)
|
||||
deref = deref_array->array->as_dereference();
|
||||
break;
|
||||
} else {
|
||||
array_stride = deref_array->type->std140_size(row_major);
|
||||
/* Whether or not the field is row-major (because it might be a
|
||||
* bvec2 or something) does not affect the array itself. We need
|
||||
* to know whether an array element in its entirety is row-major.
|
||||
*/
|
||||
const bool array_row_major =
|
||||
is_dereferenced_thing_row_major(deref_array);
|
||||
|
||||
array_stride = deref_array->type->std140_size(array_row_major);
|
||||
array_stride = glsl_align(array_stride, 16);
|
||||
}
|
||||
|
||||
@@ -327,6 +334,15 @@ lower_ubo_reference_visitor::handle_rvalue(ir_rvalue **rvalue)
|
||||
const glsl_type *struct_type = deref_record->record->type;
|
||||
unsigned intra_struct_offset = 0;
|
||||
|
||||
/* glsl_type::std140_base_alignment doesn't grok interfaces. Use
|
||||
* 16-bytes for the alignment because that is the general minimum of
|
||||
* std140.
|
||||
*/
|
||||
const unsigned struct_alignment = struct_type->is_interface()
|
||||
? 16
|
||||
: struct_type->std140_base_alignment(row_major);
|
||||
|
||||
|
||||
for (unsigned int i = 0; i < struct_type->length; i++) {
|
||||
const glsl_type *type = struct_type->fields.structure[i].type;
|
||||
|
||||
@@ -346,6 +362,19 @@ lower_ubo_reference_visitor::handle_rvalue(ir_rvalue **rvalue)
|
||||
deref_record->field) == 0)
|
||||
break;
|
||||
intra_struct_offset += type->std140_size(field_row_major);
|
||||
|
||||
/* If the field just examined was itself a structure, apply rule
|
||||
* #9:
|
||||
*
|
||||
* "The structure may have padding at the end; the base offset
|
||||
* of the member following the sub-structure is rounded up to
|
||||
* the next multiple of the base alignment of the structure."
|
||||
*/
|
||||
if (type->without_array()->is_record()) {
|
||||
intra_struct_offset = glsl_align(intra_struct_offset,
|
||||
struct_alignment);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
const_offset += intra_struct_offset;
|
||||
|
@@ -813,11 +813,15 @@ dri3_alloc_render_buffer(struct glx_screen *glx_screen, Drawable draw,
|
||||
*/
|
||||
|
||||
fence_fd = xshmfence_alloc_shm();
|
||||
if (fence_fd < 0)
|
||||
if (fence_fd < 0) {
|
||||
ErrorMessageF("DRI3 Fence object allocation failure %s\n", strerror(errno));
|
||||
return NULL;
|
||||
}
|
||||
shm_fence = xshmfence_map_shm(fence_fd);
|
||||
if (shm_fence == NULL)
|
||||
if (shm_fence == NULL) {
|
||||
ErrorMessageF("DRI3 Fence object map failure %s\n", strerror(errno));
|
||||
goto no_shm_fence;
|
||||
}
|
||||
|
||||
/* Allocate the image from the driver
|
||||
*/
|
||||
@@ -826,8 +830,10 @@ dri3_alloc_render_buffer(struct glx_screen *glx_screen, Drawable draw,
|
||||
goto no_buffer;
|
||||
|
||||
buffer->cpp = dri3_cpp_for_format(format);
|
||||
if (!buffer->cpp)
|
||||
if (!buffer->cpp) {
|
||||
ErrorMessageF("DRI3 buffer format %d invalid\n", format);
|
||||
goto no_image;
|
||||
}
|
||||
|
||||
if (!psc->is_different_gpu) {
|
||||
buffer->image = (*psc->image->createImage) (psc->driScreen,
|
||||
@@ -838,8 +844,10 @@ dri3_alloc_render_buffer(struct glx_screen *glx_screen, Drawable draw,
|
||||
buffer);
|
||||
pixmap_buffer = buffer->image;
|
||||
|
||||
if (!buffer->image)
|
||||
if (!buffer->image) {
|
||||
ErrorMessageF("DRI3 gpu image creation failure\n");
|
||||
goto no_image;
|
||||
}
|
||||
} else {
|
||||
buffer->image = (*psc->image->createImage) (psc->driScreen,
|
||||
width, height,
|
||||
@@ -847,8 +855,10 @@ dri3_alloc_render_buffer(struct glx_screen *glx_screen, Drawable draw,
|
||||
0,
|
||||
buffer);
|
||||
|
||||
if (!buffer->image)
|
||||
if (!buffer->image) {
|
||||
ErrorMessageF("DRI3 other gpu image creation failure\n");
|
||||
goto no_image;
|
||||
}
|
||||
|
||||
buffer->linear_buffer = (*psc->image->createImage) (psc->driScreen,
|
||||
width, height,
|
||||
@@ -858,19 +868,25 @@ dri3_alloc_render_buffer(struct glx_screen *glx_screen, Drawable draw,
|
||||
buffer);
|
||||
pixmap_buffer = buffer->linear_buffer;
|
||||
|
||||
if (!buffer->linear_buffer)
|
||||
if (!buffer->linear_buffer) {
|
||||
ErrorMessageF("DRI3 gpu linear image creation failure\n");
|
||||
goto no_linear_buffer;
|
||||
}
|
||||
}
|
||||
|
||||
/* X wants the stride, so ask the image for it
|
||||
*/
|
||||
if (!(*psc->image->queryImage)(pixmap_buffer, __DRI_IMAGE_ATTRIB_STRIDE, &stride))
|
||||
if (!(*psc->image->queryImage)(pixmap_buffer, __DRI_IMAGE_ATTRIB_STRIDE, &stride)) {
|
||||
ErrorMessageF("DRI3 get image stride failed\n");
|
||||
goto no_buffer_attrib;
|
||||
}
|
||||
|
||||
buffer->pitch = stride;
|
||||
|
||||
if (!(*psc->image->queryImage)(pixmap_buffer, __DRI_IMAGE_ATTRIB_FD, &buffer_fd))
|
||||
if (!(*psc->image->queryImage)(pixmap_buffer, __DRI_IMAGE_ATTRIB_FD, &buffer_fd)) {
|
||||
ErrorMessageF("DRI3 get image FD failed\n");
|
||||
goto no_buffer_attrib;
|
||||
}
|
||||
|
||||
xcb_dri3_pixmap_from_buffer(c,
|
||||
(pixmap = xcb_generate_id(c)),
|
||||
@@ -910,6 +926,7 @@ no_buffer:
|
||||
xshmfence_unmap_shm(shm_fence);
|
||||
no_shm_fence:
|
||||
close(fence_fd);
|
||||
ErrorMessageF("DRI3 alloc_render_buffer failed\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@@ -221,6 +221,7 @@ DRI_glXUseXFont(struct glx_context *CC, Font font, int first, int count, int lis
|
||||
XGCValues values;
|
||||
unsigned long valuemask;
|
||||
XFontStruct *fs;
|
||||
__GLXDRIdrawable *glxdraw;
|
||||
|
||||
GLint swapbytes, lsbfirst, rowlength;
|
||||
GLint skiprows, skippixels, alignment;
|
||||
@@ -233,6 +234,10 @@ DRI_glXUseXFont(struct glx_context *CC, Font font, int first, int count, int lis
|
||||
dpy = CC->currentDpy;
|
||||
win = CC->currentDrawable;
|
||||
|
||||
glxdraw = GetGLXDRIDrawable(CC->currentDpy, CC->currentDrawable);
|
||||
if (glxdraw)
|
||||
win = glxdraw->xDrawable;
|
||||
|
||||
fs = XQueryFont(dpy, font);
|
||||
if (!fs) {
|
||||
__glXSetError(CC, GL_INVALID_VALUE);
|
||||
|
@@ -115,3 +115,12 @@ GET_HASH_GEN := $(LOCAL_PATH)/main/get_hash_generator.py
|
||||
$(intermediates)/main/get_hash.h: $(glapi)/gl_and_es_API.xml \
|
||||
$(LOCAL_PATH)/main/get_hash_params.py $(GET_HASH_GEN)
|
||||
@$(MESA_PYTHON2) $(GET_HASH_GEN) -f $< > $@
|
||||
|
||||
FORMAT_INFO := $(LOCAL_PATH)/main/format_info.py
|
||||
format_info_deps := \
|
||||
$(LOCAL_PATH)/main/formats.csv \
|
||||
$(LOCAL_PATH)/main/format_parser.py \
|
||||
$(FORMAT_INFO)
|
||||
|
||||
$(intermediates)/main/format_info.c: $(format_info_deps)
|
||||
@$(MESA_PYTHON2) $(FORMAT_INFO) $< > $@
|
||||
|
@@ -32,6 +32,8 @@ LOCAL_PATH := $(call my-dir)
|
||||
# MESA_FILES
|
||||
# X86_FILES
|
||||
include $(LOCAL_PATH)/Makefile.sources
|
||||
SRCDIR :=
|
||||
BUILDDIR :=
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
@@ -55,6 +57,7 @@ endif
|
||||
|
||||
LOCAL_C_INCLUDES := \
|
||||
$(call intermediates-dir-for STATIC_LIBRARIES,libmesa_program,,) \
|
||||
$(MESA_TOP)/src \
|
||||
$(MESA_TOP)/src/mapi \
|
||||
$(MESA_TOP)/src/glsl \
|
||||
$(MESA_TOP)/src/gallium/auxiliary
|
||||
|
@@ -36,11 +36,11 @@ include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := libmesa_glsl_utils
|
||||
|
||||
LOCAL_C_INCLUDES := \
|
||||
$(MESA_TOP)/src \
|
||||
$(MESA_TOP)/src/glsl \
|
||||
$(MESA_TOP)/src/mapi
|
||||
|
||||
LOCAL_SRC_FILES := \
|
||||
main/hash_table.c \
|
||||
main/imports.c \
|
||||
program/prog_hash_table.c \
|
||||
program/symbol_table.c
|
||||
@@ -59,11 +59,11 @@ LOCAL_IS_HOST_MODULE := true
|
||||
LOCAL_CFLAGS := -D_POSIX_C_SOURCE=199309L
|
||||
|
||||
LOCAL_C_INCLUDES := \
|
||||
$(MESA_TOP)/src \
|
||||
$(MESA_TOP)/src/glsl \
|
||||
$(MESA_TOP)/src/mapi
|
||||
|
||||
LOCAL_SRC_FILES := \
|
||||
main/hash_table.c \
|
||||
main/imports.c \
|
||||
program/prog_hash_table.c \
|
||||
program/symbol_table.c
|
||||
|
@@ -32,6 +32,8 @@ LOCAL_PATH := $(call my-dir)
|
||||
# MESA_GALLIUM_FILES.
|
||||
# X86_FILES
|
||||
include $(LOCAL_PATH)/Makefile.sources
|
||||
SRCDIR :=
|
||||
BUILDDIR :=
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
@@ -50,6 +52,7 @@ LOCAL_C_INCLUDES := \
|
||||
$(call intermediates-dir-for STATIC_LIBRARIES,libmesa_program,,) \
|
||||
$(MESA_TOP)/src/gallium/auxiliary \
|
||||
$(MESA_TOP)/src/gallium/include \
|
||||
$(MESA_TOP)/src \
|
||||
$(MESA_TOP)/src/glsl \
|
||||
$(MESA_TOP)/src/mapi
|
||||
|
||||
|
@@ -616,6 +616,8 @@ intel_create_image_from_fds(__DRIscreen *screen,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
intel_setup_image_from_dimensions(image);
|
||||
|
||||
image->planar_format = f;
|
||||
for (i = 0; i < f->nplanes; i++) {
|
||||
index = f->planes[i].buffer_index;
|
||||
|
@@ -2312,9 +2312,13 @@ enum brw_wm_barycentric_interp_mode {
|
||||
#define HSW_MOCS_WB_LLC_WB_ELLC (2 << 1)
|
||||
#define HSW_MOCS_UC_LLC_WB_ELLC (3 << 1)
|
||||
|
||||
/* Broadwell: write-back or write-through; always use all the caches. */
|
||||
#define BDW_MOCS_WB 0x78
|
||||
#define BDW_MOCS_WT 0x58
|
||||
/* Broadwell: these defines always use all available caches (L3, LLC, eLLC),
|
||||
* and let you force write-back (WB) or write-through (WT) caching, or leave
|
||||
* it up to the page table entry (PTE) specified by the kernel.
|
||||
*/
|
||||
#define BDW_MOCS_WB 0x78
|
||||
#define BDW_MOCS_WT 0x58
|
||||
#define BDW_MOCS_PTE 0x18
|
||||
|
||||
#include "intel_chipset.h"
|
||||
|
||||
|
@@ -377,7 +377,7 @@ gen8_update_renderbuffer_surface(struct brw_context *brw,
|
||||
horizontal_alignment(mt) |
|
||||
surface_tiling_mode(tiling);
|
||||
|
||||
surf[1] = SET_FIELD(BDW_MOCS_WT, GEN8_SURFACE_MOCS) | mt->qpitch >> 2;
|
||||
surf[1] = SET_FIELD(BDW_MOCS_PTE, GEN8_SURFACE_MOCS) | mt->qpitch >> 2;
|
||||
|
||||
surf[2] = SET_FIELD(width - 1, GEN7_SURFACE_WIDTH) |
|
||||
SET_FIELD(height - 1, GEN7_SURFACE_HEIGHT);
|
||||
|
@@ -87,6 +87,7 @@ can_do_pipelined_register_writes(struct brw_context *brw)
|
||||
|
||||
/* Check whether the value got written. */
|
||||
drm_intel_bo_map(brw->batch.workaround_bo, false);
|
||||
data = brw->batch.workaround_bo->virtual;
|
||||
bool success = data[offset] == expected_value;
|
||||
drm_intel_bo_unmap(brw->batch.workaround_bo);
|
||||
|
||||
@@ -145,6 +146,7 @@ can_write_oacontrol(struct brw_context *brw)
|
||||
|
||||
/* Check whether the value got written. */
|
||||
drm_intel_bo_map(brw->batch.workaround_bo, false);
|
||||
data = brw->batch.workaround_bo->virtual;
|
||||
bool success = data[offset] == expected_value;
|
||||
drm_intel_bo_unmap(brw->batch.workaround_bo);
|
||||
|
||||
|
@@ -189,6 +189,9 @@ nouveau_context_init(struct gl_context *ctx, gl_api api,
|
||||
ctx->Extensions.NV_texture_env_combine4 = true;
|
||||
ctx->Const.MaxColorAttachments = 1;
|
||||
|
||||
/* This effectively disables 3D textures */
|
||||
ctx->Const.Max3DTextureLevels = 1;
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
@@ -896,7 +896,21 @@ _mesa_generic_nop(void)
|
||||
|
||||
|
||||
/**
|
||||
* Allocate and initialize a new dispatch table.
|
||||
* Special no-op glFlush, see below.
|
||||
*/
|
||||
#if defined(_WIN32)
|
||||
static void GLAPIENTRY
|
||||
nop_glFlush(void)
|
||||
{
|
||||
/* don't record an error like we do in _mesa_generic_nop() */
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* Allocate and initialize a new dispatch table. All the dispatch
|
||||
* function pointers will point at the _mesa_generic_nop() function
|
||||
* which raises GL_INVALID_OPERATION.
|
||||
*/
|
||||
struct _glapi_table *
|
||||
_mesa_alloc_dispatch_table()
|
||||
@@ -916,6 +930,26 @@ _mesa_alloc_dispatch_table()
|
||||
for (i = 0; i < numEntries; i++) {
|
||||
entry[i] = (_glapi_proc) _mesa_generic_nop;
|
||||
}
|
||||
|
||||
#if defined(_WIN32)
|
||||
/* This is a special case for Windows in the event that
|
||||
* wglGetProcAddress is called between glBegin/End().
|
||||
*
|
||||
* The MS opengl32.dll library apparently calls glFlush from
|
||||
* wglGetProcAddress(). If we're inside glBegin/End(), glFlush
|
||||
* will dispatch to _mesa_generic_nop() and we'll generate a
|
||||
* GL_INVALID_OPERATION error.
|
||||
*
|
||||
* The specific case which hits this is piglit's primitive-restart
|
||||
* test which calls glPrimitiveRestartNV() inside glBegin/End. The
|
||||
* first time we call glPrimitiveRestartNV() Piglit's API dispatch
|
||||
* code will try to resolve the function by calling wglGetProcAddress.
|
||||
* This raises GL_INVALID_OPERATION and an assert(glGetError()==0)
|
||||
* will fail causing the test to fail. By suppressing the error, the
|
||||
* assertion passes and the test continues.
|
||||
*/
|
||||
SET_Flush(table, nop_glFlush);
|
||||
#endif
|
||||
}
|
||||
return table;
|
||||
}
|
||||
|
@@ -2100,7 +2100,7 @@ unpack_R8G8B8X8_SRGB(const void *src, GLfloat dst[][4], GLuint n)
|
||||
dst[i][RCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] ) & 0xff );
|
||||
dst[i][GCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 8) & 0xff );
|
||||
dst[i][BCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 16) & 0xff );
|
||||
dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] >> 24 ); /* linear! */
|
||||
dst[i][ACOMP] = 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -203,10 +203,10 @@ descriptor=[
|
||||
[ "COLOR_ARRAY_SIZE", "LOC_CUSTOM, TYPE_INT, 0, NO_EXTRA" ],
|
||||
[ "COLOR_ARRAY_TYPE", "ARRAY_ENUM(VertexAttrib[VERT_ATTRIB_COLOR0].Type), NO_EXTRA" ],
|
||||
[ "COLOR_ARRAY_STRIDE", "ARRAY_INT(VertexAttrib[VERT_ATTRIB_COLOR0].Stride), NO_EXTRA" ],
|
||||
[ "TEXTURE_COORD_ARRAY", "LOC_CUSTOM, TYPE_BOOLEAN, offsetof(struct gl_client_array, Enabled), NO_EXTRA" ],
|
||||
[ "TEXTURE_COORD_ARRAY_SIZE", "LOC_CUSTOM, TYPE_INT, offsetof(struct gl_client_array, Size), NO_EXTRA" ],
|
||||
[ "TEXTURE_COORD_ARRAY_TYPE", "LOC_CUSTOM, TYPE_ENUM, offsetof(struct gl_client_array, Type), NO_EXTRA" ],
|
||||
[ "TEXTURE_COORD_ARRAY_STRIDE", "LOC_CUSTOM, TYPE_INT, offsetof(struct gl_client_array, Stride), NO_EXTRA" ],
|
||||
[ "TEXTURE_COORD_ARRAY", "LOC_CUSTOM, TYPE_BOOLEAN, offsetof(struct gl_vertex_attrib_array, Enabled), NO_EXTRA" ],
|
||||
[ "TEXTURE_COORD_ARRAY_SIZE", "LOC_CUSTOM, TYPE_INT, offsetof(struct gl_vertex_attrib_array, Size), NO_EXTRA" ],
|
||||
[ "TEXTURE_COORD_ARRAY_TYPE", "LOC_CUSTOM, TYPE_ENUM, offsetof(struct gl_vertex_attrib_array, Type), NO_EXTRA" ],
|
||||
[ "TEXTURE_COORD_ARRAY_STRIDE", "LOC_CUSTOM, TYPE_INT, offsetof(struct gl_vertex_attrib_array, Stride), NO_EXTRA" ],
|
||||
|
||||
# GL_ARB_multitexture
|
||||
[ "MAX_TEXTURE_UNITS", "CONTEXT_INT(Const.MaxTextureUnits), NO_EXTRA" ],
|
||||
|
@@ -78,8 +78,8 @@ get_tex_depth(struct gl_context *ctx, GLuint dimensions,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
const GLint width = texImage->Width;
|
||||
const GLint height = texImage->Height;
|
||||
const GLint depth = texImage->Depth;
|
||||
GLint height = texImage->Height;
|
||||
GLint depth = texImage->Depth;
|
||||
GLint img, row;
|
||||
GLfloat *depthRow = malloc(width * sizeof(GLfloat));
|
||||
|
||||
@@ -88,6 +88,11 @@ get_tex_depth(struct gl_context *ctx, GLuint dimensions,
|
||||
return;
|
||||
}
|
||||
|
||||
if (texImage->TexObject->Target == GL_TEXTURE_1D_ARRAY) {
|
||||
depth = height;
|
||||
height = 1;
|
||||
}
|
||||
|
||||
for (img = 0; img < depth; img++) {
|
||||
GLubyte *srcMap;
|
||||
GLint srcRowStride;
|
||||
|
@@ -39,6 +39,8 @@ endef
|
||||
# Import the following variables:
|
||||
# PROGRAM_FILES
|
||||
include $(MESA_TOP)/src/mesa/Makefile.sources
|
||||
SRCDIR :=
|
||||
BUILDDIR :=
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
@@ -71,6 +73,7 @@ $(intermediates)/program/lex.yy.c: $(LOCAL_PATH)/program_lexer.l
|
||||
|
||||
LOCAL_C_INCLUDES := \
|
||||
$(intermediates) \
|
||||
$(MESA_TOP)/src \
|
||||
$(MESA_TOP)/src/mapi \
|
||||
$(MESA_TOP)/src/mesa \
|
||||
$(MESA_TOP)/src/glsl
|
||||
|
@@ -114,7 +114,6 @@ get_src_arg_mask(const struct prog_instruction *inst,
|
||||
read_mask = 0x0;
|
||||
for (comp = 0; comp < 4; ++comp) {
|
||||
const GLuint coord = GET_SWZ(inst->SrcReg[arg].Swizzle, comp);
|
||||
ASSERT(coord < 4);
|
||||
if (channel_mask & (1 << comp) && coord <= SWIZZLE_W)
|
||||
read_mask |= 1 << coord;
|
||||
}
|
||||
@@ -284,11 +283,11 @@ _mesa_remove_dead_code_global(struct gl_program *prog)
|
||||
|
||||
for (comp = 0; comp < 4; comp++) {
|
||||
const GLuint swz = GET_SWZ(inst->SrcReg[j].Swizzle, comp);
|
||||
ASSERT(swz < 4);
|
||||
if ((read_mask & (1 << swz)) == 0)
|
||||
continue;
|
||||
if (swz <= SWIZZLE_W)
|
||||
if (swz <= SWIZZLE_W) {
|
||||
if ((read_mask & (1 << swz)) == 0)
|
||||
continue;
|
||||
tempRead[index][swz] = GL_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -246,21 +246,23 @@ st_bufferobj_data(struct gl_context *ctx,
|
||||
/* BufferData */
|
||||
switch (usage) {
|
||||
case GL_STATIC_DRAW:
|
||||
case GL_STATIC_READ:
|
||||
case GL_STATIC_COPY:
|
||||
default:
|
||||
pipe_usage = PIPE_USAGE_DEFAULT;
|
||||
break;
|
||||
case GL_DYNAMIC_DRAW:
|
||||
case GL_DYNAMIC_READ:
|
||||
case GL_DYNAMIC_COPY:
|
||||
pipe_usage = PIPE_USAGE_DYNAMIC;
|
||||
break;
|
||||
case GL_STREAM_DRAW:
|
||||
case GL_STREAM_READ:
|
||||
case GL_STREAM_COPY:
|
||||
pipe_usage = PIPE_USAGE_STREAM;
|
||||
break;
|
||||
case GL_STATIC_READ:
|
||||
case GL_DYNAMIC_READ:
|
||||
case GL_STREAM_READ:
|
||||
pipe_usage = PIPE_USAGE_STAGING;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -96,6 +96,7 @@ st_bind_surface(struct gl_context *ctx, GLenum target,
|
||||
struct gl_texture_image *texImage,
|
||||
struct pipe_surface *ps)
|
||||
{
|
||||
struct st_context *st = st_context(ctx);
|
||||
struct st_texture_object *stObj;
|
||||
struct st_texture_image *stImage;
|
||||
GLenum internalFormat;
|
||||
@@ -124,7 +125,7 @@ st_bind_surface(struct gl_context *ctx, GLenum target,
|
||||
|
||||
/* FIXME create a non-default sampler view from the pipe_surface? */
|
||||
pipe_resource_reference(&stObj->pt, ps->texture);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
pipe_resource_reference(&stImage->pt, stObj->pt);
|
||||
|
||||
stObj->width0 = ps->width;
|
||||
|
@@ -152,10 +152,11 @@ static void
|
||||
st_DeleteTextureObject(struct gl_context *ctx,
|
||||
struct gl_texture_object *texObj)
|
||||
{
|
||||
struct st_context *st = st_context(ctx);
|
||||
struct st_texture_object *stObj = st_texture_object(texObj);
|
||||
|
||||
pipe_resource_reference(&stObj->pt, NULL);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
st_texture_free_sampler_views(stObj);
|
||||
_mesa_delete_texture_object(ctx, texObj);
|
||||
}
|
||||
@@ -512,7 +513,7 @@ st_AllocTextureImageBuffer(struct gl_context *ctx,
|
||||
/* The parent texture object does not have space for this image */
|
||||
|
||||
pipe_resource_reference(&stObj->pt, NULL);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
|
||||
if (!guess_and_alloc_texture(st, stObj, stImage)) {
|
||||
/* Probably out of memory.
|
||||
@@ -1564,13 +1565,13 @@ st_finalize_texture(struct gl_context *ctx,
|
||||
|
||||
if (!st_obj) {
|
||||
pipe_resource_reference(&stObj->pt, NULL);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
if (st_obj->buffer != stObj->pt) {
|
||||
pipe_resource_reference(&stObj->pt, st_obj->buffer);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
stObj->width0 = stObj->pt->width0 / _mesa_get_format_bytes(tObj->_BufferObjectFormat);
|
||||
stObj->height0 = 1;
|
||||
stObj->depth0 = 1;
|
||||
@@ -1591,7 +1592,7 @@ st_finalize_texture(struct gl_context *ctx,
|
||||
firstImage->pt != stObj->pt &&
|
||||
(!stObj->pt || firstImage->pt->last_level >= stObj->pt->last_level)) {
|
||||
pipe_resource_reference(&stObj->pt, firstImage->pt);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
}
|
||||
|
||||
/* If this texture comes from a window system, there is nothing else to do. */
|
||||
@@ -1639,7 +1640,7 @@ st_finalize_texture(struct gl_context *ctx,
|
||||
* gallium texture now. We'll make a new one below.
|
||||
*/
|
||||
pipe_resource_reference(&stObj->pt, NULL);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
st->dirty.st |= ST_NEW_FRAMEBUFFER;
|
||||
}
|
||||
}
|
||||
|
@@ -124,7 +124,7 @@ st_generate_mipmap(struct gl_context *ctx, GLenum target,
|
||||
|
||||
/* release the old tex (will likely be freed too) */
|
||||
pipe_resource_reference(&oldTex, NULL);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
}
|
||||
else {
|
||||
/* Make sure that the base texture image data is present in the
|
||||
|
@@ -4818,15 +4818,19 @@ emit_wpos(struct st_context *st,
|
||||
* saturating the value to [0,1] does the job.
|
||||
*/
|
||||
static void
|
||||
emit_face_var(struct st_translate *t)
|
||||
emit_face_var(struct gl_context *ctx, struct st_translate *t)
|
||||
{
|
||||
struct ureg_program *ureg = t->ureg;
|
||||
struct ureg_dst face_temp = ureg_DECL_temporary(ureg);
|
||||
struct ureg_src face_input = t->inputs[t->inputMapping[VARYING_SLOT_FACE]];
|
||||
|
||||
/* MOV_SAT face_temp, input[face] */
|
||||
face_temp = ureg_saturate(face_temp);
|
||||
ureg_MOV(ureg, face_temp, face_input);
|
||||
if (ctx->Const.NativeIntegers) {
|
||||
ureg_FSGE(ureg, face_temp, face_input, ureg_imm1f(ureg, 0));
|
||||
}
|
||||
else {
|
||||
/* MOV_SAT face_temp, input[face] */
|
||||
ureg_MOV(ureg, ureg_saturate(face_temp), face_input);
|
||||
}
|
||||
|
||||
/* Use face_temp as face input from here on: */
|
||||
t->inputs[t->inputMapping[VARYING_SLOT_FACE]] = ureg_src(face_temp);
|
||||
@@ -4946,7 +4950,7 @@ st_translate_program(
|
||||
}
|
||||
|
||||
if (proginfo->InputsRead & VARYING_BIT_FACE)
|
||||
emit_face_var(t);
|
||||
emit_face_var(ctx, t);
|
||||
|
||||
/*
|
||||
* Declare output attributes.
|
||||
|
@@ -507,12 +507,14 @@ st_texture_release_sampler_view(struct st_context *st,
|
||||
}
|
||||
|
||||
void
|
||||
st_texture_release_all_sampler_views(struct st_texture_object *stObj)
|
||||
st_texture_release_all_sampler_views(struct st_context *st,
|
||||
struct st_texture_object *stObj)
|
||||
{
|
||||
GLuint i;
|
||||
|
||||
/* XXX This should use sampler_views[i]->pipe, not st->pipe */
|
||||
for (i = 0; i < stObj->num_sampler_views; ++i)
|
||||
pipe_sampler_view_reference(&stObj->sampler_views[i], NULL);
|
||||
pipe_sampler_view_release(st->pipe, &stObj->sampler_views[i]);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -255,7 +255,8 @@ st_texture_release_sampler_view(struct st_context *st,
|
||||
struct st_texture_object *stObj);
|
||||
|
||||
extern void
|
||||
st_texture_release_all_sampler_views(struct st_texture_object *stObj);
|
||||
st_texture_release_all_sampler_views(struct st_context *st,
|
||||
struct st_texture_object *stObj);
|
||||
|
||||
void
|
||||
st_texture_free_sampler_views(struct st_texture_object *stObj);
|
||||
|
@@ -139,7 +139,7 @@ st_vdpau_map_surface(struct gl_context *ctx, GLenum target, GLenum access,
|
||||
texFormat);
|
||||
|
||||
pipe_resource_reference(&stObj->pt, res);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
pipe_resource_reference(&stImage->pt, res);
|
||||
|
||||
u_sampler_view_default_template(&templ, res, res->format);
|
||||
@@ -172,7 +172,7 @@ st_vdpau_unmap_surface(struct gl_context *ctx, GLenum target, GLenum access,
|
||||
struct st_texture_image *stImage = st_texture_image(texImage);
|
||||
|
||||
pipe_resource_reference(&stObj->pt, NULL);
|
||||
st_texture_release_all_sampler_views(stObj);
|
||||
st_texture_release_all_sampler_views(st, stObj);
|
||||
pipe_resource_reference(&stImage->pt, NULL);
|
||||
|
||||
_mesa_dirty_texobj(ctx, texObj);
|
||||
|
@@ -808,11 +808,11 @@ static void
|
||||
FETCH(L8A8_SRGB)(const struct swrast_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLfloat *texel)
|
||||
{
|
||||
const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 2);
|
||||
const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
|
||||
texel[RCOMP] =
|
||||
texel[GCOMP] =
|
||||
texel[BCOMP] = util_format_srgb_8unorm_to_linear_float(src[0]);
|
||||
texel[ACOMP] = UBYTE_TO_FLOAT(src[1]); /* linear */
|
||||
texel[BCOMP] = util_format_srgb_8unorm_to_linear_float(s & 0xff);
|
||||
texel[ACOMP] = UBYTE_TO_FLOAT(s >> 8); /* linear */
|
||||
}
|
||||
|
||||
|
||||
|
@@ -1067,7 +1067,7 @@ void vbo_exec_vtx_init( struct vbo_exec_context *exec )
|
||||
struct gl_client_array *array;
|
||||
array = &arrays[VERT_ATTRIB_FF(i)];
|
||||
array->BufferObj = NULL;
|
||||
_mesa_reference_buffer_object(ctx, &arrays->BufferObj,
|
||||
_mesa_reference_buffer_object(ctx, &array->BufferObj,
|
||||
vbo->currval[VBO_ATTRIB_POS+i].BufferObj);
|
||||
}
|
||||
|
||||
|
102
src/util/Android.mk
Normal file
102
src/util/Android.mk
Normal file
@@ -0,0 +1,102 @@
|
||||
# Mesa 3-D graphics library
|
||||
#
|
||||
# Copyright (C) 2014 Tomasz Figa <tomasz.figa@gmail.com>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the "Software"),
|
||||
# to deal in the Software without restriction, including without limitation
|
||||
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
# and/or sell copies of the Software, and to permit persons to whom the
|
||||
# Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
# DEALINGS IN THE SOFTWARE.
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
include $(LOCAL_PATH)/Makefile.sources
|
||||
|
||||
# ---------------------------------------
|
||||
# Build libmesa_util
|
||||
# ---------------------------------------
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_SRC_FILES := \
|
||||
$(MESA_UTIL_FILES)
|
||||
|
||||
LOCAL_C_INCLUDES := \
|
||||
$(MESA_TOP)/src/mesa \
|
||||
$(MESA_TOP)/src/mapi \
|
||||
$(MESA_TOP)/src
|
||||
|
||||
LOCAL_MODULE := libmesa_util
|
||||
|
||||
# Generated sources
|
||||
|
||||
ifeq ($(LOCAL_MODULE_CLASS),)
|
||||
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
|
||||
endif
|
||||
|
||||
intermediates := $(call local-intermediates-dir)
|
||||
|
||||
# This is the list of auto-generated files: sources and headers
|
||||
sources := $(addprefix $(intermediates)/, $(MESA_UTIL_GENERATED_FILES))
|
||||
|
||||
LOCAL_GENERATED_SOURCES += $(sources)
|
||||
|
||||
FORMAT_SRGB := $(LOCAL_PATH)/format_srgb.py
|
||||
|
||||
$(intermediates)/format_srgb.c: $(FORMAT_SRGB)
|
||||
@$(MESA_PYTHON2) $(FORMAT_SRGB) $< > $@
|
||||
|
||||
include $(MESA_COMMON_MK)
|
||||
include $(BUILD_STATIC_LIBRARY)
|
||||
|
||||
# ---------------------------------------
|
||||
# Build host libmesa_util
|
||||
# ---------------------------------------
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_IS_HOST_MODULE := true
|
||||
LOCAL_CFLAGS := -D_POSIX_C_SOURCE=199309L
|
||||
|
||||
LOCAL_SRC_FILES := \
|
||||
$(MESA_UTIL_FILES)
|
||||
|
||||
LOCAL_C_INCLUDES := \
|
||||
$(MESA_TOP)/src/mesa \
|
||||
$(MESA_TOP)/src/mapi \
|
||||
$(MESA_TOP)/src
|
||||
|
||||
LOCAL_MODULE := libmesa_util
|
||||
|
||||
# Generated sources
|
||||
|
||||
ifeq ($(LOCAL_MODULE_CLASS),)
|
||||
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
|
||||
endif
|
||||
|
||||
intermediates := $(call local-intermediates-dir)
|
||||
|
||||
# This is the list of auto-generated files: sources and headers
|
||||
sources := $(addprefix $(intermediates)/, $(MESA_UTIL_GENERATED_FILES))
|
||||
|
||||
LOCAL_GENERATED_SOURCES += $(sources)
|
||||
|
||||
FORMAT_SRGB := $(LOCAL_PATH)/format_srgb.py
|
||||
|
||||
$(intermediates)/format_srgb.c: $(FORMAT_SRGB)
|
||||
@$(MESA_PYTHON2) $(FORMAT_SRGB) $< > $@
|
||||
|
||||
include $(MESA_COMMON_MK)
|
||||
include $(BUILD_HOST_STATIC_LIBRARY)
|
Reference in New Issue
Block a user