Compare commits
80 Commits
main
...
mesa-7.9-r
Author | SHA1 | Date | |
---|---|---|---|
|
61653b488d | ||
|
7e62335f35 | ||
|
b8a60c84aa | ||
|
9f221e738d | ||
|
5c78e931c2 | ||
|
361084ac4b | ||
|
9409b544cc | ||
|
7261c3973d | ||
|
bb4c9e0969 | ||
|
aa05753059 | ||
|
09085ada5d | ||
|
77cc2a4e17 | ||
|
96085dc41a | ||
|
a128b62a35 | ||
|
b756100892 | ||
|
3ad0279344 | ||
|
97cfa1240c | ||
|
6b0c280660 | ||
|
b437c9102f | ||
|
4ec818ea4a | ||
|
80a6cbfea3 | ||
|
ec2031563a | ||
|
b7d4f08f4e | ||
|
2fc2b89680 | ||
|
b29289a61c | ||
|
728829ab63 | ||
|
9753ee3f3e | ||
|
2db5398449 | ||
|
ee8a96707a | ||
|
22dcee8da2 | ||
|
1b622bfbee | ||
|
2bb2efd7b2 | ||
|
a19f0fb50b | ||
|
8df8bb43c7 | ||
|
d2b6502c93 | ||
|
e68ec2212f | ||
|
c0f82e619c | ||
|
7f95c59509 | ||
|
6f310f379b | ||
|
f279480df2 | ||
|
d382c51a23 | ||
|
cdb3f23d8a | ||
|
8f4c99a9af | ||
|
5285100502 | ||
|
56dc7ca916 | ||
|
902dfdaa86 | ||
|
c98ce41de3 | ||
|
3cdfc62523 | ||
|
2606105cc5 | ||
|
141dbbfc78 | ||
|
e678c3f4e1 | ||
|
1b90889eb4 | ||
|
a9fceb6979 | ||
|
febd353bcd | ||
|
0f1faa9c7b | ||
|
b247620854 | ||
|
d36344f900 | ||
|
202c1279c6 | ||
|
f6e811a7d0 | ||
|
bd009df1cc | ||
|
d6df0cdcca | ||
|
52f6be0688 | ||
|
b73cfde5ce | ||
|
d7500ac4df | ||
|
83917660f1 | ||
|
69f67f5ded | ||
|
a42527be33 | ||
|
d169a67ad1 | ||
|
be16a35438 | ||
|
d46b7c9f6f | ||
|
5d02503467 | ||
|
e3b89388ff | ||
|
d6538baa3b | ||
|
16a023ad7d | ||
|
029eb8e764 | ||
|
71b4054a6c | ||
|
8e8a42ffc5 | ||
|
fd4c6bd135 | ||
|
5d4409e0e5 | ||
|
26e63a431d |
2
Makefile
2
Makefile
@@ -180,7 +180,7 @@ ultrix-gcc:
|
||||
|
||||
# Rules for making release tarballs
|
||||
|
||||
VERSION=7.9-devel
|
||||
VERSION=7.9-rc1
|
||||
DIRECTORY = Mesa-$(VERSION)
|
||||
LIB_NAME = MesaLib-$(VERSION)
|
||||
GLUT_NAME = MesaGLUT-$(VERSION)
|
||||
|
11
configure.ac
11
configure.ac
@@ -1363,7 +1363,7 @@ fi
|
||||
AC_ARG_WITH([egl-platforms],
|
||||
[AS_HELP_STRING([--with-egl-platforms@<:@=DIRS...@:>@],
|
||||
[comma delimited native platforms libEGL supports, e.g.
|
||||
"x11,kms" @<:@default=auto@:>@])],
|
||||
"x11,drm" @<:@default=auto@:>@])],
|
||||
[with_egl_platforms="$withval"],
|
||||
[with_egl_platforms=yes])
|
||||
AC_ARG_WITH([egl-displays],
|
||||
@@ -1376,6 +1376,9 @@ case "$with_egl_platforms" in
|
||||
yes)
|
||||
if test "x$enable_egl" = xyes && test "x$mesa_driver" != xosmesa; then
|
||||
EGL_PLATFORMS="x11"
|
||||
if test "$mesa_driver" = dri; then
|
||||
EGL_PLATFORMS="$EGL_PLATFORMS drm"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
@@ -1518,18 +1521,16 @@ elif test "x$enable_gallium_i965" = xauto; then
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl Gallium Radeon configuration
|
||||
dnl Gallium Radeon r300g configuration
|
||||
dnl
|
||||
AC_ARG_ENABLE([gallium-radeon],
|
||||
[AS_HELP_STRING([--enable-gallium-radeon],
|
||||
[build gallium radeon @<:@default=disabled@:>@])],
|
||||
[enable_gallium_radeon="$enableval"],
|
||||
[enable_gallium_radeon=auto])
|
||||
if test "x$enable_gallium_radeon" = xyes; then
|
||||
if test "x$enable_gallium_radeon" = xyes || test "x$enable_gallium_radeon" = xauto; then
|
||||
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r300"
|
||||
gallium_check_st "radeon/drm" "dri-r300" "xorg-radeon"
|
||||
elif test "x$enable_gallium_radeon" = xauto; then
|
||||
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r300"
|
||||
fi
|
||||
|
||||
dnl
|
||||
|
@@ -72,13 +72,13 @@ drivers will be installed to <code>${libdir}/egl</code>.</p>
|
||||
<li><code>--with-egl-platforms</code>
|
||||
|
||||
<p>List the platforms (window systems) to support. Its argument is a comma
|
||||
seprated string such as <code>--with-egl-platforms=x11,kms</code>. It decides
|
||||
seprated string such as <code>--with-egl-platforms=x11,drm</code>. It decides
|
||||
the platforms a driver may support. The first listed platform is also used by
|
||||
the main library to decide the native platform: the platform the EGL native
|
||||
types such as <code>EGLNativeDisplayType</code> or
|
||||
<code>EGLNativeWindowType</code> defined for.</p>
|
||||
|
||||
<p>The available platforms are <code>x11</code>, <code>kms</code>,
|
||||
<p>The available platforms are <code>x11</code>, <code>drm</code>,
|
||||
<code>fbdev</code>, and <code>gdi</code>. The <code>gdi</code> platform can
|
||||
only be built with SCons.</p>
|
||||
|
||||
|
@@ -9,6 +9,9 @@
|
||||
<center><h1>Mesa fbdev/DRI Drivers</h1></center>
|
||||
<br>
|
||||
|
||||
<h1><center>NOTE: this information is obsolete and will be removed at
|
||||
a future date</center></h1>
|
||||
|
||||
<h1>1. Introduction</h1>
|
||||
|
||||
<p>
|
||||
@@ -22,7 +25,7 @@ Contributors to this project include Jon Smirl, Keith Whitwell and Dave Airlie.
|
||||
|
||||
<p>
|
||||
Applications in the fbdev/DRI environment use
|
||||
the <a href="http://www.nabble.com/file/p15480666/MiniGXL.html"> MiniGLX</a> interface to choose pixel
|
||||
the MiniGLX interface to choose pixel
|
||||
formats, create rendering contexts, etc. It's a subset of the GLX and
|
||||
Xlib interfaces allowing some degree of application portability between
|
||||
the X and X-less environments.
|
||||
@@ -315,8 +318,7 @@ It means that the sample_server process is not running.
|
||||
<h1>5.0 Programming Information</h1>
|
||||
|
||||
<p>
|
||||
OpenGL/Mesa is interfaced to fbdev via the <a href="http://www.nabble.com/file/p15480666/MiniGLX.html">MiniGLX</a>
|
||||
interface.
|
||||
OpenGL/Mesa is interfaced to fbdev via the MiniGLX interface.
|
||||
MiniGLX is a subset of Xlib and GLX API functions which provides just
|
||||
enough functionality to setup OpenGL rendering and respond to simple
|
||||
input events.
|
||||
@@ -332,7 +334,7 @@ This allows some degree of flexibility for software development and testing.
|
||||
However, the MiniGLX API is not binary-compatible with full Xlib/GLX.
|
||||
Some of the structures are different and some macros/functions work
|
||||
differently.
|
||||
See the <code>GL/miniglx.h</code> header file for details.
|
||||
See the GL/miniglx.h header file for details.
|
||||
</p>
|
||||
|
||||
|
||||
|
@@ -11,6 +11,14 @@
|
||||
<H1>News</H1>
|
||||
|
||||
|
||||
<h2>September 27, 2010</h2>
|
||||
|
||||
<p>
|
||||
<a href="relnotes-7.9.0.html">Mesa 7.9.0-rc1</a> is released. This is a
|
||||
release candidate for the 7.9 development release.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>June 16, 2010</h2>
|
||||
|
||||
<p>
|
||||
@@ -1277,7 +1285,6 @@ grateful.
|
||||
<p>
|
||||
</p><h2>March 18, 1999</h2>
|
||||
<p>The new webpages are now online. Enjoy, and let me know if you find any errors.
|
||||
For an eye-candy free version you can use <a href="http://www.mesa3d.org/txt/">http://www.mesa3d.org/txt/</a>.</p>
|
||||
<p>
|
||||
</p><h2>February 16, 1999</h2>
|
||||
<p><a href="http://www.sgi.com/">SGI</a> releases its <a href="http://www.sgi.com/software/opensource/glx/">GLX
|
||||
|
@@ -805,7 +805,7 @@ typedef struct __DRIimageExtensionRec __DRIimageExtension;
|
||||
struct __DRIimageExtensionRec {
|
||||
__DRIextension base;
|
||||
|
||||
__DRIimage *(*createImageFromName)(__DRIcontext *context,
|
||||
__DRIimage *(*createImageFromName)(__DRIscreen *screen,
|
||||
int width, int height, int format,
|
||||
int name, int pitch,
|
||||
void *loaderPrivate);
|
||||
@@ -841,7 +841,7 @@ typedef struct __DRIimageLookupExtensionRec __DRIimageLookupExtension;
|
||||
struct __DRIimageLookupExtensionRec {
|
||||
__DRIextension base;
|
||||
|
||||
__DRIimage *(*lookupEGLImage)(__DRIcontext *context, void *image,
|
||||
__DRIimage *(*lookupEGLImage)(__DRIscreen *screen, void *image,
|
||||
void *loaderPrivate);
|
||||
};
|
||||
|
||||
|
@@ -370,10 +370,9 @@ dri2_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
|
||||
}
|
||||
|
||||
static __DRIimage *
|
||||
dri2_lookup_egl_image(__DRIcontext *context, void *image, void *data)
|
||||
dri2_lookup_egl_image(__DRIscreen *screen, void *image, void *data)
|
||||
{
|
||||
struct dri2_egl_context *dri2_ctx = data;
|
||||
_EGLDisplay *disp = dri2_ctx->base.Resource.Display;
|
||||
_EGLDisplay *disp = data;
|
||||
struct dri2_egl_image *dri2_img;
|
||||
_EGLImage *img;
|
||||
|
||||
@@ -728,7 +727,7 @@ dri2_create_screen(_EGLDisplay *disp)
|
||||
dri2_dpy = disp->DriverData;
|
||||
dri2_dpy->dri_screen =
|
||||
dri2_dpy->dri2->createNewScreen(0, dri2_dpy->fd, dri2_dpy->extensions,
|
||||
&dri2_dpy->driver_configs, dri2_dpy);
|
||||
&dri2_dpy->driver_configs, disp);
|
||||
|
||||
if (dri2_dpy->dri_screen == NULL) {
|
||||
_eglLog(_EGL_WARNING, "DRI2: failed to create dri screen");
|
||||
@@ -1509,7 +1508,6 @@ dri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx,
|
||||
EGLClientBuffer buffer, const EGLint *attr_list)
|
||||
{
|
||||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
|
||||
struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
|
||||
struct dri2_egl_image *dri2_img;
|
||||
unsigned int attachments[1];
|
||||
xcb_drawable_t drawable;
|
||||
@@ -1577,7 +1575,7 @@ dri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx,
|
||||
|
||||
stride = buffers[0].pitch / buffers[0].cpp;
|
||||
dri2_img->dri_image =
|
||||
dri2_dpy->image->createImageFromName(dri2_ctx->dri_context,
|
||||
dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
|
||||
buffers_reply->width,
|
||||
buffers_reply->height,
|
||||
format,
|
||||
@@ -1628,7 +1626,6 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
|
||||
EGLClientBuffer buffer, const EGLint *attr_list)
|
||||
{
|
||||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
|
||||
struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
|
||||
struct dri2_egl_image *dri2_img;
|
||||
EGLint width, height, format, name, stride, pitch, i, err;
|
||||
|
||||
@@ -1697,7 +1694,7 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
|
||||
}
|
||||
|
||||
dri2_img->dri_image =
|
||||
dri2_dpy->image->createImageFromName(dri2_ctx->dri_context,
|
||||
dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
|
||||
width,
|
||||
height,
|
||||
format,
|
||||
|
@@ -57,7 +57,7 @@ EGL_NATIVE_PLATFORM=_EGL_INVALID_PLATFORM
|
||||
ifeq ($(firstword $(EGL_PLATFORMS)),x11)
|
||||
EGL_NATIVE_PLATFORM=_EGL_PLATFORM_X11
|
||||
endif
|
||||
ifeq ($(firstword $(EGL_PLATFORMS)),kms)
|
||||
ifeq ($(firstword $(EGL_PLATFORMS)),drm)
|
||||
EGL_NATIVE_PLATFORM=_EGL_PLATFORM_DRM
|
||||
endif
|
||||
ifeq ($(firstword $(EGL_PLATFORMS)),fbdev)
|
||||
|
@@ -27,7 +27,7 @@ _eglGetNativePlatformFromEnv(void)
|
||||
} egl_platforms[_EGL_NUM_PLATFORMS] = {
|
||||
{ _EGL_PLATFORM_WINDOWS, "gdi" },
|
||||
{ _EGL_PLATFORM_X11, "x11" },
|
||||
{ _EGL_PLATFORM_DRM, "kms" },
|
||||
{ _EGL_PLATFORM_DRM, "drm" },
|
||||
{ _EGL_PLATFORM_FBDEV, "fbdev" }
|
||||
};
|
||||
_EGLPlatformType plat = _EGL_INVALID_PLATFORM;
|
||||
|
@@ -263,6 +263,8 @@ do_clip_tri( struct draw_stage *stage,
|
||||
clipmask &= ~(1<<plane_idx);
|
||||
|
||||
assert(n < MAX_CLIPPED_VERTICES);
|
||||
if (n >= MAX_CLIPPED_VERTICES)
|
||||
return;
|
||||
inlist[n] = inlist[0]; /* prevent rotation of vertices */
|
||||
|
||||
for (i = 1; i <= n; i++) {
|
||||
@@ -272,16 +274,22 @@ do_clip_tri( struct draw_stage *stage,
|
||||
|
||||
if (!IS_NEGATIVE(dp_prev)) {
|
||||
assert(outcount < MAX_CLIPPED_VERTICES);
|
||||
if (outcount >= MAX_CLIPPED_VERTICES)
|
||||
return;
|
||||
outlist[outcount++] = vert_prev;
|
||||
}
|
||||
|
||||
if (DIFFERENT_SIGNS(dp, dp_prev)) {
|
||||
struct vertex_header *new_vert;
|
||||
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES+1);
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES + 1);
|
||||
if (tmpnr >= MAX_CLIPPED_VERTICES + 1)
|
||||
return;
|
||||
new_vert = clipper->stage.tmp[tmpnr++];
|
||||
|
||||
assert(outcount < MAX_CLIPPED_VERTICES);
|
||||
if (outcount >= MAX_CLIPPED_VERTICES)
|
||||
return;
|
||||
outlist[outcount++] = new_vert;
|
||||
|
||||
if (IS_NEGATIVE(dp)) {
|
||||
@@ -321,27 +329,32 @@ do_clip_tri( struct draw_stage *stage,
|
||||
|
||||
/* If flat-shading, copy provoking vertex color to polygon vertex[0]
|
||||
*/
|
||||
if (clipper->flat) {
|
||||
if (stage->draw->rasterizer->flatshade_first) {
|
||||
if (inlist[0] != header->v[0]) {
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES + 1);
|
||||
inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
|
||||
copy_colors(stage, inlist[0], header->v[0]);
|
||||
if (n >= 3) {
|
||||
if (clipper->flat) {
|
||||
if (stage->draw->rasterizer->flatshade_first) {
|
||||
if (inlist[0] != header->v[0]) {
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES + 1);
|
||||
if (tmpnr >= MAX_CLIPPED_VERTICES + 1)
|
||||
return;
|
||||
inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
|
||||
copy_colors(stage, inlist[0], header->v[0]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (inlist[0] != header->v[2]) {
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES + 1);
|
||||
if (tmpnr >= MAX_CLIPPED_VERTICES + 1)
|
||||
return;
|
||||
inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
|
||||
copy_colors(stage, inlist[0], header->v[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (inlist[0] != header->v[2]) {
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES + 1);
|
||||
inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
|
||||
copy_colors(stage, inlist[0], header->v[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Emit the polygon as triangles to the setup stage:
|
||||
*/
|
||||
if (n >= 3)
|
||||
/* Emit the polygon as triangles to the setup stage:
|
||||
*/
|
||||
emit_poly( stage, inlist, n, header );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@@ -76,11 +76,15 @@ lp_build_broadcast_scalar(struct lp_build_context *bld,
|
||||
}
|
||||
else {
|
||||
LLVMValueRef res;
|
||||
/* The shuffle vector is always made of int32 elements */
|
||||
struct lp_type i32_vec_type = lp_type_int_vec(32);
|
||||
i32_vec_type.length = type.length;
|
||||
|
||||
#if HAVE_LLVM >= 0x207
|
||||
res = LLVMBuildInsertElement(bld->builder, bld->undef, scalar,
|
||||
LLVMConstInt(LLVMInt32Type(), 0, 0), "");
|
||||
res = LLVMBuildShuffleVector(bld->builder, res, bld->undef,
|
||||
lp_build_const_int_vec(type, 0), "");
|
||||
lp_build_const_int_vec(i32_vec_type, 0), "");
|
||||
#else
|
||||
/* XXX: The above path provokes a bug in LLVM 2.6 */
|
||||
unsigned i;
|
||||
|
@@ -2703,8 +2703,7 @@ static void aos_to_soa( struct x86_function *func,
|
||||
struct x86_reg aos_input = x86_make_reg( file_REG32, reg_BX );
|
||||
struct x86_reg num_inputs = x86_make_reg( file_REG32, reg_CX );
|
||||
struct x86_reg stride = x86_make_reg( file_REG32, reg_DX );
|
||||
int inner_loop;
|
||||
|
||||
int loop_top, loop_exit_fixup;
|
||||
|
||||
/* Save EBX */
|
||||
x86_push( func, x86_make_reg( file_REG32, reg_BX ) );
|
||||
@@ -2717,8 +2716,11 @@ static void aos_to_soa( struct x86_function *func,
|
||||
x86_mov( func, num_inputs, x86_fn_arg( func, arg_num ) );
|
||||
x86_mov( func, stride, x86_fn_arg( func, arg_stride ) );
|
||||
|
||||
/* do */
|
||||
inner_loop = x86_get_label( func );
|
||||
/* while (num_inputs != 0) */
|
||||
loop_top = x86_get_label( func );
|
||||
x86_cmp_imm( func, num_inputs, 0 );
|
||||
loop_exit_fixup = x86_jcc_forward( func, cc_E );
|
||||
|
||||
{
|
||||
x86_push( func, aos_input );
|
||||
sse_movlps( func, make_xmm( 0 ), x86_make_disp( aos_input, 0 ) );
|
||||
@@ -2750,9 +2752,10 @@ static void aos_to_soa( struct x86_function *func,
|
||||
x86_lea( func, aos_input, x86_make_disp(aos_input, 16) );
|
||||
x86_lea( func, soa_input, x86_make_disp(soa_input, 64) );
|
||||
}
|
||||
/* while --num_inputs */
|
||||
/* --num_inputs */
|
||||
x86_dec( func, num_inputs );
|
||||
x86_jcc( func, cc_NE, inner_loop );
|
||||
x86_jmp( func, loop_top );
|
||||
x86_fixup_fwd_jump( func, loop_exit_fixup );
|
||||
|
||||
/* Restore EBX */
|
||||
x86_pop( func, x86_make_reg( file_REG32, reg_BX ) );
|
||||
|
@@ -262,19 +262,20 @@ tgsi_util_get_inst_usage_mask(const struct tgsi_full_instruction *inst,
|
||||
case TGSI_OPCODE_TXL:
|
||||
case TGSI_OPCODE_TXP:
|
||||
if (src_idx == 0) {
|
||||
/* Note that the SHADOW variants use the Z component too */
|
||||
switch (inst->Texture.Texture) {
|
||||
case TGSI_TEXTURE_1D:
|
||||
case TGSI_TEXTURE_SHADOW1D:
|
||||
read_mask = TGSI_WRITEMASK_X;
|
||||
break;
|
||||
|
||||
case TGSI_TEXTURE_SHADOW1D:
|
||||
read_mask = TGSI_WRITEMASK_XZ;
|
||||
break;
|
||||
case TGSI_TEXTURE_2D:
|
||||
case TGSI_TEXTURE_RECT:
|
||||
case TGSI_TEXTURE_SHADOW2D:
|
||||
case TGSI_TEXTURE_SHADOWRECT:
|
||||
read_mask = TGSI_WRITEMASK_XY;
|
||||
break;
|
||||
|
||||
case TGSI_TEXTURE_SHADOW2D:
|
||||
case TGSI_TEXTURE_SHADOWRECT:
|
||||
case TGSI_TEXTURE_3D:
|
||||
case TGSI_TEXTURE_CUBE:
|
||||
read_mask = TGSI_WRITEMASK_XYZ;
|
||||
|
@@ -268,7 +268,7 @@ void util_blitter_destroy(struct blitter_context *blitter)
|
||||
pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]);
|
||||
}
|
||||
|
||||
for (i = 0; i <= PIPE_MAX_COLOR_BUFS && ctx->fs_col[i]; i++)
|
||||
for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++)
|
||||
if (ctx->fs_col[i])
|
||||
pipe->delete_fs_state(pipe, ctx->fs_col[i]);
|
||||
|
||||
|
@@ -82,6 +82,7 @@ util_check_caps_out(struct pipe_screen *screen, const unsigned *list, int *out)
|
||||
*out = i - 3;
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case UTIL_CAPS_CHECK_UNIMPLEMENTED:
|
||||
*out = i - 1;
|
||||
return FALSE;
|
||||
|
@@ -394,7 +394,7 @@ util_pack_color(const float rgba[4], enum pipe_format format, union util_color *
|
||||
return;
|
||||
case PIPE_FORMAT_B4G4R4A4_UNORM:
|
||||
{
|
||||
uc->ub = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | (b >> 4);
|
||||
uc->us = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | (b >> 4);
|
||||
}
|
||||
return;
|
||||
case PIPE_FORMAT_A8_UNORM:
|
||||
|
@@ -46,6 +46,8 @@
|
||||
do { \
|
||||
(elem)->next->prev = (elem)->prev; \
|
||||
(elem)->prev->next = (elem)->next; \
|
||||
(elem)->next = elem; \
|
||||
(elem)->prev = elem; \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
|
@@ -332,7 +332,7 @@ util_clear_depth_stencil(struct pipe_context *pipe,
|
||||
uint32_t *row = (uint32_t *)dst_map;
|
||||
for (j = 0; j < width; j++) {
|
||||
uint32_t tmp = *row & dst_mask;
|
||||
*row++ = tmp & (zstencil & ~dst_mask);
|
||||
*row++ = tmp | (zstencil & ~dst_mask);
|
||||
}
|
||||
dst_map += dst_stride;
|
||||
}
|
||||
|
@@ -155,12 +155,9 @@ llvmpipe_create_context( struct pipe_screen *screen, void *priv )
|
||||
draw_install_aapoint_stage(llvmpipe->draw, &llvmpipe->pipe);
|
||||
draw_install_pstipple_stage(llvmpipe->draw, &llvmpipe->pipe);
|
||||
|
||||
/* convert points and lines into triangles:
|
||||
* (otherwise, draw points and lines natively)
|
||||
*/
|
||||
draw_wide_point_sprites(llvmpipe->draw, FALSE);
|
||||
draw_enable_point_sprites(llvmpipe->draw, FALSE);
|
||||
draw_wide_point_threshold(llvmpipe->draw, 10000.0);
|
||||
/* convert points/sprites into triangles. Draw non-AA lines natively */
|
||||
draw_wide_point_sprites(llvmpipe->draw, TRUE);
|
||||
draw_enable_point_sprites(llvmpipe->draw, TRUE);
|
||||
draw_wide_line_threshold(llvmpipe->draw, 10000.0);
|
||||
|
||||
#if USE_DRAW_STAGE_PSTIPPLE
|
||||
|
@@ -92,8 +92,9 @@ llvmpipe_get_query_result(struct pipe_context *pipe,
|
||||
int i;
|
||||
|
||||
if (!pq->fence) {
|
||||
assert(0); /* query not in issued state */
|
||||
return FALSE;
|
||||
/* no fence because there was no scene, so results is zero */
|
||||
*result = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (!lp_fence_signalled(pq->fence)) {
|
||||
|
@@ -292,6 +292,7 @@ try_setup_line( struct lp_setup_context *setup,
|
||||
float x2diff;
|
||||
float y2diff;
|
||||
float dx, dy;
|
||||
float area;
|
||||
|
||||
boolean draw_start;
|
||||
boolean draw_end;
|
||||
@@ -311,6 +312,18 @@ try_setup_line( struct lp_setup_context *setup,
|
||||
|
||||
dx = v1[0][0] - v2[0][0];
|
||||
dy = v1[0][1] - v2[0][1];
|
||||
area = (dx * dx + dy * dy);
|
||||
if (area == 0) {
|
||||
LP_COUNT(nr_culled_tris);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
info.oneoverarea = 1.0f / area;
|
||||
info.dx = dx;
|
||||
info.dy = dy;
|
||||
info.v1 = v1;
|
||||
info.v2 = v2;
|
||||
|
||||
|
||||
/* X-MAJOR LINE */
|
||||
if (fabsf(dx) >= fabsf(dy)) {
|
||||
@@ -573,12 +586,6 @@ try_setup_line( struct lp_setup_context *setup,
|
||||
line->plane[3].dcdx = y[3] - y[0];
|
||||
|
||||
|
||||
info.oneoverarea = 1.0f / (dx * dx + dy * dy);
|
||||
info.dx = dx;
|
||||
info.dy = dy;
|
||||
info.v1 = v1;
|
||||
info.v2 = v2;
|
||||
|
||||
/* Setup parameter interpolants:
|
||||
*/
|
||||
setup_line_coefficients( setup, line, &info);
|
||||
|
@@ -447,8 +447,10 @@ do_triangle_ccw(struct lp_setup_context *setup,
|
||||
static INLINE uint32_t
|
||||
floor_pot(uint32_t n)
|
||||
{
|
||||
assert(n);
|
||||
#if defined(PIPE_CC_GCC) && defined(PIPE_ARCH_X86)
|
||||
if (n == 0)
|
||||
return 0;
|
||||
|
||||
__asm__("bsr %1,%0"
|
||||
: "=r" (n)
|
||||
: "rm" (n));
|
||||
|
@@ -39,5 +39,6 @@ EXTRA_OBJECTS = \
|
||||
|
||||
include ../../Makefile.template
|
||||
|
||||
.PHONY: $(COMPILER_ARCHIVE)
|
||||
$(COMPILER_ARCHIVE):
|
||||
$(MAKE) -C $(TOP)/src/mesa/drivers/dri/r300/compiler
|
||||
|
@@ -263,10 +263,6 @@ static void r300_clear(struct pipe_context* pipe,
|
||||
zstex->hiz_in_use[fb->zsbuf->level])) {
|
||||
r300->hyperz_state.dirty = TRUE;
|
||||
}
|
||||
|
||||
/* XXX this flush "fixes" a hardlock in the cubestorm xscreensaver */
|
||||
if (r300->flush_counter == 0)
|
||||
pipe->flush(pipe, 0, NULL);
|
||||
}
|
||||
|
||||
/* Clear a region of a color surface to a constant value. */
|
||||
|
@@ -162,7 +162,6 @@ struct r300_sampler_state {
|
||||
|
||||
uint32_t filter0; /* R300_TX_FILTER0: 0x4400 */
|
||||
uint32_t filter1; /* R300_TX_FILTER1: 0x4440 */
|
||||
uint32_t border_color; /* R300_TX_BORDER_COLOR: 0x45c0 */
|
||||
|
||||
/* Min/max LOD must be clamped to [0, last_level], thus
|
||||
* it's dependent on a currently bound texture */
|
||||
@@ -457,6 +456,7 @@ struct r300_context {
|
||||
size_t draw_vbo_size;
|
||||
/* Whether the VBO must not be flushed. */
|
||||
boolean draw_vbo_locked;
|
||||
boolean draw_first_emitted;
|
||||
|
||||
/* Accelerated blit support. */
|
||||
struct blitter_context* blitter;
|
||||
|
@@ -753,6 +753,7 @@ static void r300_swtcl_draw_vbo(struct pipe_context* pipe,
|
||||
draw_set_mapped_index_buffer(r300->draw, indices);
|
||||
|
||||
r300->draw_vbo_locked = TRUE;
|
||||
r300->draw_first_emitted = FALSE;
|
||||
draw_vbo(r300->draw, info);
|
||||
draw_flush(r300->draw);
|
||||
r300->draw_vbo_locked = FALSE;
|
||||
@@ -907,10 +908,17 @@ static void r300_render_draw_arrays(struct vbuf_render* render,
|
||||
|
||||
DBG(r300, DBG_DRAW, "r300: render_draw_arrays (count: %d)\n", count);
|
||||
|
||||
if (!r300_emit_states(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL,
|
||||
NULL, 0, 0))
|
||||
return;
|
||||
if (r300->draw_first_emitted) {
|
||||
if (!r300_prepare_for_rendering(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL,
|
||||
NULL, 6, 0, 0))
|
||||
return;
|
||||
} else {
|
||||
if (!r300_emit_states(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL,
|
||||
NULL, 0, 0))
|
||||
return;
|
||||
}
|
||||
|
||||
/* Uncomment to dump all VBOs rendered through this interface.
|
||||
* Slow and noisy!
|
||||
@@ -937,6 +945,8 @@ static void r300_render_draw_arrays(struct vbuf_render* render,
|
||||
OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST | (count << 16) |
|
||||
r300render->hwprim);
|
||||
END_CS;
|
||||
|
||||
r300->draw_first_emitted = TRUE;
|
||||
}
|
||||
|
||||
static void r300_render_draw_elements(struct vbuf_render* render,
|
||||
@@ -955,10 +965,17 @@ static void r300_render_draw_elements(struct vbuf_render* render,
|
||||
CS_LOCALS(r300);
|
||||
DBG(r300, DBG_DRAW, "r300: render_draw_elements (count: %d)\n", count);
|
||||
|
||||
if (!r300_emit_states(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL | PREP_INDEXED,
|
||||
NULL, 0, 0))
|
||||
return;
|
||||
if (r300->draw_first_emitted) {
|
||||
if (!r300_prepare_for_rendering(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL | PREP_INDEXED,
|
||||
NULL, 256, 0, 0))
|
||||
return;
|
||||
} else {
|
||||
if (!r300_emit_states(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL | PREP_INDEXED,
|
||||
NULL, 0, 0))
|
||||
return;
|
||||
}
|
||||
|
||||
/* Below we manage the CS space manually because there may be more
|
||||
* indices than it can fit in CS. */
|
||||
@@ -999,6 +1016,8 @@ static void r300_render_draw_elements(struct vbuf_render* render,
|
||||
end_cs_dwords = r300_get_num_cs_end_dwords(r300);
|
||||
}
|
||||
}
|
||||
|
||||
r300->draw_first_emitted = TRUE;
|
||||
}
|
||||
|
||||
static void r300_render_destroy(struct vbuf_render* render)
|
||||
|
@@ -1171,7 +1171,6 @@ static void*
|
||||
struct r300_sampler_state* sampler = CALLOC_STRUCT(r300_sampler_state);
|
||||
boolean is_r500 = r300->screen->caps.is_r500;
|
||||
int lod_bias;
|
||||
union util_color uc;
|
||||
|
||||
sampler->state = *state;
|
||||
|
||||
@@ -1228,9 +1227,6 @@ static void*
|
||||
sampler->filter1 |= r500_anisotropy(state->max_anisotropy);
|
||||
}
|
||||
|
||||
util_pack_color(state->border_color, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
|
||||
sampler->border_color = uc.ui;
|
||||
|
||||
/* R500-specific fixups and optimizations */
|
||||
if (r300->screen->caps.is_r500) {
|
||||
sampler->filter1 |= R500_BORDER_FIX;
|
||||
|
@@ -567,6 +567,85 @@ static void r300_update_rs_block(struct r300_context *r300)
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t r300_get_border_color(enum pipe_format format,
|
||||
const unsigned char swizzle_view[4],
|
||||
const float border[4])
|
||||
{
|
||||
const struct util_format_description *desc;
|
||||
unsigned char swizzle[4];
|
||||
unsigned i;
|
||||
float border_swizzled[4];
|
||||
uint32_t r;
|
||||
|
||||
desc = util_format_description(format);
|
||||
|
||||
/* Combine the swizzles. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
swizzle[i] = swizzle_view[i] <= UTIL_FORMAT_SWIZZLE_W ?
|
||||
desc->swizzle[swizzle_view[i]] : swizzle_view[i];
|
||||
}
|
||||
|
||||
/* Apply swizzling. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
switch (swizzle[i]) {
|
||||
case UTIL_FORMAT_SWIZZLE_X:
|
||||
border_swizzled[i] = border[0];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_Y:
|
||||
border_swizzled[i] = border[1];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_Z:
|
||||
border_swizzled[i] = border[2];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_W:
|
||||
border_swizzled[i] = border[3];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_0:
|
||||
border_swizzled[i] = 0;
|
||||
break;
|
||||
default: /* 1, NONE */
|
||||
border_swizzled[i] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* We don't use util_pack_format because it does not handle the formats
|
||||
* we want, e.g. R4G4B4A4 is non-existent in Gallium. */
|
||||
switch (desc->channel[0].size) {
|
||||
case 4:
|
||||
r = ((float_to_ubyte(border_swizzled[0]) & 0xf0) >> 4) |
|
||||
((float_to_ubyte(border_swizzled[1]) & 0xf0) << 0) |
|
||||
((float_to_ubyte(border_swizzled[2]) & 0xf0) << 4) |
|
||||
((float_to_ubyte(border_swizzled[3]) & 0xf0) << 8);
|
||||
break;
|
||||
|
||||
case 5:
|
||||
if (desc->channel[1].size == 5) {
|
||||
r = ((float_to_ubyte(border_swizzled[0]) & 0xf8) >> 3) |
|
||||
((float_to_ubyte(border_swizzled[1]) & 0xf8) << 2) |
|
||||
((float_to_ubyte(border_swizzled[2]) & 0xf8) << 7) |
|
||||
((float_to_ubyte(border_swizzled[3]) & 0x80) << 8);
|
||||
} else if (desc->channel[1].size == 6) {
|
||||
r = ((float_to_ubyte(border_swizzled[0]) & 0xf8) >> 3) |
|
||||
((float_to_ubyte(border_swizzled[1]) & 0xfc) << 3) |
|
||||
((float_to_ubyte(border_swizzled[2]) & 0xf8) << 8);
|
||||
} else {
|
||||
assert(0);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/* I think the fat formats (16, 32) are specified
|
||||
* as the 8-bit ones. I am not sure how compressed formats
|
||||
* work here. */
|
||||
r = ((float_to_ubyte(border_swizzled[0]) & 0xff) << 0) |
|
||||
((float_to_ubyte(border_swizzled[1]) & 0xff) << 8) |
|
||||
((float_to_ubyte(border_swizzled[2]) & 0xff) << 16) |
|
||||
((float_to_ubyte(border_swizzled[3]) & 0xff) << 24);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static void r300_merge_textures_and_samplers(struct r300_context* r300)
|
||||
{
|
||||
struct r300_textures_state *state =
|
||||
@@ -599,7 +678,11 @@ static void r300_merge_textures_and_samplers(struct r300_context* r300)
|
||||
texstate->format = view->format;
|
||||
texstate->filter0 = sampler->filter0;
|
||||
texstate->filter1 = sampler->filter1;
|
||||
texstate->border_color = sampler->border_color;
|
||||
|
||||
/* Set the border color. */
|
||||
texstate->border_color =
|
||||
r300_get_border_color(view->base.format, view->swizzle,
|
||||
sampler->state.border_color);
|
||||
|
||||
/* determine min/max levels */
|
||||
max_level = MIN3(sampler->max_lod + view->base.first_level,
|
||||
|
@@ -256,7 +256,7 @@ static void r300_setup_miptree(struct r300_screen *screen,
|
||||
{
|
||||
struct pipe_resource *base = &desc->b.b;
|
||||
unsigned stride, size, layer_size, nblocksy, i;
|
||||
boolean rv350_mode = screen->caps.is_rv350;
|
||||
boolean rv350_mode = screen->caps.family >= CHIP_FAMILY_R350;
|
||||
boolean aligned_for_cbzb;
|
||||
|
||||
desc->size_in_bytes = 0;
|
||||
@@ -351,7 +351,7 @@ static void r300_setup_tiling(struct r300_screen *screen,
|
||||
{
|
||||
struct r300_winsys_screen *rws = screen->rws;
|
||||
enum pipe_format format = desc->b.b.format;
|
||||
boolean rv350_mode = screen->caps.is_rv350;
|
||||
boolean rv350_mode = screen->caps.family >= CHIP_FAMILY_R350;
|
||||
boolean is_zb = util_format_is_depth_or_stencil(format);
|
||||
boolean dbg_no_tiling = SCREEN_DBG_ON(screen, DBG_NO_TILING);
|
||||
|
||||
|
@@ -203,7 +203,7 @@ svga_tgsi_translate( const struct svga_shader *shader,
|
||||
emit.imm_start += key.vkey.num_zero_stride_vertex_elements;
|
||||
}
|
||||
|
||||
emit.nr_hw_const = (emit.imm_start + emit.info.file_max[TGSI_FILE_IMMEDIATE] + 1);
|
||||
emit.nr_hw_float_const = (emit.imm_start + emit.info.file_max[TGSI_FILE_IMMEDIATE] + 1);
|
||||
|
||||
emit.nr_hw_temp = emit.info.file_max[TGSI_FILE_TEMPORARY] + 1;
|
||||
emit.in_main_func = TRUE;
|
||||
|
@@ -62,7 +62,8 @@ struct svga_shader_emitter
|
||||
|
||||
int imm_start;
|
||||
|
||||
int nr_hw_const;
|
||||
int nr_hw_float_const;
|
||||
int nr_hw_int_const;
|
||||
int nr_hw_temp;
|
||||
|
||||
int insn_offset;
|
||||
|
@@ -197,22 +197,37 @@ translate_src_register( const struct svga_shader_emitter *emit,
|
||||
break;
|
||||
}
|
||||
|
||||
/* Indirect addressing (for coninstant buffer lookups only)
|
||||
/* Indirect addressing.
|
||||
*/
|
||||
if (reg->Register.Indirect)
|
||||
{
|
||||
/* we shift the offset towards the minimum */
|
||||
if (svga_arl_needs_adjustment( emit )) {
|
||||
src.base.num -= svga_arl_adjustment( emit );
|
||||
if (reg->Register.Indirect) {
|
||||
if (emit->unit == PIPE_SHADER_FRAGMENT) {
|
||||
/* Pixel shaders have only loop registers for relative
|
||||
* addressing into inputs. Ignore the redundant address
|
||||
* register, the contents of aL should be in sync with it.
|
||||
*/
|
||||
if (reg->Register.File == TGSI_FILE_INPUT) {
|
||||
src.base.relAddr = 1;
|
||||
src.indirect = src_token(SVGA3DREG_LOOP, 0);
|
||||
}
|
||||
}
|
||||
src.base.relAddr = 1;
|
||||
else {
|
||||
/* Constant buffers only.
|
||||
*/
|
||||
if (reg->Register.File == TGSI_FILE_CONSTANT) {
|
||||
/* we shift the offset towards the minimum */
|
||||
if (svga_arl_needs_adjustment( emit )) {
|
||||
src.base.num -= svga_arl_adjustment( emit );
|
||||
}
|
||||
src.base.relAddr = 1;
|
||||
|
||||
/* Not really sure what should go in the second token:
|
||||
*/
|
||||
src.indirect = src_token( SVGA3DREG_ADDR,
|
||||
reg->Indirect.Index );
|
||||
/* Not really sure what should go in the second token:
|
||||
*/
|
||||
src.indirect = src_token( SVGA3DREG_ADDR,
|
||||
reg->Indirect.Index );
|
||||
|
||||
src.indirect.swizzle = SWIZZLE_XXXX;
|
||||
src.indirect.swizzle = SWIZZLE_XXXX;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
src = swizzle( src,
|
||||
@@ -538,7 +553,7 @@ static boolean emit_def_const( struct svga_shader_emitter *emit,
|
||||
static INLINE boolean
|
||||
create_zero_immediate( struct svga_shader_emitter *emit )
|
||||
{
|
||||
unsigned idx = emit->nr_hw_const++;
|
||||
unsigned idx = emit->nr_hw_float_const++;
|
||||
|
||||
if (!emit_def_const( emit, SVGA3D_CONST_TYPE_FLOAT,
|
||||
idx, 0, 0, 0, 1 ))
|
||||
@@ -553,7 +568,7 @@ create_zero_immediate( struct svga_shader_emitter *emit )
|
||||
static INLINE boolean
|
||||
create_loop_const( struct svga_shader_emitter *emit )
|
||||
{
|
||||
unsigned idx = emit->nr_hw_const++;
|
||||
unsigned idx = emit->nr_hw_int_const++;
|
||||
|
||||
if (!emit_def_const( emit, SVGA3D_CONST_TYPE_INT, idx,
|
||||
255, /* iteration count */
|
||||
@@ -571,7 +586,7 @@ create_loop_const( struct svga_shader_emitter *emit )
|
||||
static INLINE boolean
|
||||
create_sincos_consts( struct svga_shader_emitter *emit )
|
||||
{
|
||||
unsigned idx = emit->nr_hw_const++;
|
||||
unsigned idx = emit->nr_hw_float_const++;
|
||||
|
||||
if (!emit_def_const( emit, SVGA3D_CONST_TYPE_FLOAT, idx,
|
||||
-1.5500992e-006f,
|
||||
@@ -581,7 +596,7 @@ create_sincos_consts( struct svga_shader_emitter *emit )
|
||||
return FALSE;
|
||||
|
||||
emit->sincos_consts_idx = idx;
|
||||
idx = emit->nr_hw_const++;
|
||||
idx = emit->nr_hw_float_const++;
|
||||
|
||||
if (!emit_def_const( emit, SVGA3D_CONST_TYPE_FLOAT, idx,
|
||||
-0.020833334f,
|
||||
@@ -602,7 +617,7 @@ create_arl_consts( struct svga_shader_emitter *emit )
|
||||
|
||||
for (i = 0; i < emit->num_arl_consts; i += 4) {
|
||||
int j;
|
||||
unsigned idx = emit->nr_hw_const++;
|
||||
unsigned idx = emit->nr_hw_float_const++;
|
||||
float vals[4];
|
||||
for (j = 0; j < 4 && (j + i) < emit->num_arl_consts; ++j) {
|
||||
vals[j] = emit->arl_consts[i + j].number;
|
||||
@@ -1593,6 +1608,14 @@ static boolean emit_arl(struct svga_shader_emitter *emit,
|
||||
const struct tgsi_full_instruction *insn)
|
||||
{
|
||||
++emit->current_arl;
|
||||
if (emit->unit == PIPE_SHADER_FRAGMENT) {
|
||||
/* MOVA not present in pixel shader instruction set.
|
||||
* Ignore this instruction altogether since it is
|
||||
* only used for loop counters -- and for that
|
||||
* we reference aL directly.
|
||||
*/
|
||||
return TRUE;
|
||||
}
|
||||
if (svga_arl_needs_adjustment( emit )) {
|
||||
return emit_fake_arl( emit, insn );
|
||||
} else {
|
||||
@@ -2384,7 +2407,7 @@ static boolean make_immediate( struct svga_shader_emitter *emit,
|
||||
float d,
|
||||
struct src_register *out )
|
||||
{
|
||||
unsigned idx = emit->nr_hw_const++;
|
||||
unsigned idx = emit->nr_hw_float_const++;
|
||||
|
||||
if (!emit_def_const( emit, SVGA3D_CONST_TYPE_FLOAT,
|
||||
idx, a, b, c, d ))
|
||||
|
@@ -384,7 +384,6 @@ struct st_manager
|
||||
* This function is optional.
|
||||
*/
|
||||
boolean (*get_egl_image)(struct st_manager *smapi,
|
||||
struct st_context_iface *stctx,
|
||||
void *egl_image,
|
||||
struct st_egl_image *out);
|
||||
|
||||
|
@@ -61,9 +61,6 @@ struct dri_context
|
||||
/* gallium */
|
||||
struct st_api *stapi;
|
||||
struct st_context_iface *st;
|
||||
|
||||
/* hooks filled in by dri2 & drisw */
|
||||
__DRIimage * (*lookup_egl_image)(struct dri_context *ctx, void *handle);
|
||||
};
|
||||
|
||||
static INLINE struct dri_context *
|
||||
|
@@ -287,16 +287,14 @@ dri_fill_st_visual(struct st_visual *stvis, struct dri_screen *screen,
|
||||
|
||||
static boolean
|
||||
dri_get_egl_image(struct st_manager *smapi,
|
||||
struct st_context_iface *stctxi,
|
||||
void *egl_image,
|
||||
struct st_egl_image *stimg)
|
||||
{
|
||||
struct dri_context *ctx =
|
||||
(struct dri_context *)stctxi->st_manager_private;
|
||||
struct dri_screen *screen = (struct dri_screen *)smapi;
|
||||
__DRIimage *img = NULL;
|
||||
|
||||
if (ctx->lookup_egl_image) {
|
||||
img = ctx->lookup_egl_image(ctx, egl_image);
|
||||
if (screen->lookup_egl_image) {
|
||||
img = screen->lookup_egl_image(screen, egl_image);
|
||||
}
|
||||
|
||||
if (!img)
|
||||
|
@@ -69,6 +69,9 @@ struct dri_screen
|
||||
boolean sd_depth_bits_last;
|
||||
boolean auto_fake_front;
|
||||
enum pipe_texture_target target;
|
||||
|
||||
/* hooks filled in by dri2 & drisw */
|
||||
__DRIimage * (*lookup_egl_image)(struct dri_screen *ctx, void *handle);
|
||||
};
|
||||
|
||||
/** cast wrapper */
|
||||
|
@@ -291,25 +291,26 @@ dri2_flush_frontbuffer(struct dri_drawable *drawable,
|
||||
}
|
||||
|
||||
static __DRIimage *
|
||||
dri2_lookup_egl_image(struct dri_context *ctx, void *handle)
|
||||
dri2_lookup_egl_image(struct dri_screen *screen, void *handle)
|
||||
{
|
||||
__DRIimageLookupExtension *loader = ctx->sPriv->dri2.image;
|
||||
__DRIimageLookupExtension *loader = screen->sPriv->dri2.image;
|
||||
__DRIimage *img;
|
||||
|
||||
if (!loader->lookupEGLImage)
|
||||
return NULL;
|
||||
|
||||
img = loader->lookupEGLImage(ctx->cPriv, handle, ctx->cPriv->loaderPrivate);
|
||||
img = loader->lookupEGLImage(screen->sPriv,
|
||||
handle, screen->sPriv->loaderPrivate);
|
||||
|
||||
return img;
|
||||
}
|
||||
|
||||
static __DRIimage *
|
||||
dri2_create_image_from_name(__DRIcontext *context,
|
||||
dri2_create_image_from_name(__DRIscreen *_screen,
|
||||
int width, int height, int format,
|
||||
int name, int pitch, void *loaderPrivate)
|
||||
{
|
||||
struct dri_screen *screen = dri_screen(context->driScreenPriv);
|
||||
struct dri_screen *screen = dri_screen(_screen);
|
||||
__DRIimage *img;
|
||||
struct pipe_resource templ;
|
||||
struct winsys_handle whandle;
|
||||
@@ -537,6 +538,7 @@ dri2_init_screen(__DRIscreen * sPriv)
|
||||
|
||||
screen->auto_fake_front = dri_with_format(sPriv);
|
||||
screen->broken_invalidate = !sPriv->dri2.useInvalidate;
|
||||
screen->lookup_egl_image = dri2_lookup_egl_image;
|
||||
|
||||
return configs;
|
||||
fail:
|
||||
@@ -556,8 +558,6 @@ dri2_create_context(gl_api api, const __GLcontextModes * visual,
|
||||
|
||||
ctx = cPriv->driverPrivate;
|
||||
|
||||
ctx->lookup_egl_image = dri2_lookup_egl_image;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@@ -24,9 +24,9 @@ x11_SOURCES = $(wildcard x11/*.c) \
|
||||
x11_OBJECTS = $(x11_SOURCES:.c=.o)
|
||||
|
||||
|
||||
kms_INCLUDES = -I$(TOP)/src/gallium/winsys $(shell pkg-config --cflags-only-I libdrm)
|
||||
kms_SOURCES = $(wildcard kms/*.c)
|
||||
kms_OBJECTS = $(kms_SOURCES:.c=.o)
|
||||
drm_INCLUDES = -I$(TOP)/src/gallium/winsys $(shell pkg-config --cflags-only-I libdrm)
|
||||
drm_SOURCES = $(wildcard drm/*.c)
|
||||
drm_OBJECTS = $(drm_SOURCES:.c=.o)
|
||||
|
||||
|
||||
fbdev_INCLUDES = -I$(TOP)/src/gallium/winsys/sw
|
||||
@@ -34,8 +34,8 @@ fbdev_SOURCES = $(wildcard fbdev/*.c)
|
||||
fbdev_OBJECTS = $(fbdev_SOURCES:.c=.o)
|
||||
|
||||
|
||||
ALL_INCLUDES = $(common_INCLUDES) $(x11_INCLUDES) $(kms_INCLUDES) $(fbdev_INCLUDES)
|
||||
ALL_SOURCES = $(common_SOURCES) $(x11_SOURCES) $(kms_SOURCES) $(fbdev_SOURCES)
|
||||
ALL_INCLUDES = $(common_INCLUDES) $(x11_INCLUDES) $(drm_INCLUDES) $(fbdev_INCLUDES)
|
||||
ALL_SOURCES = $(common_SOURCES) $(x11_SOURCES) $(drm_SOURCES) $(fbdev_SOURCES)
|
||||
|
||||
EGL_OBJECTS = $(common_OBJECTS)
|
||||
EGL_CPPFLAGS = $(common_INCLUDES)
|
||||
@@ -45,9 +45,9 @@ ifneq ($(findstring x11, $(EGL_PLATFORMS)),)
|
||||
EGL_OBJECTS += $(x11_OBJECTS)
|
||||
EGL_CPPFLAGS += -DHAVE_X11_BACKEND
|
||||
endif
|
||||
ifneq ($(findstring kms, $(EGL_PLATFORMS)),)
|
||||
EGL_OBJECTS += $(kms_OBJECTS)
|
||||
EGL_CPPFLAGS += -DHAVE_KMS_BACKEND
|
||||
ifneq ($(findstring drm, $(EGL_PLATFORMS)),)
|
||||
EGL_OBJECTS += $(drm_OBJECTS)
|
||||
EGL_CPPFLAGS += -DHAVE_DRM_BACKEND
|
||||
endif
|
||||
ifneq ($(findstring fbdev, $(EGL_PLATFORMS)),)
|
||||
EGL_OBJECTS += $(fbdev_OBJECTS)
|
||||
@@ -87,8 +87,8 @@ $(common_OBJECTS): %.o: %.c
|
||||
$(x11_OBJECTS): %.o: %.c
|
||||
$(call egl-cc,x11)
|
||||
|
||||
$(kms_OBJECTS): %.o: %.c
|
||||
$(call egl-cc,kms)
|
||||
$(drm_OBJECTS): %.o: %.c
|
||||
$(call egl-cc,drm)
|
||||
|
||||
$(fbdev_OBJECTS): %.o: %.c
|
||||
$(call egl-cc,fbdev)
|
||||
|
@@ -65,8 +65,8 @@ egl_g3d_get_platform(_EGLDriver *drv, _EGLPlatformType plat)
|
||||
break;
|
||||
case _EGL_PLATFORM_DRM:
|
||||
plat_name = "DRM";
|
||||
#ifdef HAVE_KMS_BACKEND
|
||||
nplat = native_get_kms_platform();
|
||||
#ifdef HAVE_DRM_BACKEND
|
||||
nplat = native_get_drm_platform();
|
||||
#endif
|
||||
break;
|
||||
case _EGL_PLATFORM_FBDEV:
|
||||
|
@@ -227,7 +227,7 @@ const struct native_platform *
|
||||
native_get_x11_platform(void);
|
||||
|
||||
const struct native_platform *
|
||||
native_get_kms_platform(void);
|
||||
native_get_drm_platform(void);
|
||||
|
||||
const struct native_platform *
|
||||
native_get_fbdev_platform(void);
|
||||
|
619
src/gallium/state_trackers/egl/drm/modeset.c
Normal file
619
src/gallium/state_trackers/egl/drm/modeset.c
Normal file
@@ -0,0 +1,619 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.9
|
||||
*
|
||||
* Copyright (C) 2010 LunarG Inc.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Authors:
|
||||
* Chia-I Wu <olv@lunarg.com>
|
||||
*/
|
||||
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_inlines.h"
|
||||
#include "egllog.h"
|
||||
|
||||
#include "native_drm.h"
|
||||
|
||||
static boolean
|
||||
drm_surface_validate(struct native_surface *nsurf, uint attachment_mask,
|
||||
unsigned int *seq_num, struct pipe_resource **textures,
|
||||
int *width, int *height)
|
||||
{
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
|
||||
if (!resource_surface_add_resources(drmsurf->rsurf, attachment_mask))
|
||||
return FALSE;
|
||||
if (textures)
|
||||
resource_surface_get_resources(drmsurf->rsurf, textures, attachment_mask);
|
||||
|
||||
if (seq_num)
|
||||
*seq_num = drmsurf->sequence_number;
|
||||
if (width)
|
||||
*width = drmsurf->width;
|
||||
if (height)
|
||||
*height = drmsurf->height;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add textures as DRM framebuffers.
|
||||
*/
|
||||
static boolean
|
||||
drm_surface_init_framebuffers(struct native_surface *nsurf, boolean need_back)
|
||||
{
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
struct drm_display *drmdpy = drmsurf->drmdpy;
|
||||
int num_framebuffers = (need_back) ? 2 : 1;
|
||||
int i, err;
|
||||
|
||||
for (i = 0; i < num_framebuffers; i++) {
|
||||
struct drm_framebuffer *fb;
|
||||
enum native_attachment natt;
|
||||
struct winsys_handle whandle;
|
||||
uint block_bits;
|
||||
|
||||
if (i == 0) {
|
||||
fb = &drmsurf->front_fb;
|
||||
natt = NATIVE_ATTACHMENT_FRONT_LEFT;
|
||||
}
|
||||
else {
|
||||
fb = &drmsurf->back_fb;
|
||||
natt = NATIVE_ATTACHMENT_BACK_LEFT;
|
||||
}
|
||||
|
||||
if (!fb->texture) {
|
||||
/* make sure the texture has been allocated */
|
||||
resource_surface_add_resources(drmsurf->rsurf, 1 << natt);
|
||||
fb->texture =
|
||||
resource_surface_get_single_resource(drmsurf->rsurf, natt);
|
||||
if (!fb->texture)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* already initialized */
|
||||
if (fb->buffer_id)
|
||||
continue;
|
||||
|
||||
/* TODO detect the real value */
|
||||
fb->is_passive = TRUE;
|
||||
|
||||
memset(&whandle, 0, sizeof(whandle));
|
||||
whandle.type = DRM_API_HANDLE_TYPE_KMS;
|
||||
|
||||
if (!drmdpy->base.screen->resource_get_handle(drmdpy->base.screen,
|
||||
fb->texture, &whandle))
|
||||
return FALSE;
|
||||
|
||||
block_bits = util_format_get_blocksizebits(drmsurf->color_format);
|
||||
err = drmModeAddFB(drmdpy->fd, drmsurf->width, drmsurf->height,
|
||||
block_bits, block_bits, whandle.stride, whandle.handle,
|
||||
&fb->buffer_id);
|
||||
if (err) {
|
||||
fb->buffer_id = 0;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
drm_surface_flush_frontbuffer(struct native_surface *nsurf)
|
||||
{
|
||||
#ifdef DRM_MODE_FEATURE_DIRTYFB
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
struct drm_display *drmdpy = drmsurf->drmdpy;
|
||||
|
||||
if (drmsurf->front_fb.is_passive)
|
||||
drmModeDirtyFB(drmdpy->fd, drmsurf->front_fb.buffer_id, NULL, 0);
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
drm_surface_swap_buffers(struct native_surface *nsurf)
|
||||
{
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
struct drm_crtc *drmcrtc = &drmsurf->current_crtc;
|
||||
struct drm_display *drmdpy = drmsurf->drmdpy;
|
||||
struct drm_framebuffer tmp_fb;
|
||||
int err;
|
||||
|
||||
if (!drmsurf->back_fb.buffer_id) {
|
||||
if (!drm_surface_init_framebuffers(&drmsurf->base, TRUE))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (drmsurf->is_shown && drmcrtc->crtc) {
|
||||
err = drmModeSetCrtc(drmdpy->fd, drmcrtc->crtc->crtc_id,
|
||||
drmsurf->back_fb.buffer_id, drmcrtc->crtc->x, drmcrtc->crtc->y,
|
||||
drmcrtc->connectors, drmcrtc->num_connectors, &drmcrtc->crtc->mode);
|
||||
if (err)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* swap the buffers */
|
||||
tmp_fb = drmsurf->front_fb;
|
||||
drmsurf->front_fb = drmsurf->back_fb;
|
||||
drmsurf->back_fb = tmp_fb;
|
||||
|
||||
resource_surface_swap_buffers(drmsurf->rsurf,
|
||||
NATIVE_ATTACHMENT_FRONT_LEFT, NATIVE_ATTACHMENT_BACK_LEFT, FALSE);
|
||||
/* the front/back textures are swapped */
|
||||
drmsurf->sequence_number++;
|
||||
drmdpy->event_handler->invalid_surface(&drmdpy->base,
|
||||
&drmsurf->base, drmsurf->sequence_number);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
drm_surface_wait(struct native_surface *nsurf)
|
||||
{
|
||||
/* no-op */
|
||||
}
|
||||
|
||||
static void
|
||||
drm_surface_destroy(struct native_surface *nsurf)
|
||||
{
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
|
||||
if (drmsurf->current_crtc.crtc)
|
||||
drmModeFreeCrtc(drmsurf->current_crtc.crtc);
|
||||
|
||||
if (drmsurf->front_fb.buffer_id)
|
||||
drmModeRmFB(drmsurf->drmdpy->fd, drmsurf->front_fb.buffer_id);
|
||||
pipe_resource_reference(&drmsurf->front_fb.texture, NULL);
|
||||
|
||||
if (drmsurf->back_fb.buffer_id)
|
||||
drmModeRmFB(drmsurf->drmdpy->fd, drmsurf->back_fb.buffer_id);
|
||||
pipe_resource_reference(&drmsurf->back_fb.texture, NULL);
|
||||
|
||||
resource_surface_destroy(drmsurf->rsurf);
|
||||
FREE(drmsurf);
|
||||
}
|
||||
|
||||
static struct drm_surface *
|
||||
drm_display_create_surface(struct native_display *ndpy,
|
||||
const struct native_config *nconf,
|
||||
uint width, uint height)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
struct drm_config *drmconf = drm_config(nconf);
|
||||
struct drm_surface *drmsurf;
|
||||
|
||||
drmsurf = CALLOC_STRUCT(drm_surface);
|
||||
if (!drmsurf)
|
||||
return NULL;
|
||||
|
||||
drmsurf->drmdpy = drmdpy;
|
||||
drmsurf->color_format = drmconf->base.color_format;
|
||||
drmsurf->width = width;
|
||||
drmsurf->height = height;
|
||||
|
||||
drmsurf->rsurf = resource_surface_create(drmdpy->base.screen,
|
||||
drmsurf->color_format,
|
||||
PIPE_BIND_RENDER_TARGET |
|
||||
PIPE_BIND_SAMPLER_VIEW |
|
||||
PIPE_BIND_DISPLAY_TARGET |
|
||||
PIPE_BIND_SCANOUT);
|
||||
if (!drmsurf->rsurf) {
|
||||
FREE(drmsurf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
resource_surface_set_size(drmsurf->rsurf, drmsurf->width, drmsurf->height);
|
||||
|
||||
drmsurf->base.destroy = drm_surface_destroy;
|
||||
drmsurf->base.swap_buffers = drm_surface_swap_buffers;
|
||||
drmsurf->base.flush_frontbuffer = drm_surface_flush_frontbuffer;
|
||||
drmsurf->base.validate = drm_surface_validate;
|
||||
drmsurf->base.wait = drm_surface_wait;
|
||||
|
||||
return drmsurf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Choose a CRTC that supports all given connectors.
|
||||
*/
|
||||
static uint32_t
|
||||
drm_display_choose_crtc(struct native_display *ndpy,
|
||||
uint32_t *connectors, int num_connectors)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
int idx;
|
||||
|
||||
for (idx = 0; idx < drmdpy->resources->count_crtcs; idx++) {
|
||||
boolean found_crtc = TRUE;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < num_connectors; i++) {
|
||||
drmModeConnectorPtr connector;
|
||||
int encoder_idx = -1;
|
||||
|
||||
connector = drmModeGetConnector(drmdpy->fd, connectors[i]);
|
||||
if (!connector) {
|
||||
found_crtc = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* find an encoder the CRTC supports */
|
||||
for (j = 0; j < connector->count_encoders; j++) {
|
||||
drmModeEncoderPtr encoder =
|
||||
drmModeGetEncoder(drmdpy->fd, connector->encoders[j]);
|
||||
if (encoder->possible_crtcs & (1 << idx)) {
|
||||
encoder_idx = j;
|
||||
break;
|
||||
}
|
||||
drmModeFreeEncoder(encoder);
|
||||
}
|
||||
|
||||
drmModeFreeConnector(connector);
|
||||
if (encoder_idx < 0) {
|
||||
found_crtc = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found_crtc)
|
||||
break;
|
||||
}
|
||||
|
||||
if (idx >= drmdpy->resources->count_crtcs) {
|
||||
_eglLog(_EGL_WARNING,
|
||||
"failed to find a CRTC that supports the given %d connectors",
|
||||
num_connectors);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return drmdpy->resources->crtcs[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* Remember the original CRTC status and set the CRTC
|
||||
*/
|
||||
static boolean
|
||||
drm_display_set_crtc(struct native_display *ndpy, int crtc_idx,
|
||||
uint32_t buffer_id, uint32_t x, uint32_t y,
|
||||
uint32_t *connectors, int num_connectors,
|
||||
drmModeModeInfoPtr mode)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
struct drm_crtc *drmcrtc = &drmdpy->saved_crtcs[crtc_idx];
|
||||
uint32_t crtc_id;
|
||||
int err;
|
||||
|
||||
if (drmcrtc->crtc) {
|
||||
crtc_id = drmcrtc->crtc->crtc_id;
|
||||
}
|
||||
else {
|
||||
int count = 0, i;
|
||||
|
||||
/*
|
||||
* Choose the CRTC once. It could be more dynamic, but let's keep it
|
||||
* simple for now.
|
||||
*/
|
||||
crtc_id = drm_display_choose_crtc(&drmdpy->base,
|
||||
connectors, num_connectors);
|
||||
|
||||
/* save the original CRTC status */
|
||||
drmcrtc->crtc = drmModeGetCrtc(drmdpy->fd, crtc_id);
|
||||
if (!drmcrtc->crtc)
|
||||
return FALSE;
|
||||
|
||||
for (i = 0; i < drmdpy->num_connectors; i++) {
|
||||
struct drm_connector *drmconn = &drmdpy->connectors[i];
|
||||
drmModeConnectorPtr connector = drmconn->connector;
|
||||
drmModeEncoderPtr encoder;
|
||||
|
||||
encoder = drmModeGetEncoder(drmdpy->fd, connector->encoder_id);
|
||||
if (encoder) {
|
||||
if (encoder->crtc_id == crtc_id) {
|
||||
drmcrtc->connectors[count++] = connector->connector_id;
|
||||
if (count >= Elements(drmcrtc->connectors))
|
||||
break;
|
||||
}
|
||||
drmModeFreeEncoder(encoder);
|
||||
}
|
||||
}
|
||||
|
||||
drmcrtc->num_connectors = count;
|
||||
}
|
||||
|
||||
err = drmModeSetCrtc(drmdpy->fd, crtc_id, buffer_id, x, y,
|
||||
connectors, num_connectors, mode);
|
||||
if (err) {
|
||||
drmModeFreeCrtc(drmcrtc->crtc);
|
||||
drmcrtc->crtc = NULL;
|
||||
drmcrtc->num_connectors = 0;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
drm_display_program(struct native_display *ndpy, int crtc_idx,
|
||||
struct native_surface *nsurf, uint x, uint y,
|
||||
const struct native_connector **nconns, int num_nconns,
|
||||
const struct native_mode *nmode)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
const struct drm_mode *drmmode = drm_mode(nmode);
|
||||
uint32_t connector_ids[32];
|
||||
uint32_t buffer_id;
|
||||
drmModeModeInfo mode_tmp, *mode;
|
||||
int i;
|
||||
|
||||
if (num_nconns > Elements(connector_ids)) {
|
||||
_eglLog(_EGL_WARNING, "too many connectors (%d)", num_nconns);
|
||||
num_nconns = Elements(connector_ids);
|
||||
}
|
||||
|
||||
if (drmsurf) {
|
||||
if (!drm_surface_init_framebuffers(&drmsurf->base, FALSE))
|
||||
return FALSE;
|
||||
|
||||
buffer_id = drmsurf->front_fb.buffer_id;
|
||||
/* the mode argument of drmModeSetCrtc is not constified */
|
||||
mode_tmp = drmmode->mode;
|
||||
mode = &mode_tmp;
|
||||
}
|
||||
else {
|
||||
/* disable the CRTC */
|
||||
buffer_id = 0;
|
||||
mode = NULL;
|
||||
num_nconns = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_nconns; i++) {
|
||||
struct drm_connector *drmconn = drm_connector(nconns[i]);
|
||||
connector_ids[i] = drmconn->connector->connector_id;
|
||||
}
|
||||
|
||||
if (!drm_display_set_crtc(&drmdpy->base, crtc_idx, buffer_id, x, y,
|
||||
connector_ids, num_nconns, mode)) {
|
||||
_eglLog(_EGL_WARNING, "failed to set CRTC %d", crtc_idx);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (drmdpy->shown_surfaces[crtc_idx])
|
||||
drmdpy->shown_surfaces[crtc_idx]->is_shown = FALSE;
|
||||
drmdpy->shown_surfaces[crtc_idx] = drmsurf;
|
||||
|
||||
/* remember the settings for buffer swapping */
|
||||
if (drmsurf) {
|
||||
uint32_t crtc_id = drmdpy->saved_crtcs[crtc_idx].crtc->crtc_id;
|
||||
struct drm_crtc *drmcrtc = &drmsurf->current_crtc;
|
||||
|
||||
if (drmcrtc->crtc)
|
||||
drmModeFreeCrtc(drmcrtc->crtc);
|
||||
drmcrtc->crtc = drmModeGetCrtc(drmdpy->fd, crtc_id);
|
||||
|
||||
assert(num_nconns < Elements(drmcrtc->connectors));
|
||||
memcpy(drmcrtc->connectors, connector_ids,
|
||||
sizeof(*connector_ids) * num_nconns);
|
||||
drmcrtc->num_connectors = num_nconns;
|
||||
|
||||
drmsurf->is_shown = TRUE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static const struct native_mode **
|
||||
drm_display_get_modes(struct native_display *ndpy,
|
||||
const struct native_connector *nconn,
|
||||
int *num_modes)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
struct drm_connector *drmconn = drm_connector(nconn);
|
||||
const struct native_mode **nmodes_return;
|
||||
int count, i;
|
||||
|
||||
/* delete old data */
|
||||
if (drmconn->connector) {
|
||||
drmModeFreeConnector(drmconn->connector);
|
||||
FREE(drmconn->drm_modes);
|
||||
|
||||
drmconn->connector = NULL;
|
||||
drmconn->drm_modes = NULL;
|
||||
drmconn->num_modes = 0;
|
||||
}
|
||||
|
||||
/* detect again */
|
||||
drmconn->connector = drmModeGetConnector(drmdpy->fd, drmconn->connector_id);
|
||||
if (!drmconn->connector)
|
||||
return NULL;
|
||||
|
||||
count = drmconn->connector->count_modes;
|
||||
drmconn->drm_modes = CALLOC(count, sizeof(*drmconn->drm_modes));
|
||||
if (!drmconn->drm_modes) {
|
||||
drmModeFreeConnector(drmconn->connector);
|
||||
drmconn->connector = NULL;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
struct drm_mode *drmmode = &drmconn->drm_modes[i];
|
||||
drmModeModeInfoPtr mode = &drmconn->connector->modes[i];
|
||||
|
||||
drmmode->mode = *mode;
|
||||
|
||||
drmmode->base.desc = drmmode->mode.name;
|
||||
drmmode->base.width = drmmode->mode.hdisplay;
|
||||
drmmode->base.height = drmmode->mode.vdisplay;
|
||||
drmmode->base.refresh_rate = drmmode->mode.vrefresh;
|
||||
/* not all kernels have vrefresh = refresh_rate * 1000 */
|
||||
if (drmmode->base.refresh_rate > 1000)
|
||||
drmmode->base.refresh_rate = (drmmode->base.refresh_rate + 500) / 1000;
|
||||
}
|
||||
|
||||
nmodes_return = MALLOC(count * sizeof(*nmodes_return));
|
||||
if (nmodes_return) {
|
||||
for (i = 0; i < count; i++)
|
||||
nmodes_return[i] = &drmconn->drm_modes[i].base;
|
||||
if (num_modes)
|
||||
*num_modes = count;
|
||||
}
|
||||
|
||||
return nmodes_return;
|
||||
}
|
||||
|
||||
static const struct native_connector **
|
||||
drm_display_get_connectors(struct native_display *ndpy, int *num_connectors,
|
||||
int *num_crtc)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
const struct native_connector **connectors;
|
||||
int i;
|
||||
|
||||
if (!drmdpy->connectors) {
|
||||
drmdpy->connectors =
|
||||
CALLOC(drmdpy->resources->count_connectors, sizeof(*drmdpy->connectors));
|
||||
if (!drmdpy->connectors)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < drmdpy->resources->count_connectors; i++) {
|
||||
struct drm_connector *drmconn = &drmdpy->connectors[i];
|
||||
|
||||
drmconn->connector_id = drmdpy->resources->connectors[i];
|
||||
/* drmconn->connector is allocated when the modes are asked */
|
||||
}
|
||||
|
||||
drmdpy->num_connectors = drmdpy->resources->count_connectors;
|
||||
}
|
||||
|
||||
connectors = MALLOC(drmdpy->num_connectors * sizeof(*connectors));
|
||||
if (connectors) {
|
||||
for (i = 0; i < drmdpy->num_connectors; i++)
|
||||
connectors[i] = &drmdpy->connectors[i].base;
|
||||
if (num_connectors)
|
||||
*num_connectors = drmdpy->num_connectors;
|
||||
}
|
||||
|
||||
if (num_crtc)
|
||||
*num_crtc = drmdpy->resources->count_crtcs;
|
||||
|
||||
return connectors;
|
||||
}
|
||||
|
||||
static struct native_surface *
|
||||
drm_display_create_scanout_surface(struct native_display *ndpy,
|
||||
const struct native_config *nconf,
|
||||
uint width, uint height)
|
||||
{
|
||||
struct drm_surface *drmsurf;
|
||||
|
||||
drmsurf = drm_display_create_surface(ndpy, nconf, width, height);
|
||||
return &drmsurf->base;
|
||||
}
|
||||
|
||||
static struct native_display_modeset drm_display_modeset = {
|
||||
.get_connectors = drm_display_get_connectors,
|
||||
.get_modes = drm_display_get_modes,
|
||||
.create_scanout_surface = drm_display_create_scanout_surface,
|
||||
.program = drm_display_program
|
||||
};
|
||||
|
||||
void
|
||||
drm_display_fini_modeset(struct native_display *ndpy)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
int i;
|
||||
|
||||
if (drmdpy->connectors) {
|
||||
for (i = 0; i < drmdpy->num_connectors; i++) {
|
||||
struct drm_connector *drmconn = &drmdpy->connectors[i];
|
||||
if (drmconn->connector) {
|
||||
drmModeFreeConnector(drmconn->connector);
|
||||
FREE(drmconn->drm_modes);
|
||||
}
|
||||
}
|
||||
FREE(drmdpy->connectors);
|
||||
}
|
||||
|
||||
if (drmdpy->shown_surfaces) {
|
||||
FREE(drmdpy->shown_surfaces);
|
||||
drmdpy->shown_surfaces = NULL;
|
||||
}
|
||||
|
||||
if (drmdpy->saved_crtcs) {
|
||||
for (i = 0; i < drmdpy->resources->count_crtcs; i++) {
|
||||
struct drm_crtc *drmcrtc = &drmdpy->saved_crtcs[i];
|
||||
|
||||
if (drmcrtc->crtc) {
|
||||
/* restore crtc */
|
||||
drmModeSetCrtc(drmdpy->fd, drmcrtc->crtc->crtc_id,
|
||||
drmcrtc->crtc->buffer_id, drmcrtc->crtc->x, drmcrtc->crtc->y,
|
||||
drmcrtc->connectors, drmcrtc->num_connectors,
|
||||
&drmcrtc->crtc->mode);
|
||||
|
||||
drmModeFreeCrtc(drmcrtc->crtc);
|
||||
}
|
||||
}
|
||||
FREE(drmdpy->saved_crtcs);
|
||||
}
|
||||
|
||||
if (drmdpy->resources) {
|
||||
drmModeFreeResources(drmdpy->resources);
|
||||
drmdpy->resources = NULL;
|
||||
}
|
||||
|
||||
drmdpy->base.modeset = NULL;
|
||||
}
|
||||
|
||||
boolean
|
||||
drm_display_init_modeset(struct native_display *ndpy)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
|
||||
/* resources are fixed, unlike crtc, connector, or encoder */
|
||||
drmdpy->resources = drmModeGetResources(drmdpy->fd);
|
||||
if (!drmdpy->resources) {
|
||||
_eglLog(_EGL_DEBUG, "Failed to get KMS resources. Disable modeset.");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
drmdpy->saved_crtcs =
|
||||
CALLOC(drmdpy->resources->count_crtcs, sizeof(*drmdpy->saved_crtcs));
|
||||
if (!drmdpy->saved_crtcs) {
|
||||
drm_display_fini_modeset(&drmdpy->base);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
drmdpy->shown_surfaces =
|
||||
CALLOC(drmdpy->resources->count_crtcs, sizeof(*drmdpy->shown_surfaces));
|
||||
if (!drmdpy->shown_surfaces) {
|
||||
drm_display_fini_modeset(&drmdpy->base);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
drmdpy->base.modeset = &drm_display_modeset;
|
||||
|
||||
return TRUE;
|
||||
}
|
240
src/gallium/state_trackers/egl/drm/native_drm.c
Normal file
240
src/gallium/state_trackers/egl/drm/native_drm.c
Normal file
@@ -0,0 +1,240 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.8
|
||||
*
|
||||
* Copyright (C) 2010 Chia-I Wu <olv@0xlab.org>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "util/u_memory.h"
|
||||
#include "egllog.h"
|
||||
|
||||
#include "native_drm.h"
|
||||
|
||||
/* see get_drm_screen_name */
|
||||
#include <radeon_drm.h>
|
||||
#include "radeon/drm/radeon_drm.h"
|
||||
|
||||
static boolean
|
||||
drm_display_is_format_supported(struct native_display *ndpy,
|
||||
enum pipe_format fmt, boolean is_color)
|
||||
{
|
||||
return ndpy->screen->is_format_supported(ndpy->screen,
|
||||
fmt, PIPE_TEXTURE_2D, 0,
|
||||
(is_color) ? PIPE_BIND_RENDER_TARGET :
|
||||
PIPE_BIND_DEPTH_STENCIL, 0);
|
||||
}
|
||||
|
||||
static const struct native_config **
|
||||
drm_display_get_configs(struct native_display *ndpy, int *num_configs)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
const struct native_config **configs;
|
||||
|
||||
/* first time */
|
||||
if (!drmdpy->config) {
|
||||
struct native_config *nconf;
|
||||
enum pipe_format format;
|
||||
|
||||
drmdpy->config = CALLOC(1, sizeof(*drmdpy->config));
|
||||
if (!drmdpy->config)
|
||||
return NULL;
|
||||
|
||||
nconf = &drmdpy->config->base;
|
||||
|
||||
nconf->buffer_mask =
|
||||
(1 << NATIVE_ATTACHMENT_FRONT_LEFT) |
|
||||
(1 << NATIVE_ATTACHMENT_BACK_LEFT);
|
||||
|
||||
format = PIPE_FORMAT_B8G8R8A8_UNORM;
|
||||
if (!drm_display_is_format_supported(&drmdpy->base, format, TRUE)) {
|
||||
format = PIPE_FORMAT_A8R8G8B8_UNORM;
|
||||
if (!drm_display_is_format_supported(&drmdpy->base, format, TRUE))
|
||||
format = PIPE_FORMAT_NONE;
|
||||
}
|
||||
if (format == PIPE_FORMAT_NONE) {
|
||||
FREE(drmdpy->config);
|
||||
drmdpy->config = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
nconf->color_format = format;
|
||||
|
||||
/* support KMS */
|
||||
if (drmdpy->resources)
|
||||
nconf->scanout_bit = TRUE;
|
||||
}
|
||||
|
||||
configs = MALLOC(sizeof(*configs));
|
||||
if (configs) {
|
||||
configs[0] = &drmdpy->config->base;
|
||||
if (num_configs)
|
||||
*num_configs = 1;
|
||||
}
|
||||
|
||||
return configs;
|
||||
}
|
||||
|
||||
static int
|
||||
drm_display_get_param(struct native_display *ndpy,
|
||||
enum native_param_type param)
|
||||
{
|
||||
int val;
|
||||
|
||||
switch (param) {
|
||||
default:
|
||||
val = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void
|
||||
drm_display_destroy(struct native_display *ndpy)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
|
||||
if (drmdpy->config)
|
||||
FREE(drmdpy->config);
|
||||
|
||||
drm_display_fini_modeset(&drmdpy->base);
|
||||
|
||||
if (drmdpy->base.screen)
|
||||
drmdpy->base.screen->destroy(drmdpy->base.screen);
|
||||
|
||||
if (drmdpy->fd >= 0)
|
||||
close(drmdpy->fd);
|
||||
|
||||
FREE(drmdpy);
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_drm_screen_name(int fd, drmVersionPtr version)
|
||||
{
|
||||
const char *name = version->name;
|
||||
|
||||
if (name && !strcmp(name, "radeon")) {
|
||||
int chip_id;
|
||||
struct drm_radeon_info info;
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
info.request = RADEON_INFO_DEVICE_ID;
|
||||
info.value = pointer_to_intptr(&chip_id);
|
||||
if (drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info)) != 0)
|
||||
return NULL;
|
||||
|
||||
name = is_r3xx(chip_id) ? "r300" : "r600";
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize KMS and pipe screen.
|
||||
*/
|
||||
static boolean
|
||||
drm_display_init_screen(struct native_display *ndpy)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
drmVersionPtr version;
|
||||
const char *name;
|
||||
|
||||
version = drmGetVersion(drmdpy->fd);
|
||||
if (!version) {
|
||||
_eglLog(_EGL_WARNING, "invalid fd %d", drmdpy->fd);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
name = get_drm_screen_name(drmdpy->fd, version);
|
||||
if (name) {
|
||||
drmdpy->base.screen =
|
||||
drmdpy->event_handler->new_drm_screen(&drmdpy->base, name, drmdpy->fd);
|
||||
}
|
||||
drmFreeVersion(version);
|
||||
|
||||
if (!drmdpy->base.screen) {
|
||||
_eglLog(_EGL_WARNING, "failed to create DRM screen");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static struct native_display *
|
||||
drm_create_display(int fd, struct native_event_handler *event_handler,
|
||||
void *user_data)
|
||||
{
|
||||
struct drm_display *drmdpy;
|
||||
|
||||
drmdpy = CALLOC_STRUCT(drm_display);
|
||||
if (!drmdpy)
|
||||
return NULL;
|
||||
|
||||
drmdpy->fd = fd;
|
||||
drmdpy->event_handler = event_handler;
|
||||
drmdpy->base.user_data = user_data;
|
||||
|
||||
if (!drm_display_init_screen(&drmdpy->base)) {
|
||||
drm_display_destroy(&drmdpy->base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
drmdpy->base.destroy = drm_display_destroy;
|
||||
drmdpy->base.get_param = drm_display_get_param;
|
||||
drmdpy->base.get_configs = drm_display_get_configs;
|
||||
|
||||
drm_display_init_modeset(&drmdpy->base);
|
||||
|
||||
return &drmdpy->base;
|
||||
}
|
||||
|
||||
static struct native_display *
|
||||
native_create_display(void *dpy, struct native_event_handler *event_handler,
|
||||
void *user_data)
|
||||
{
|
||||
int fd;
|
||||
|
||||
if (dpy) {
|
||||
fd = dup((int) pointer_to_intptr(dpy));
|
||||
}
|
||||
else {
|
||||
fd = open("/dev/dri/card0", O_RDWR);
|
||||
}
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
|
||||
return drm_create_display(fd, event_handler, user_data);
|
||||
}
|
||||
|
||||
static const struct native_platform drm_platform = {
|
||||
"DRM", /* name */
|
||||
native_create_display
|
||||
};
|
||||
|
||||
const struct native_platform *
|
||||
native_get_drm_platform(void)
|
||||
{
|
||||
return &drm_platform;
|
||||
}
|
@@ -23,8 +23,8 @@
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _NATIVE_KMS_H_
|
||||
#define _NATIVE_KMS_H_
|
||||
#ifndef _NATIVE_DRM_H_
|
||||
#define _NATIVE_DRM_H_
|
||||
|
||||
#include <xf86drm.h>
|
||||
#include <xf86drmMode.h>
|
||||
@@ -37,101 +37,110 @@
|
||||
#include "common/native.h"
|
||||
#include "common/native_helper.h"
|
||||
|
||||
struct kms_config;
|
||||
struct kms_connector;
|
||||
struct kms_mode;
|
||||
struct drm_config;
|
||||
struct drm_crtc;
|
||||
struct drm_connector;
|
||||
struct drm_mode;
|
||||
struct drm_surface;
|
||||
|
||||
struct kms_crtc {
|
||||
drmModeCrtcPtr crtc;
|
||||
uint32_t connectors[32];
|
||||
int num_connectors;
|
||||
};
|
||||
|
||||
struct kms_display {
|
||||
struct drm_display {
|
||||
struct native_display base;
|
||||
|
||||
struct native_event_handler *event_handler;
|
||||
|
||||
int fd;
|
||||
drmModeResPtr resources;
|
||||
struct kms_config *config;
|
||||
struct drm_config *config;
|
||||
|
||||
struct kms_connector *connectors;
|
||||
/* for modesetting */
|
||||
drmModeResPtr resources;
|
||||
struct drm_connector *connectors;
|
||||
int num_connectors;
|
||||
|
||||
struct kms_surface **shown_surfaces;
|
||||
struct drm_surface **shown_surfaces;
|
||||
/* save the original settings of the CRTCs */
|
||||
struct kms_crtc *saved_crtcs;
|
||||
struct drm_crtc *saved_crtcs;
|
||||
};
|
||||
|
||||
struct kms_framebuffer {
|
||||
struct drm_config {
|
||||
struct native_config base;
|
||||
};
|
||||
|
||||
struct drm_crtc {
|
||||
drmModeCrtcPtr crtc;
|
||||
uint32_t connectors[32];
|
||||
int num_connectors;
|
||||
};
|
||||
|
||||
struct drm_framebuffer {
|
||||
struct pipe_resource *texture;
|
||||
boolean is_passive;
|
||||
|
||||
uint32_t buffer_id;
|
||||
};
|
||||
|
||||
struct kms_surface {
|
||||
struct drm_surface {
|
||||
struct native_surface base;
|
||||
struct kms_display *kdpy;
|
||||
struct drm_display *drmdpy;
|
||||
|
||||
struct resource_surface *rsurf;
|
||||
enum pipe_format color_format;
|
||||
int width, height;
|
||||
|
||||
unsigned int sequence_number;
|
||||
struct kms_framebuffer front_fb, back_fb;
|
||||
struct drm_framebuffer front_fb, back_fb;
|
||||
|
||||
boolean is_shown;
|
||||
struct kms_crtc current_crtc;
|
||||
struct drm_crtc current_crtc;
|
||||
};
|
||||
|
||||
struct kms_config {
|
||||
struct native_config base;
|
||||
};
|
||||
|
||||
struct kms_connector {
|
||||
struct drm_connector {
|
||||
struct native_connector base;
|
||||
|
||||
uint32_t connector_id;
|
||||
drmModeConnectorPtr connector;
|
||||
struct kms_mode *kms_modes;
|
||||
struct drm_mode *drm_modes;
|
||||
int num_modes;
|
||||
};
|
||||
|
||||
struct kms_mode {
|
||||
struct drm_mode {
|
||||
struct native_mode base;
|
||||
drmModeModeInfo mode;
|
||||
};
|
||||
|
||||
static INLINE struct kms_display *
|
||||
kms_display(const struct native_display *ndpy)
|
||||
static INLINE struct drm_display *
|
||||
drm_display(const struct native_display *ndpy)
|
||||
{
|
||||
return (struct kms_display *) ndpy;
|
||||
return (struct drm_display *) ndpy;
|
||||
}
|
||||
|
||||
static INLINE struct kms_surface *
|
||||
kms_surface(const struct native_surface *nsurf)
|
||||
static INLINE struct drm_config *
|
||||
drm_config(const struct native_config *nconf)
|
||||
{
|
||||
return (struct kms_surface *) nsurf;
|
||||
return (struct drm_config *) nconf;
|
||||
}
|
||||
|
||||
static INLINE struct kms_config *
|
||||
kms_config(const struct native_config *nconf)
|
||||
static INLINE struct drm_surface *
|
||||
drm_surface(const struct native_surface *nsurf)
|
||||
{
|
||||
return (struct kms_config *) nconf;
|
||||
return (struct drm_surface *) nsurf;
|
||||
}
|
||||
|
||||
static INLINE struct kms_connector *
|
||||
kms_connector(const struct native_connector *nconn)
|
||||
static INLINE struct drm_connector *
|
||||
drm_connector(const struct native_connector *nconn)
|
||||
{
|
||||
return (struct kms_connector *) nconn;
|
||||
return (struct drm_connector *) nconn;
|
||||
}
|
||||
|
||||
static INLINE struct kms_mode *
|
||||
kms_mode(const struct native_mode *nmode)
|
||||
static INLINE struct drm_mode *
|
||||
drm_mode(const struct native_mode *nmode)
|
||||
{
|
||||
return (struct kms_mode *) nmode;
|
||||
return (struct drm_mode *) nmode;
|
||||
}
|
||||
|
||||
#endif /* _NATIVE_KMS_H_ */
|
||||
boolean
|
||||
drm_display_init_modeset(struct native_display *ndpy);
|
||||
|
||||
void
|
||||
drm_display_fini_modeset(struct native_display *ndpy);
|
||||
|
||||
#endif /* _NATIVE_DRM_H_ */
|
@@ -1,808 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.8
|
||||
*
|
||||
* Copyright (C) 2010 Chia-I Wu <olv@0xlab.org>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "pipe/p_screen.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "util/u_debug.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_inlines.h"
|
||||
#include "util/u_pointer.h"
|
||||
#include "util/u_string.h"
|
||||
#include "egllog.h"
|
||||
|
||||
#include "native_kms.h"
|
||||
|
||||
/* see get_drm_screen_name */
|
||||
#include <radeon_drm.h>
|
||||
#include "radeon/drm/radeon_drm.h"
|
||||
|
||||
static boolean
|
||||
kms_surface_validate(struct native_surface *nsurf, uint attachment_mask,
|
||||
unsigned int *seq_num, struct pipe_resource **textures,
|
||||
int *width, int *height)
|
||||
{
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
|
||||
if (!resource_surface_add_resources(ksurf->rsurf, attachment_mask))
|
||||
return FALSE;
|
||||
if (textures)
|
||||
resource_surface_get_resources(ksurf->rsurf, textures, attachment_mask);
|
||||
|
||||
if (seq_num)
|
||||
*seq_num = ksurf->sequence_number;
|
||||
if (width)
|
||||
*width = ksurf->width;
|
||||
if (height)
|
||||
*height = ksurf->height;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add textures as DRM framebuffers.
|
||||
*/
|
||||
static boolean
|
||||
kms_surface_init_framebuffers(struct native_surface *nsurf, boolean need_back)
|
||||
{
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
struct kms_display *kdpy = ksurf->kdpy;
|
||||
int num_framebuffers = (need_back) ? 2 : 1;
|
||||
int i, err;
|
||||
|
||||
for (i = 0; i < num_framebuffers; i++) {
|
||||
struct kms_framebuffer *fb;
|
||||
enum native_attachment natt;
|
||||
struct winsys_handle whandle;
|
||||
uint block_bits;
|
||||
|
||||
if (i == 0) {
|
||||
fb = &ksurf->front_fb;
|
||||
natt = NATIVE_ATTACHMENT_FRONT_LEFT;
|
||||
}
|
||||
else {
|
||||
fb = &ksurf->back_fb;
|
||||
natt = NATIVE_ATTACHMENT_BACK_LEFT;
|
||||
}
|
||||
|
||||
if (!fb->texture) {
|
||||
/* make sure the texture has been allocated */
|
||||
resource_surface_add_resources(ksurf->rsurf, 1 << natt);
|
||||
fb->texture =
|
||||
resource_surface_get_single_resource(ksurf->rsurf, natt);
|
||||
if (!fb->texture)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* already initialized */
|
||||
if (fb->buffer_id)
|
||||
continue;
|
||||
|
||||
/* TODO detect the real value */
|
||||
fb->is_passive = TRUE;
|
||||
|
||||
memset(&whandle, 0, sizeof(whandle));
|
||||
whandle.type = DRM_API_HANDLE_TYPE_KMS;
|
||||
|
||||
if (!kdpy->base.screen->resource_get_handle(kdpy->base.screen,
|
||||
fb->texture, &whandle))
|
||||
return FALSE;
|
||||
|
||||
block_bits = util_format_get_blocksizebits(ksurf->color_format);
|
||||
err = drmModeAddFB(kdpy->fd, ksurf->width, ksurf->height,
|
||||
block_bits, block_bits, whandle.stride, whandle.handle,
|
||||
&fb->buffer_id);
|
||||
if (err) {
|
||||
fb->buffer_id = 0;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
kms_surface_flush_frontbuffer(struct native_surface *nsurf)
|
||||
{
|
||||
#ifdef DRM_MODE_FEATURE_DIRTYFB
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
struct kms_display *kdpy = ksurf->kdpy;
|
||||
|
||||
if (ksurf->front_fb.is_passive)
|
||||
drmModeDirtyFB(kdpy->fd, ksurf->front_fb.buffer_id, NULL, 0);
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
kms_surface_swap_buffers(struct native_surface *nsurf)
|
||||
{
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
struct kms_crtc *kcrtc = &ksurf->current_crtc;
|
||||
struct kms_display *kdpy = ksurf->kdpy;
|
||||
struct kms_framebuffer tmp_fb;
|
||||
int err;
|
||||
|
||||
if (!ksurf->back_fb.buffer_id) {
|
||||
if (!kms_surface_init_framebuffers(&ksurf->base, TRUE))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (ksurf->is_shown && kcrtc->crtc) {
|
||||
err = drmModeSetCrtc(kdpy->fd, kcrtc->crtc->crtc_id,
|
||||
ksurf->back_fb.buffer_id, kcrtc->crtc->x, kcrtc->crtc->y,
|
||||
kcrtc->connectors, kcrtc->num_connectors, &kcrtc->crtc->mode);
|
||||
if (err)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* swap the buffers */
|
||||
tmp_fb = ksurf->front_fb;
|
||||
ksurf->front_fb = ksurf->back_fb;
|
||||
ksurf->back_fb = tmp_fb;
|
||||
|
||||
resource_surface_swap_buffers(ksurf->rsurf,
|
||||
NATIVE_ATTACHMENT_FRONT_LEFT, NATIVE_ATTACHMENT_BACK_LEFT, FALSE);
|
||||
/* the front/back textures are swapped */
|
||||
ksurf->sequence_number++;
|
||||
kdpy->event_handler->invalid_surface(&kdpy->base,
|
||||
&ksurf->base, ksurf->sequence_number);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
kms_surface_wait(struct native_surface *nsurf)
|
||||
{
|
||||
/* no-op */
|
||||
}
|
||||
|
||||
static void
|
||||
kms_surface_destroy(struct native_surface *nsurf)
|
||||
{
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
|
||||
if (ksurf->current_crtc.crtc)
|
||||
drmModeFreeCrtc(ksurf->current_crtc.crtc);
|
||||
|
||||
if (ksurf->front_fb.buffer_id)
|
||||
drmModeRmFB(ksurf->kdpy->fd, ksurf->front_fb.buffer_id);
|
||||
pipe_resource_reference(&ksurf->front_fb.texture, NULL);
|
||||
|
||||
if (ksurf->back_fb.buffer_id)
|
||||
drmModeRmFB(ksurf->kdpy->fd, ksurf->back_fb.buffer_id);
|
||||
pipe_resource_reference(&ksurf->back_fb.texture, NULL);
|
||||
|
||||
resource_surface_destroy(ksurf->rsurf);
|
||||
FREE(ksurf);
|
||||
}
|
||||
|
||||
static struct kms_surface *
|
||||
kms_display_create_surface(struct native_display *ndpy,
|
||||
const struct native_config *nconf,
|
||||
uint width, uint height)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
struct kms_config *kconf = kms_config(nconf);
|
||||
struct kms_surface *ksurf;
|
||||
|
||||
ksurf = CALLOC_STRUCT(kms_surface);
|
||||
if (!ksurf)
|
||||
return NULL;
|
||||
|
||||
ksurf->kdpy = kdpy;
|
||||
ksurf->color_format = kconf->base.color_format;
|
||||
ksurf->width = width;
|
||||
ksurf->height = height;
|
||||
|
||||
ksurf->rsurf = resource_surface_create(kdpy->base.screen,
|
||||
ksurf->color_format,
|
||||
PIPE_BIND_RENDER_TARGET |
|
||||
PIPE_BIND_SAMPLER_VIEW |
|
||||
PIPE_BIND_DISPLAY_TARGET |
|
||||
PIPE_BIND_SCANOUT);
|
||||
if (!ksurf->rsurf) {
|
||||
FREE(ksurf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
resource_surface_set_size(ksurf->rsurf, ksurf->width, ksurf->height);
|
||||
|
||||
ksurf->base.destroy = kms_surface_destroy;
|
||||
ksurf->base.swap_buffers = kms_surface_swap_buffers;
|
||||
ksurf->base.flush_frontbuffer = kms_surface_flush_frontbuffer;
|
||||
ksurf->base.validate = kms_surface_validate;
|
||||
ksurf->base.wait = kms_surface_wait;
|
||||
|
||||
return ksurf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Choose a CRTC that supports all given connectors.
|
||||
*/
|
||||
static uint32_t
|
||||
kms_display_choose_crtc(struct native_display *ndpy,
|
||||
uint32_t *connectors, int num_connectors)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
int idx;
|
||||
|
||||
for (idx = 0; idx < kdpy->resources->count_crtcs; idx++) {
|
||||
boolean found_crtc = TRUE;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < num_connectors; i++) {
|
||||
drmModeConnectorPtr connector;
|
||||
int encoder_idx = -1;
|
||||
|
||||
connector = drmModeGetConnector(kdpy->fd, connectors[i]);
|
||||
if (!connector) {
|
||||
found_crtc = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* find an encoder the CRTC supports */
|
||||
for (j = 0; j < connector->count_encoders; j++) {
|
||||
drmModeEncoderPtr encoder =
|
||||
drmModeGetEncoder(kdpy->fd, connector->encoders[j]);
|
||||
if (encoder->possible_crtcs & (1 << idx)) {
|
||||
encoder_idx = j;
|
||||
break;
|
||||
}
|
||||
drmModeFreeEncoder(encoder);
|
||||
}
|
||||
|
||||
drmModeFreeConnector(connector);
|
||||
if (encoder_idx < 0) {
|
||||
found_crtc = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found_crtc)
|
||||
break;
|
||||
}
|
||||
|
||||
if (idx >= kdpy->resources->count_crtcs) {
|
||||
_eglLog(_EGL_WARNING,
|
||||
"failed to find a CRTC that supports the given %d connectors",
|
||||
num_connectors);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return kdpy->resources->crtcs[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* Remember the original CRTC status and set the CRTC
|
||||
*/
|
||||
static boolean
|
||||
kms_display_set_crtc(struct native_display *ndpy, int crtc_idx,
|
||||
uint32_t buffer_id, uint32_t x, uint32_t y,
|
||||
uint32_t *connectors, int num_connectors,
|
||||
drmModeModeInfoPtr mode)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
struct kms_crtc *kcrtc = &kdpy->saved_crtcs[crtc_idx];
|
||||
uint32_t crtc_id;
|
||||
int err;
|
||||
|
||||
if (kcrtc->crtc) {
|
||||
crtc_id = kcrtc->crtc->crtc_id;
|
||||
}
|
||||
else {
|
||||
int count = 0, i;
|
||||
|
||||
/*
|
||||
* Choose the CRTC once. It could be more dynamic, but let's keep it
|
||||
* simple for now.
|
||||
*/
|
||||
crtc_id = kms_display_choose_crtc(&kdpy->base,
|
||||
connectors, num_connectors);
|
||||
|
||||
/* save the original CRTC status */
|
||||
kcrtc->crtc = drmModeGetCrtc(kdpy->fd, crtc_id);
|
||||
if (!kcrtc->crtc)
|
||||
return FALSE;
|
||||
|
||||
for (i = 0; i < kdpy->num_connectors; i++) {
|
||||
struct kms_connector *kconn = &kdpy->connectors[i];
|
||||
drmModeConnectorPtr connector = kconn->connector;
|
||||
drmModeEncoderPtr encoder;
|
||||
|
||||
encoder = drmModeGetEncoder(kdpy->fd, connector->encoder_id);
|
||||
if (encoder) {
|
||||
if (encoder->crtc_id == crtc_id) {
|
||||
kcrtc->connectors[count++] = connector->connector_id;
|
||||
if (count >= Elements(kcrtc->connectors))
|
||||
break;
|
||||
}
|
||||
drmModeFreeEncoder(encoder);
|
||||
}
|
||||
}
|
||||
|
||||
kcrtc->num_connectors = count;
|
||||
}
|
||||
|
||||
err = drmModeSetCrtc(kdpy->fd, crtc_id, buffer_id, x, y,
|
||||
connectors, num_connectors, mode);
|
||||
if (err) {
|
||||
drmModeFreeCrtc(kcrtc->crtc);
|
||||
kcrtc->crtc = NULL;
|
||||
kcrtc->num_connectors = 0;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
kms_display_program(struct native_display *ndpy, int crtc_idx,
|
||||
struct native_surface *nsurf, uint x, uint y,
|
||||
const struct native_connector **nconns, int num_nconns,
|
||||
const struct native_mode *nmode)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
const struct kms_mode *kmode = kms_mode(nmode);
|
||||
uint32_t connector_ids[32];
|
||||
uint32_t buffer_id;
|
||||
drmModeModeInfo mode_tmp, *mode;
|
||||
int i;
|
||||
|
||||
if (num_nconns > Elements(connector_ids)) {
|
||||
_eglLog(_EGL_WARNING, "too many connectors (%d)", num_nconns);
|
||||
num_nconns = Elements(connector_ids);
|
||||
}
|
||||
|
||||
if (ksurf) {
|
||||
if (!kms_surface_init_framebuffers(&ksurf->base, FALSE))
|
||||
return FALSE;
|
||||
|
||||
buffer_id = ksurf->front_fb.buffer_id;
|
||||
/* the mode argument of drmModeSetCrtc is not constified */
|
||||
mode_tmp = kmode->mode;
|
||||
mode = &mode_tmp;
|
||||
}
|
||||
else {
|
||||
/* disable the CRTC */
|
||||
buffer_id = 0;
|
||||
mode = NULL;
|
||||
num_nconns = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_nconns; i++) {
|
||||
struct kms_connector *kconn = kms_connector(nconns[i]);
|
||||
connector_ids[i] = kconn->connector->connector_id;
|
||||
}
|
||||
|
||||
if (!kms_display_set_crtc(&kdpy->base, crtc_idx, buffer_id, x, y,
|
||||
connector_ids, num_nconns, mode)) {
|
||||
_eglLog(_EGL_WARNING, "failed to set CRTC %d", crtc_idx);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (kdpy->shown_surfaces[crtc_idx])
|
||||
kdpy->shown_surfaces[crtc_idx]->is_shown = FALSE;
|
||||
kdpy->shown_surfaces[crtc_idx] = ksurf;
|
||||
|
||||
/* remember the settings for buffer swapping */
|
||||
if (ksurf) {
|
||||
uint32_t crtc_id = kdpy->saved_crtcs[crtc_idx].crtc->crtc_id;
|
||||
struct kms_crtc *kcrtc = &ksurf->current_crtc;
|
||||
|
||||
if (kcrtc->crtc)
|
||||
drmModeFreeCrtc(kcrtc->crtc);
|
||||
kcrtc->crtc = drmModeGetCrtc(kdpy->fd, crtc_id);
|
||||
|
||||
assert(num_nconns < Elements(kcrtc->connectors));
|
||||
memcpy(kcrtc->connectors, connector_ids,
|
||||
sizeof(*connector_ids) * num_nconns);
|
||||
kcrtc->num_connectors = num_nconns;
|
||||
|
||||
ksurf->is_shown = TRUE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static const struct native_mode **
|
||||
kms_display_get_modes(struct native_display *ndpy,
|
||||
const struct native_connector *nconn,
|
||||
int *num_modes)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
struct kms_connector *kconn = kms_connector(nconn);
|
||||
const struct native_mode **nmodes_return;
|
||||
int count, i;
|
||||
|
||||
/* delete old data */
|
||||
if (kconn->connector) {
|
||||
drmModeFreeConnector(kconn->connector);
|
||||
FREE(kconn->kms_modes);
|
||||
|
||||
kconn->connector = NULL;
|
||||
kconn->kms_modes = NULL;
|
||||
kconn->num_modes = 0;
|
||||
}
|
||||
|
||||
/* detect again */
|
||||
kconn->connector = drmModeGetConnector(kdpy->fd, kconn->connector_id);
|
||||
if (!kconn->connector)
|
||||
return NULL;
|
||||
|
||||
count = kconn->connector->count_modes;
|
||||
kconn->kms_modes = CALLOC(count, sizeof(*kconn->kms_modes));
|
||||
if (!kconn->kms_modes) {
|
||||
drmModeFreeConnector(kconn->connector);
|
||||
kconn->connector = NULL;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
struct kms_mode *kmode = &kconn->kms_modes[i];
|
||||
drmModeModeInfoPtr mode = &kconn->connector->modes[i];
|
||||
|
||||
kmode->mode = *mode;
|
||||
|
||||
kmode->base.desc = kmode->mode.name;
|
||||
kmode->base.width = kmode->mode.hdisplay;
|
||||
kmode->base.height = kmode->mode.vdisplay;
|
||||
kmode->base.refresh_rate = kmode->mode.vrefresh;
|
||||
/* not all kernels have vrefresh = refresh_rate * 1000 */
|
||||
if (kmode->base.refresh_rate > 1000)
|
||||
kmode->base.refresh_rate = (kmode->base.refresh_rate + 500) / 1000;
|
||||
}
|
||||
|
||||
nmodes_return = MALLOC(count * sizeof(*nmodes_return));
|
||||
if (nmodes_return) {
|
||||
for (i = 0; i < count; i++)
|
||||
nmodes_return[i] = &kconn->kms_modes[i].base;
|
||||
if (num_modes)
|
||||
*num_modes = count;
|
||||
}
|
||||
|
||||
return nmodes_return;
|
||||
}
|
||||
|
||||
static const struct native_connector **
|
||||
kms_display_get_connectors(struct native_display *ndpy, int *num_connectors,
|
||||
int *num_crtc)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
const struct native_connector **connectors;
|
||||
int i;
|
||||
|
||||
if (!kdpy->connectors) {
|
||||
kdpy->connectors =
|
||||
CALLOC(kdpy->resources->count_connectors, sizeof(*kdpy->connectors));
|
||||
if (!kdpy->connectors)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < kdpy->resources->count_connectors; i++) {
|
||||
struct kms_connector *kconn = &kdpy->connectors[i];
|
||||
|
||||
kconn->connector_id = kdpy->resources->connectors[i];
|
||||
/* kconn->connector is allocated when the modes are asked */
|
||||
}
|
||||
|
||||
kdpy->num_connectors = kdpy->resources->count_connectors;
|
||||
}
|
||||
|
||||
connectors = MALLOC(kdpy->num_connectors * sizeof(*connectors));
|
||||
if (connectors) {
|
||||
for (i = 0; i < kdpy->num_connectors; i++)
|
||||
connectors[i] = &kdpy->connectors[i].base;
|
||||
if (num_connectors)
|
||||
*num_connectors = kdpy->num_connectors;
|
||||
}
|
||||
|
||||
if (num_crtc)
|
||||
*num_crtc = kdpy->resources->count_crtcs;
|
||||
|
||||
return connectors;
|
||||
}
|
||||
|
||||
static struct native_surface *
|
||||
kms_display_create_scanout_surface(struct native_display *ndpy,
|
||||
const struct native_config *nconf,
|
||||
uint width, uint height)
|
||||
{
|
||||
struct kms_surface *ksurf;
|
||||
|
||||
ksurf = kms_display_create_surface(ndpy, nconf, width, height);
|
||||
return &ksurf->base;
|
||||
}
|
||||
|
||||
static boolean
|
||||
kms_display_is_format_supported(struct native_display *ndpy,
|
||||
enum pipe_format fmt, boolean is_color)
|
||||
{
|
||||
return ndpy->screen->is_format_supported(ndpy->screen,
|
||||
fmt, PIPE_TEXTURE_2D, 0,
|
||||
(is_color) ? PIPE_BIND_RENDER_TARGET :
|
||||
PIPE_BIND_DEPTH_STENCIL, 0);
|
||||
}
|
||||
|
||||
static const struct native_config **
|
||||
kms_display_get_configs(struct native_display *ndpy, int *num_configs)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
const struct native_config **configs;
|
||||
|
||||
/* first time */
|
||||
if (!kdpy->config) {
|
||||
struct native_config *nconf;
|
||||
enum pipe_format format;
|
||||
|
||||
kdpy->config = CALLOC(1, sizeof(*kdpy->config));
|
||||
if (!kdpy->config)
|
||||
return NULL;
|
||||
|
||||
nconf = &kdpy->config->base;
|
||||
|
||||
nconf->buffer_mask =
|
||||
(1 << NATIVE_ATTACHMENT_FRONT_LEFT) |
|
||||
(1 << NATIVE_ATTACHMENT_BACK_LEFT);
|
||||
|
||||
format = PIPE_FORMAT_B8G8R8A8_UNORM;
|
||||
if (!kms_display_is_format_supported(&kdpy->base, format, TRUE)) {
|
||||
format = PIPE_FORMAT_A8R8G8B8_UNORM;
|
||||
if (!kms_display_is_format_supported(&kdpy->base, format, TRUE))
|
||||
format = PIPE_FORMAT_NONE;
|
||||
}
|
||||
if (format == PIPE_FORMAT_NONE) {
|
||||
FREE(kdpy->config);
|
||||
kdpy->config = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
nconf->color_format = format;
|
||||
|
||||
/* support KMS */
|
||||
if (kdpy->resources)
|
||||
nconf->scanout_bit = TRUE;
|
||||
}
|
||||
|
||||
configs = MALLOC(sizeof(*configs));
|
||||
if (configs) {
|
||||
configs[0] = &kdpy->config->base;
|
||||
if (num_configs)
|
||||
*num_configs = 1;
|
||||
}
|
||||
|
||||
return configs;
|
||||
}
|
||||
|
||||
static int
|
||||
kms_display_get_param(struct native_display *ndpy,
|
||||
enum native_param_type param)
|
||||
{
|
||||
int val;
|
||||
|
||||
switch (param) {
|
||||
default:
|
||||
val = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void
|
||||
kms_display_destroy(struct native_display *ndpy)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
int i;
|
||||
|
||||
if (kdpy->config)
|
||||
FREE(kdpy->config);
|
||||
|
||||
if (kdpy->connectors) {
|
||||
for (i = 0; i < kdpy->num_connectors; i++) {
|
||||
struct kms_connector *kconn = &kdpy->connectors[i];
|
||||
if (kconn->connector) {
|
||||
drmModeFreeConnector(kconn->connector);
|
||||
FREE(kconn->kms_modes);
|
||||
}
|
||||
}
|
||||
FREE(kdpy->connectors);
|
||||
}
|
||||
|
||||
if (kdpy->shown_surfaces)
|
||||
FREE(kdpy->shown_surfaces);
|
||||
|
||||
if (kdpy->saved_crtcs) {
|
||||
for (i = 0; i < kdpy->resources->count_crtcs; i++) {
|
||||
struct kms_crtc *kcrtc = &kdpy->saved_crtcs[i];
|
||||
|
||||
if (kcrtc->crtc) {
|
||||
/* restore crtc */
|
||||
drmModeSetCrtc(kdpy->fd, kcrtc->crtc->crtc_id,
|
||||
kcrtc->crtc->buffer_id, kcrtc->crtc->x, kcrtc->crtc->y,
|
||||
kcrtc->connectors, kcrtc->num_connectors,
|
||||
&kcrtc->crtc->mode);
|
||||
|
||||
drmModeFreeCrtc(kcrtc->crtc);
|
||||
}
|
||||
}
|
||||
FREE(kdpy->saved_crtcs);
|
||||
}
|
||||
|
||||
if (kdpy->resources)
|
||||
drmModeFreeResources(kdpy->resources);
|
||||
|
||||
if (kdpy->base.screen)
|
||||
kdpy->base.screen->destroy(kdpy->base.screen);
|
||||
|
||||
if (kdpy->fd >= 0)
|
||||
close(kdpy->fd);
|
||||
|
||||
FREE(kdpy);
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_drm_screen_name(int fd, drmVersionPtr version)
|
||||
{
|
||||
const char *name = version->name;
|
||||
|
||||
if (name && !strcmp(name, "radeon")) {
|
||||
int chip_id;
|
||||
struct drm_radeon_info info;
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
info.request = RADEON_INFO_DEVICE_ID;
|
||||
info.value = pointer_to_intptr(&chip_id);
|
||||
if (drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info)) != 0)
|
||||
return NULL;
|
||||
|
||||
name = is_r3xx(chip_id) ? "r300" : "r600";
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize KMS and pipe screen.
|
||||
*/
|
||||
static boolean
|
||||
kms_display_init_screen(struct native_display *ndpy)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
drmVersionPtr version;
|
||||
const char *name;
|
||||
|
||||
version = drmGetVersion(kdpy->fd);
|
||||
if (!version) {
|
||||
_eglLog(_EGL_WARNING, "invalid fd %d", kdpy->fd);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
name = get_drm_screen_name(kdpy->fd, version);
|
||||
if (name) {
|
||||
kdpy->base.screen =
|
||||
kdpy->event_handler->new_drm_screen(&kdpy->base, name, kdpy->fd);
|
||||
}
|
||||
drmFreeVersion(version);
|
||||
|
||||
if (!kdpy->base.screen) {
|
||||
_eglLog(_EGL_WARNING, "failed to create DRM screen");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static struct native_display_modeset kms_display_modeset = {
|
||||
.get_connectors = kms_display_get_connectors,
|
||||
.get_modes = kms_display_get_modes,
|
||||
.create_scanout_surface = kms_display_create_scanout_surface,
|
||||
.program = kms_display_program
|
||||
};
|
||||
|
||||
static struct native_display *
|
||||
kms_create_display(int fd, struct native_event_handler *event_handler,
|
||||
void *user_data)
|
||||
{
|
||||
struct kms_display *kdpy;
|
||||
|
||||
kdpy = CALLOC_STRUCT(kms_display);
|
||||
if (!kdpy)
|
||||
return NULL;
|
||||
|
||||
kdpy->fd = fd;
|
||||
kdpy->event_handler = event_handler;
|
||||
kdpy->base.user_data = user_data;
|
||||
|
||||
if (!kms_display_init_screen(&kdpy->base)) {
|
||||
kms_display_destroy(&kdpy->base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
kdpy->base.destroy = kms_display_destroy;
|
||||
kdpy->base.get_param = kms_display_get_param;
|
||||
kdpy->base.get_configs = kms_display_get_configs;
|
||||
|
||||
/* resources are fixed, unlike crtc, connector, or encoder */
|
||||
kdpy->resources = drmModeGetResources(kdpy->fd);
|
||||
if (kdpy->resources) {
|
||||
kdpy->saved_crtcs =
|
||||
CALLOC(kdpy->resources->count_crtcs, sizeof(*kdpy->saved_crtcs));
|
||||
if (!kdpy->saved_crtcs) {
|
||||
kms_display_destroy(&kdpy->base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
kdpy->shown_surfaces =
|
||||
CALLOC(kdpy->resources->count_crtcs, sizeof(*kdpy->shown_surfaces));
|
||||
if (!kdpy->shown_surfaces) {
|
||||
kms_display_destroy(&kdpy->base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
kdpy->base.modeset = &kms_display_modeset;
|
||||
}
|
||||
else {
|
||||
_eglLog(_EGL_DEBUG, "Failed to get KMS resources. Disable modeset.");
|
||||
}
|
||||
|
||||
return &kdpy->base;
|
||||
}
|
||||
|
||||
static struct native_display *
|
||||
native_create_display(void *dpy, struct native_event_handler *event_handler,
|
||||
void *user_data)
|
||||
{
|
||||
int fd;
|
||||
|
||||
if (dpy) {
|
||||
fd = dup((int) pointer_to_intptr(dpy));
|
||||
}
|
||||
else {
|
||||
fd = open("/dev/dri/card0", O_RDWR);
|
||||
}
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
|
||||
return kms_create_display(fd, event_handler, user_data);
|
||||
}
|
||||
|
||||
static const struct native_platform kms_platform = {
|
||||
"KMS", /* name */
|
||||
native_create_display
|
||||
};
|
||||
|
||||
const struct native_platform *
|
||||
native_get_kms_platform(void)
|
||||
{
|
||||
return &kms_platform;
|
||||
}
|
@@ -1086,20 +1086,30 @@ XMesaDestroyBuffer(XMesaBuffer b)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Notify the binding context to validate the buffer.
|
||||
*/
|
||||
void
|
||||
xmesa_notify_invalid_buffer(XMesaBuffer b)
|
||||
{
|
||||
XMesaContext xmctx = XMesaGetCurrentContext();
|
||||
|
||||
if (xmctx && xmctx->xm_buffer == b)
|
||||
xmctx->st->notify_invalid_framebuffer(xmctx->st, b->stfb);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Query the current drawable size and notify the binding context.
|
||||
*/
|
||||
void
|
||||
xmesa_check_buffer_size(XMesaBuffer b)
|
||||
{
|
||||
XMesaContext xmctx = XMesaGetCurrentContext();
|
||||
|
||||
if (b->type == PBUFFER)
|
||||
return;
|
||||
|
||||
xmesa_get_window_size(b->xm_visual->display, b, &b->width, &b->height);
|
||||
if (xmctx && xmctx->xm_buffer == b)
|
||||
xmctx->st->notify_invalid_framebuffer(xmctx->st, b->stfb);
|
||||
xmesa_notify_invalid_buffer(b);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -360,6 +360,9 @@ extern void
|
||||
xmesa_get_window_size(Display *dpy, XMesaBuffer b,
|
||||
GLuint *width, GLuint *height);
|
||||
|
||||
extern void
|
||||
xmesa_notify_invalid_buffer(XMesaBuffer b);
|
||||
|
||||
extern void
|
||||
xmesa_check_buffer_size(XMesaBuffer b);
|
||||
|
||||
|
@@ -339,6 +339,10 @@ xmesa_swap_st_framebuffer(struct st_framebuffer_iface *stfbi)
|
||||
tmp = *front;
|
||||
*front = *back;
|
||||
*back = tmp;
|
||||
|
||||
/* the current context should validate the buffer after swapping */
|
||||
if (!xmesa_strict_invalidate)
|
||||
xmesa_notify_invalid_buffer(xstfb->buffer);
|
||||
}
|
||||
|
||||
if (xmesa_strict_invalidate)
|
||||
|
@@ -69,6 +69,7 @@ COMMON_DRI_DRM_OBJECTS = [
|
||||
|
||||
drienv.AppendUnique(LIBS = [
|
||||
'expat',
|
||||
'talloc',
|
||||
])
|
||||
|
||||
Export([
|
||||
|
@@ -11,6 +11,7 @@ env.ParseConfig('pkg-config --cflags --libs libdrm_intel')
|
||||
env.Append(CPPDEFINES = ['GALLIUM_RBUG', 'GALLIUM_TRACE', 'GALLIUM_GALAHAD'])
|
||||
|
||||
env.Prepend(LIBS = [
|
||||
ws_wrapper,
|
||||
st_dri,
|
||||
i915drm,
|
||||
i915,
|
||||
|
@@ -185,6 +185,13 @@ $(MKLIB) -o $(notdir $@) -noprefix -linker '$(CC)' -ldflags '$(LDFLAGS)' \
|
||||
$(common_SYS) $($(1)_SYS)
|
||||
endef
|
||||
|
||||
define mklib-cxx
|
||||
$(MKLIB) -o $(notdir $@) -noprefix -linker '$(CXX)' -ldflags '$(LDFLAGS)' \
|
||||
-cplusplus -install $(OUTPUT_PATH) $(MKLIB_OPTIONS) $< \
|
||||
-Wl,--start-group $(common_LIBS) $($(1)_LIBS) -Wl,--end-group \
|
||||
$(common_SYS) $($(1)_SYS)
|
||||
endef
|
||||
|
||||
# EGL driver
|
||||
$(OUTPUT_PATH)/egl_gallium.so: egl.o $(egl_LIBS)
|
||||
$(call mklib,egl)
|
||||
@@ -213,13 +220,13 @@ $(OUTPUT_PATH)/$(PIPE_PREFIX)swrast.so: pipe_swrast.o $(swrast_LIBS)
|
||||
|
||||
# state trackers
|
||||
$(OUTPUT_PATH)/$(ST_PREFIX)$(GL_LIB).so: st_GL.o $(GL_LIBS)
|
||||
$(call mklib,GL)
|
||||
$(call mklib-cxx,GL)
|
||||
|
||||
$(OUTPUT_PATH)/$(ST_PREFIX)$(GLESv1_CM_LIB).so: st_GLESv1_CM.o $(GLESv1_CM_LIBS)
|
||||
$(call mklib,GLESv1_CM)
|
||||
$(call mklib-cxx,GLESv1_CM)
|
||||
|
||||
$(OUTPUT_PATH)/$(ST_PREFIX)$(GLESv2_LIB).so: st_GLESv2.o $(GLESv2_LIBS)
|
||||
$(call mklib,GLESv2)
|
||||
$(call mklib-cxx,GLESv2)
|
||||
|
||||
$(OUTPUT_PATH)/$(ST_PREFIX)$(VG_LIB).so: st_OpenVG.o $(OpenVG_LIBS)
|
||||
$(call mklib,OpenVG)
|
||||
|
@@ -39,14 +39,6 @@
|
||||
#include "state_tracker/st_api.h"
|
||||
#include "state_tracker/st_gl_api.h"
|
||||
|
||||
/* piggy back on this libGL for OpenGL support in EGL */
|
||||
struct st_api *
|
||||
st_api_create_OpenGL()
|
||||
{
|
||||
return st_gl_api_create();
|
||||
}
|
||||
|
||||
|
||||
/* Helper function to choose and instantiate one of the software rasterizers:
|
||||
* cell, llvmpipe, softpipe.
|
||||
*
|
||||
|
@@ -5,13 +5,16 @@
|
||||
#include "radeon_cs_gem.h"
|
||||
#include "radeon_buffer.h"
|
||||
|
||||
#include "util/u_hash_table.h"
|
||||
#include "util/u_inlines.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_simple_list.h"
|
||||
#include "pipebuffer/pb_buffer.h"
|
||||
#include "pipebuffer/pb_bufmgr.h"
|
||||
#include "os/os_thread.h"
|
||||
|
||||
#include "radeon_winsys.h"
|
||||
|
||||
struct radeon_drm_bufmgr;
|
||||
|
||||
struct radeon_drm_buffer {
|
||||
@@ -38,9 +41,19 @@ radeon_drm_buffer(struct pb_buffer *buf)
|
||||
}
|
||||
|
||||
struct radeon_drm_bufmgr {
|
||||
/* Base class. */
|
||||
struct pb_manager base;
|
||||
|
||||
/* Winsys. */
|
||||
struct radeon_libdrm_winsys *rws;
|
||||
|
||||
/* List of mapped buffers and its mutex. */
|
||||
struct radeon_drm_buffer buffer_map_list;
|
||||
pipe_mutex buffer_map_list_mutex;
|
||||
|
||||
/* List of buffer handles and its mutex. */
|
||||
struct util_hash_table *buffer_handles;
|
||||
pipe_mutex buffer_handles_mutex;
|
||||
};
|
||||
|
||||
static INLINE struct radeon_drm_bufmgr *
|
||||
@@ -54,11 +67,24 @@ static void
|
||||
radeon_drm_buffer_destroy(struct pb_buffer *_buf)
|
||||
{
|
||||
struct radeon_drm_buffer *buf = radeon_drm_buffer(_buf);
|
||||
int name;
|
||||
|
||||
if (buf->bo->ptr != NULL) {
|
||||
remove_from_list(buf);
|
||||
radeon_bo_unmap(buf->bo);
|
||||
buf->bo->ptr = NULL;
|
||||
pipe_mutex_lock(buf->mgr->buffer_map_list_mutex);
|
||||
/* Now test it again inside the mutex. */
|
||||
if (buf->bo->ptr != NULL) {
|
||||
remove_from_list(buf);
|
||||
radeon_bo_unmap(buf->bo);
|
||||
buf->bo->ptr = NULL;
|
||||
}
|
||||
pipe_mutex_unlock(buf->mgr->buffer_map_list_mutex);
|
||||
}
|
||||
name = radeon_gem_name_bo(buf->bo);
|
||||
if (name) {
|
||||
pipe_mutex_lock(buf->mgr->buffer_handles_mutex);
|
||||
util_hash_table_remove(buf->mgr->buffer_handles,
|
||||
(void*)(uintptr_t)name);
|
||||
pipe_mutex_unlock(buf->mgr->buffer_handles_mutex);
|
||||
}
|
||||
radeon_bo_unref(buf->bo);
|
||||
|
||||
@@ -110,8 +136,16 @@ radeon_drm_buffer_map_internal(struct pb_buffer *_buf,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (buf->bo->ptr != NULL)
|
||||
if (buf->bo->ptr != NULL) {
|
||||
pipe_mutex_lock(buf->mgr->buffer_map_list_mutex);
|
||||
/* Now test ptr again inside the mutex. We might have gotten a race
|
||||
* during the first test. */
|
||||
if (buf->bo->ptr != NULL) {
|
||||
remove_from_list(buf);
|
||||
}
|
||||
pipe_mutex_unlock(buf->mgr->buffer_map_list_mutex);
|
||||
return buf->bo->ptr;
|
||||
}
|
||||
|
||||
if (flags & PB_USAGE_DONTBLOCK) {
|
||||
uint32_t domain;
|
||||
@@ -134,14 +168,22 @@ radeon_drm_buffer_map_internal(struct pb_buffer *_buf,
|
||||
if (radeon_bo_map(buf->bo, write)) {
|
||||
return NULL;
|
||||
}
|
||||
insert_at_tail(&buf->mgr->buffer_map_list, buf);
|
||||
|
||||
pipe_mutex_lock(buf->mgr->buffer_map_list_mutex);
|
||||
remove_from_list(buf);
|
||||
pipe_mutex_unlock(buf->mgr->buffer_map_list_mutex);
|
||||
return buf->bo->ptr;
|
||||
}
|
||||
|
||||
static void
|
||||
radeon_drm_buffer_unmap_internal(struct pb_buffer *_buf)
|
||||
{
|
||||
(void)_buf;
|
||||
struct radeon_drm_buffer *buf = radeon_drm_buffer(_buf);
|
||||
pipe_mutex_lock(buf->mgr->buffer_map_list_mutex);
|
||||
if (is_empty_list(buf)) { /* = is not inserted... */
|
||||
insert_at_tail(&buf->mgr->buffer_map_list, buf);
|
||||
}
|
||||
pipe_mutex_unlock(buf->mgr->buffer_map_list_mutex);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -178,14 +220,23 @@ const struct pb_vtbl radeon_drm_buffer_vtbl = {
|
||||
radeon_drm_buffer_get_base_buffer,
|
||||
};
|
||||
|
||||
struct pb_buffer *radeon_drm_bufmgr_create_buffer_from_handle(struct pb_manager *_mgr,
|
||||
uint32_t handle)
|
||||
static struct pb_buffer *
|
||||
radeon_drm_bufmgr_create_buffer_from_handle_unsafe(struct pb_manager *_mgr,
|
||||
uint32_t handle)
|
||||
{
|
||||
struct radeon_drm_bufmgr *mgr = radeon_drm_bufmgr(_mgr);
|
||||
struct radeon_libdrm_winsys *rws = mgr->rws;
|
||||
struct radeon_drm_buffer *buf;
|
||||
struct radeon_bo *bo;
|
||||
|
||||
buf = util_hash_table_get(mgr->buffer_handles, (void*)(uintptr_t)handle);
|
||||
|
||||
if (buf) {
|
||||
struct pb_buffer *b = NULL;
|
||||
pb_reference(&b, &buf->base);
|
||||
return b;
|
||||
}
|
||||
|
||||
bo = radeon_bo_open(rws->bom, handle, 0,
|
||||
0, 0, 0);
|
||||
if (bo == NULL)
|
||||
@@ -208,9 +259,25 @@ struct pb_buffer *radeon_drm_bufmgr_create_buffer_from_handle(struct pb_manager
|
||||
|
||||
buf->bo = bo;
|
||||
|
||||
util_hash_table_set(mgr->buffer_handles, (void*)(uintptr_t)handle, buf);
|
||||
|
||||
return &buf->base;
|
||||
}
|
||||
|
||||
struct pb_buffer *
|
||||
radeon_drm_bufmgr_create_buffer_from_handle(struct pb_manager *_mgr,
|
||||
uint32_t handle)
|
||||
{
|
||||
struct radeon_drm_bufmgr *mgr = radeon_drm_bufmgr(_mgr);
|
||||
struct pb_buffer *pb;
|
||||
|
||||
pipe_mutex_lock(mgr->buffer_handles_mutex);
|
||||
pb = radeon_drm_bufmgr_create_buffer_from_handle_unsafe(_mgr, handle);
|
||||
pipe_mutex_unlock(mgr->buffer_handles_mutex);
|
||||
|
||||
return pb;
|
||||
}
|
||||
|
||||
static struct pb_buffer *
|
||||
radeon_drm_bufmgr_create_buffer(struct pb_manager *_mgr,
|
||||
pb_size size,
|
||||
@@ -261,9 +328,22 @@ static void
|
||||
radeon_drm_bufmgr_destroy(struct pb_manager *_mgr)
|
||||
{
|
||||
struct radeon_drm_bufmgr *mgr = radeon_drm_bufmgr(_mgr);
|
||||
util_hash_table_destroy(mgr->buffer_handles);
|
||||
pipe_mutex_destroy(mgr->buffer_map_list_mutex);
|
||||
pipe_mutex_destroy(mgr->buffer_handles_mutex);
|
||||
FREE(mgr);
|
||||
}
|
||||
|
||||
static unsigned handle_hash(void *key)
|
||||
{
|
||||
return (unsigned)key;
|
||||
}
|
||||
|
||||
static int handle_compare(void *key1, void *key2)
|
||||
{
|
||||
return !((int)key1 == (int)key2);
|
||||
}
|
||||
|
||||
struct pb_manager *
|
||||
radeon_drm_bufmgr_create(struct radeon_libdrm_winsys *rws)
|
||||
{
|
||||
@@ -279,6 +359,9 @@ radeon_drm_bufmgr_create(struct radeon_libdrm_winsys *rws)
|
||||
|
||||
mgr->rws = rws;
|
||||
make_empty_list(&mgr->buffer_map_list);
|
||||
mgr->buffer_handles = util_hash_table_create(handle_hash, handle_compare);
|
||||
pipe_mutex_init(mgr->buffer_map_list_mutex);
|
||||
pipe_mutex_init(mgr->buffer_handles_mutex);
|
||||
return &mgr->base;
|
||||
}
|
||||
|
||||
@@ -454,6 +537,8 @@ void radeon_drm_bufmgr_flush_maps(struct pb_manager *_mgr)
|
||||
struct radeon_drm_bufmgr *mgr = radeon_drm_bufmgr(_mgr);
|
||||
struct radeon_drm_buffer *rpb, *t_rpb;
|
||||
|
||||
pipe_mutex_lock(mgr->buffer_map_list_mutex);
|
||||
|
||||
foreach_s(rpb, t_rpb, &mgr->buffer_map_list) {
|
||||
radeon_bo_unmap(rpb->bo);
|
||||
rpb->bo->ptr = NULL;
|
||||
@@ -461,6 +546,8 @@ void radeon_drm_bufmgr_flush_maps(struct pb_manager *_mgr)
|
||||
}
|
||||
|
||||
make_empty_list(&mgr->buffer_map_list);
|
||||
|
||||
pipe_mutex_unlock(mgr->buffer_map_list_mutex);
|
||||
}
|
||||
|
||||
void radeon_drm_bufmgr_wait(struct r300_winsys_screen *ws,
|
||||
|
@@ -250,6 +250,7 @@ static void radeon_r300_winsys_cs_destroy(struct r300_winsys_cs *rcs)
|
||||
{
|
||||
struct radeon_libdrm_cs *cs = radeon_libdrm_cs(rcs);
|
||||
radeon_cs_destroy(cs->cs);
|
||||
FREE(cs);
|
||||
}
|
||||
|
||||
static void radeon_winsys_destroy(struct r300_winsys_screen *rws)
|
||||
@@ -261,6 +262,8 @@ static void radeon_winsys_destroy(struct r300_winsys_screen *rws)
|
||||
|
||||
radeon_bo_manager_gem_dtor(ws->bom);
|
||||
radeon_cs_manager_gem_dtor(ws->csm);
|
||||
|
||||
FREE(rws);
|
||||
}
|
||||
|
||||
boolean radeon_setup_winsys(int fd, struct radeon_libdrm_winsys* ws)
|
||||
|
@@ -76,6 +76,7 @@ CXX_SOURCES = \
|
||||
loop_controls.cpp \
|
||||
loop_unroll.cpp \
|
||||
lower_noise.cpp \
|
||||
lower_variable_index_to_cond_assign.cpp \
|
||||
opt_redundant_jumps.cpp \
|
||||
s_expression.cpp
|
||||
|
||||
|
@@ -67,6 +67,7 @@ glsl_SOURCES = \
|
||||
loop_controls.cpp \
|
||||
loop_unroll.cpp \
|
||||
lower_noise.cpp \
|
||||
lower_variable_index_to_cond_assign.cpp \
|
||||
opt_redundant_jumps.cpp
|
||||
|
||||
BUILT_SOURCES = glsl_parser.h glsl_parser.cpp glsl_lexer.cpp
|
||||
|
@@ -73,6 +73,7 @@ sources = [
|
||||
'loop_controls.cpp',
|
||||
'loop_unroll.cpp',
|
||||
'lower_noise.cpp',
|
||||
'lower_variable_index_to_cond_assign.cpp',
|
||||
'opt_redundant_jumps.cpp',
|
||||
's_expression.cpp',
|
||||
]
|
||||
|
@@ -33,6 +33,20 @@ struct _mesa_glsl_parse_state;
|
||||
|
||||
struct YYLTYPE;
|
||||
|
||||
/**
|
||||
* \defgroup AST Abstract syntax tree node definitions
|
||||
*
|
||||
* An abstract syntax tree is generated by the parser. This is a fairly
|
||||
* direct representation of the gramma derivation for the source program.
|
||||
* No symantic checking is done during the generation of the AST. Only
|
||||
* syntactic checking is done. Symantic checking is performed by a later
|
||||
* stage that converts the AST to a more generic intermediate representation.
|
||||
*
|
||||
*@{
|
||||
*/
|
||||
/**
|
||||
* Base class of all abstract syntax tree nodes
|
||||
*/
|
||||
class ast_node {
|
||||
public:
|
||||
/* Callers of this talloc-based new need not call delete. It's
|
||||
@@ -54,7 +68,14 @@ public:
|
||||
talloc_free(table);
|
||||
}
|
||||
|
||||
/**
|
||||
* Print an AST node in something approximating the original GLSL code
|
||||
*/
|
||||
virtual void print(void) const;
|
||||
|
||||
/**
|
||||
* Convert the AST node to the high-level intermediate representation
|
||||
*/
|
||||
virtual ir_rvalue *hir(exec_list *instructions,
|
||||
struct _mesa_glsl_parse_state *state);
|
||||
|
||||
@@ -91,19 +112,29 @@ public:
|
||||
this->location.column = locp.first_column;
|
||||
}
|
||||
|
||||
/**
|
||||
* Source location of the AST node.
|
||||
*/
|
||||
struct {
|
||||
unsigned source;
|
||||
unsigned line;
|
||||
unsigned column;
|
||||
unsigned source; /**< GLSL source number. */
|
||||
unsigned line; /**< Line number within the source string. */
|
||||
unsigned column; /**< Column in the line. */
|
||||
} location;
|
||||
|
||||
exec_node link;
|
||||
|
||||
protected:
|
||||
/**
|
||||
* The only constructor is protected so that only derived class objects can
|
||||
* be created.
|
||||
*/
|
||||
ast_node(void);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Operators for AST expression nodes.
|
||||
*/
|
||||
enum ast_operators {
|
||||
ast_assign,
|
||||
ast_plus, /**< Unary + operator. */
|
||||
@@ -161,6 +192,9 @@ enum ast_operators {
|
||||
ast_sequence
|
||||
};
|
||||
|
||||
/**
|
||||
* Representation of any sort of expression.
|
||||
*/
|
||||
class ast_expression : public ast_node {
|
||||
public:
|
||||
ast_expression(int oper, ast_expression *,
|
||||
@@ -651,7 +685,7 @@ public:
|
||||
ast_function *prototype;
|
||||
ast_compound_statement *body;
|
||||
};
|
||||
|
||||
/*@}*/
|
||||
|
||||
extern void
|
||||
_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state);
|
||||
|
@@ -1534,17 +1534,12 @@ ast_type_specifier::glsl_type(const char **name,
|
||||
{
|
||||
const struct glsl_type *type;
|
||||
|
||||
if ((this->type_specifier == ast_struct) && (this->type_name == NULL)) {
|
||||
/* FINISHME: Handle annonymous structures. */
|
||||
type = NULL;
|
||||
} else {
|
||||
type = state->symbols->get_type(this->type_name);
|
||||
*name = this->type_name;
|
||||
type = state->symbols->get_type(this->type_name);
|
||||
*name = this->type_name;
|
||||
|
||||
if (this->is_array) {
|
||||
YYLTYPE loc = this->get_location();
|
||||
type = process_array_type(&loc, type, this->array_size, state);
|
||||
}
|
||||
if (this->is_array) {
|
||||
YYLTYPE loc = this->get_location();
|
||||
type = process_array_type(&loc, type, this->array_size, state);
|
||||
}
|
||||
|
||||
return type;
|
||||
@@ -2285,7 +2280,7 @@ ast_function::hir(exec_list *instructions,
|
||||
* that the previously seen signature does not have an associated definition.
|
||||
*/
|
||||
f = state->symbols->get_function(name);
|
||||
if (f != NULL && (state->es_shader || !f->has_builtin_signature())) {
|
||||
if (f != NULL && (state->es_shader || f->has_user_signature())) {
|
||||
sig = f->exact_matching_signature(&hir_parameters);
|
||||
if (sig != NULL) {
|
||||
const char *badvar = sig->qualifiers_match(&hir_parameters);
|
||||
@@ -2705,7 +2700,6 @@ ast_struct_specifier::hir(exec_list *instructions,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Allocate storage for the structure fields and process the field
|
||||
* declarations. As the declarations are processed, try to also convert
|
||||
* the types to HIR. This ensures that structure definitions embedded in
|
||||
@@ -2750,21 +2744,8 @@ ast_struct_specifier::hir(exec_list *instructions,
|
||||
|
||||
assert(i == decl_count);
|
||||
|
||||
const char *name;
|
||||
if (this->name == NULL) {
|
||||
static unsigned anon_count = 1;
|
||||
char buf[32];
|
||||
|
||||
snprintf(buf, sizeof(buf), "#anon_struct_%04x", anon_count);
|
||||
anon_count++;
|
||||
|
||||
name = strdup(buf);
|
||||
} else {
|
||||
name = this->name;
|
||||
}
|
||||
|
||||
const glsl_type *t =
|
||||
glsl_type::get_record_instance(fields, decl_count, name);
|
||||
glsl_type::get_record_instance(fields, decl_count, this->name);
|
||||
|
||||
YYLTYPE loc = this->get_location();
|
||||
if (!state->symbols->add_type(name, t)) {
|
||||
|
@@ -787,73 +787,73 @@ static const char *builtin_equal =
|
||||
" (parameters\n"
|
||||
" (declare (in) vec2 arg0)\n"
|
||||
" (declare (in) vec2 arg1))\n"
|
||||
" ((return (expression bvec2 all_equal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec2 == (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec3 arg0)\n"
|
||||
" (declare (in) vec3 arg1))\n"
|
||||
" ((return (expression bvec3 all_equal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec3 == (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec4 arg0)\n"
|
||||
" (declare (in) vec4 arg1))\n"
|
||||
" ((return (expression bvec4 all_equal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec4 == (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) bvec2 arg0)\n"
|
||||
" (declare (in) bvec2 arg1))\n"
|
||||
" ((return (expression bvec2 all_equal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec2 == (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) bvec3 arg0)\n"
|
||||
" (declare (in) bvec3 arg1))\n"
|
||||
" ((return (expression bvec3 all_equal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec3 == (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) bvec4 arg0)\n"
|
||||
" (declare (in) bvec4 arg1))\n"
|
||||
" ((return (expression bvec4 all_equal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec4 == (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec2 arg0)\n"
|
||||
" (declare (in) ivec2 arg1))\n"
|
||||
" ((return (expression bvec2 all_equal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec2 == (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec3 arg0)\n"
|
||||
" (declare (in) ivec3 arg1))\n"
|
||||
" ((return (expression bvec3 all_equal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec3 == (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec4 arg0)\n"
|
||||
" (declare (in) ivec4 arg1))\n"
|
||||
" ((return (expression bvec4 all_equal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec4 == (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec2 arg0)\n"
|
||||
" (declare (in) uvec2 arg1))\n"
|
||||
" ((return (expression bvec2 all_equal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec2 == (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec3 arg0)\n"
|
||||
" (declare (in) uvec3 arg1))\n"
|
||||
" ((return (expression bvec3 all_equal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec3 == (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec4 arg0)\n"
|
||||
" (declare (in) uvec4 arg1))\n"
|
||||
" ((return (expression bvec4 all_equal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec4 == (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"))\n"
|
||||
""
|
||||
;
|
||||
@@ -1044,91 +1044,55 @@ static const char *builtin_greaterThan =
|
||||
" (parameters\n"
|
||||
" (declare (in) vec2 arg0)\n"
|
||||
" (declare (in) vec2 arg1))\n"
|
||||
" ((declare () bvec2 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec2 > (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec3 arg0)\n"
|
||||
" (declare (in) vec3 arg1))\n"
|
||||
" ((declare () bvec3 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool > (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec3 > (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec4 arg0)\n"
|
||||
" (declare (in) vec4 arg1))\n"
|
||||
" ((declare () bvec4 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool > (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (w) (var_ref temp) (expression bool > (swiz w (var_ref arg0))(swiz w (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec4 > (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec2 arg0)\n"
|
||||
" (declare (in) ivec2 arg1))\n"
|
||||
" ((declare () bvec2 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec2 > (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec3 arg0)\n"
|
||||
" (declare (in) ivec3 arg1))\n"
|
||||
" ((declare () bvec3 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool > (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec3 > (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec4 arg0)\n"
|
||||
" (declare (in) ivec4 arg1))\n"
|
||||
" ((declare () bvec4 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool > (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (w) (var_ref temp) (expression bool > (swiz w (var_ref arg0))(swiz w (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec4 > (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec2 arg0)\n"
|
||||
" (declare (in) uvec2 arg1))\n"
|
||||
" ((declare () bvec2 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec2 > (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec3 arg0)\n"
|
||||
" (declare (in) uvec3 arg1))\n"
|
||||
" ((declare () bvec3 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool > (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec3 > (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec4 arg0)\n"
|
||||
" (declare (in) uvec4 arg1))\n"
|
||||
" ((declare () bvec4 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool > (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (w) (var_ref temp) (expression bool > (swiz w (var_ref arg0))(swiz w (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec4 > (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"))\n"
|
||||
""
|
||||
;
|
||||
@@ -1138,91 +1102,55 @@ static const char *builtin_greaterThanEqual =
|
||||
" (parameters\n"
|
||||
" (declare (in) vec2 arg0)\n"
|
||||
" (declare (in) vec2 arg1))\n"
|
||||
" ((declare () bvec2 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec2 >= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec3 arg0)\n"
|
||||
" (declare (in) vec3 arg1))\n"
|
||||
" ((declare () bvec3 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool >= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec3 >= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec4 arg0)\n"
|
||||
" (declare (in) vec4 arg1))\n"
|
||||
" ((declare () bvec4 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool >= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (w) (var_ref temp) (expression bool >= (swiz w (var_ref arg0))(swiz w (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec4 >= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec2 arg0)\n"
|
||||
" (declare (in) ivec2 arg1))\n"
|
||||
" ((declare () bvec2 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec2 >= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec3 arg0)\n"
|
||||
" (declare (in) ivec3 arg1))\n"
|
||||
" ((declare () bvec3 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool >= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec3 >= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec4 arg0)\n"
|
||||
" (declare (in) ivec4 arg1))\n"
|
||||
" ((declare () bvec4 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool >= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (w) (var_ref temp) (expression bool >= (swiz w (var_ref arg0))(swiz w (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec4 >= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec2 arg0)\n"
|
||||
" (declare (in) uvec2 arg1))\n"
|
||||
" ((declare () bvec2 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec2 >= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec3 arg0)\n"
|
||||
" (declare (in) uvec3 arg1))\n"
|
||||
" ((declare () bvec3 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool >= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec3 >= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec4 arg0)\n"
|
||||
" (declare (in) uvec4 arg1))\n"
|
||||
" ((declare () bvec4 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool >= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (w) (var_ref temp) (expression bool >= (swiz w (var_ref arg0))(swiz w (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec4 >= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"))\n"
|
||||
""
|
||||
;
|
||||
@@ -1280,91 +1208,55 @@ static const char *builtin_lessThan =
|
||||
" (parameters\n"
|
||||
" (declare (in) vec2 arg0)\n"
|
||||
" (declare (in) vec2 arg1))\n"
|
||||
" ((declare () bvec2 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec2 < (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec3 arg0)\n"
|
||||
" (declare (in) vec3 arg1))\n"
|
||||
" ((declare () bvec3 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool < (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec3 < (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec4 arg0)\n"
|
||||
" (declare (in) vec4 arg1))\n"
|
||||
" ((declare () bvec4 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool < (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (w) (var_ref temp) (expression bool < (swiz w (var_ref arg0))(swiz w (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec4 < (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec2 arg0)\n"
|
||||
" (declare (in) ivec2 arg1))\n"
|
||||
" ((declare () bvec2 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec2 < (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec3 arg0)\n"
|
||||
" (declare (in) ivec3 arg1))\n"
|
||||
" ((declare () bvec3 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool < (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec3 < (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec4 arg0)\n"
|
||||
" (declare (in) ivec4 arg1))\n"
|
||||
" ((declare () bvec4 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool < (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (w) (var_ref temp) (expression bool < (swiz w (var_ref arg0))(swiz w (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec4 < (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec2 arg0)\n"
|
||||
" (declare (in) uvec2 arg1))\n"
|
||||
" ((declare () bvec2 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec2 < (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec3 arg0)\n"
|
||||
" (declare (in) uvec3 arg1))\n"
|
||||
" ((declare () bvec3 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool < (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec3 < (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec4 arg0)\n"
|
||||
" (declare (in) uvec4 arg1))\n"
|
||||
" ((declare () bvec4 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool < (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (w) (var_ref temp) (expression bool < (swiz w (var_ref arg0))(swiz w (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec4 < (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"))\n"
|
||||
""
|
||||
;
|
||||
@@ -1374,91 +1266,55 @@ static const char *builtin_lessThanEqual =
|
||||
" (parameters\n"
|
||||
" (declare (in) vec2 arg0)\n"
|
||||
" (declare (in) vec2 arg1))\n"
|
||||
" ((declare () bvec2 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec2 <= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec3 arg0)\n"
|
||||
" (declare (in) vec3 arg1))\n"
|
||||
" ((declare () bvec3 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool <= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec3 <= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec4 arg0)\n"
|
||||
" (declare (in) vec4 arg1))\n"
|
||||
" ((declare () bvec4 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool <= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (w) (var_ref temp) (expression bool <= (swiz w (var_ref arg0))(swiz w (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec4 <= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec2 arg0)\n"
|
||||
" (declare (in) ivec2 arg1))\n"
|
||||
" ((declare () bvec2 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec2 <= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec3 arg0)\n"
|
||||
" (declare (in) ivec3 arg1))\n"
|
||||
" ((declare () bvec3 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool <= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec3 <= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec4 arg0)\n"
|
||||
" (declare (in) ivec4 arg1))\n"
|
||||
" ((declare () bvec4 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool <= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (w) (var_ref temp) (expression bool <= (swiz w (var_ref arg0))(swiz w (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec4 <= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec2 arg0)\n"
|
||||
" (declare (in) uvec2 arg1))\n"
|
||||
" ((declare () bvec2 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec2 <= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec3 arg0)\n"
|
||||
" (declare (in) uvec3 arg1))\n"
|
||||
" ((declare () bvec3 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool <= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec3 <= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec4 arg0)\n"
|
||||
" (declare (in) uvec4 arg1))\n"
|
||||
" ((declare () bvec4 temp)\n"
|
||||
" (assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (z) (var_ref temp) (expression bool <= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))\n"
|
||||
" (assign (constant bool (1)) (w) (var_ref temp) (expression bool <= (swiz w (var_ref arg0))(swiz w (var_ref arg1))))\n"
|
||||
" (return (var_ref temp))))\n"
|
||||
" ((return (expression bvec4 <= (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"))\n"
|
||||
""
|
||||
;
|
||||
@@ -2311,73 +2167,73 @@ static const char *builtin_notEqual =
|
||||
" (parameters\n"
|
||||
" (declare (in) vec2 arg0)\n"
|
||||
" (declare (in) vec2 arg1))\n"
|
||||
" ((return (expression bvec2 any_nequal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec2 != (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec3 arg0)\n"
|
||||
" (declare (in) vec3 arg1))\n"
|
||||
" ((return (expression bvec3 any_nequal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec3 != (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec4 arg0)\n"
|
||||
" (declare (in) vec4 arg1))\n"
|
||||
" ((return (expression bvec4 any_nequal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec4 != (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) bvec2 arg0)\n"
|
||||
" (declare (in) bvec2 arg1))\n"
|
||||
" ((return (expression bvec2 any_nequal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec2 != (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) bvec3 arg0)\n"
|
||||
" (declare (in) bvec3 arg1))\n"
|
||||
" ((return (expression bvec3 any_nequal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec3 != (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) bvec4 arg0)\n"
|
||||
" (declare (in) bvec4 arg1))\n"
|
||||
" ((return (expression bvec4 any_nequal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec4 != (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec2 arg0)\n"
|
||||
" (declare (in) ivec2 arg1))\n"
|
||||
" ((return (expression bvec2 any_nequal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec2 != (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec3 arg0)\n"
|
||||
" (declare (in) ivec3 arg1))\n"
|
||||
" ((return (expression bvec3 any_nequal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec3 != (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) ivec4 arg0)\n"
|
||||
" (declare (in) ivec4 arg1))\n"
|
||||
" ((return (expression bvec4 any_nequal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec4 != (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec2 arg0)\n"
|
||||
" (declare (in) uvec2 arg1))\n"
|
||||
" ((return (expression bvec2 any_nequal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec2 != (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec3 arg0)\n"
|
||||
" (declare (in) uvec3 arg1))\n"
|
||||
" ((return (expression bvec3 any_nequal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec3 != (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"\n"
|
||||
" (signature bvec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) uvec4 arg0)\n"
|
||||
" (declare (in) uvec4 arg1))\n"
|
||||
" ((return (expression bvec4 any_nequal (var_ref arg0) (var_ref arg1)))))\n"
|
||||
" ((return (expression bvec4 != (var_ref arg0) (var_ref arg1)))))\n"
|
||||
"))\n"
|
||||
""
|
||||
;
|
||||
|
@@ -3,71 +3,71 @@
|
||||
(parameters
|
||||
(declare (in) vec2 arg0)
|
||||
(declare (in) vec2 arg1))
|
||||
((return (expression bvec2 all_equal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec2 == (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) vec3 arg0)
|
||||
(declare (in) vec3 arg1))
|
||||
((return (expression bvec3 all_equal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec3 == (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) vec4 arg0)
|
||||
(declare (in) vec4 arg1))
|
||||
((return (expression bvec4 all_equal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec4 == (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec2
|
||||
(parameters
|
||||
(declare (in) bvec2 arg0)
|
||||
(declare (in) bvec2 arg1))
|
||||
((return (expression bvec2 all_equal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec2 == (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) bvec3 arg0)
|
||||
(declare (in) bvec3 arg1))
|
||||
((return (expression bvec3 all_equal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec3 == (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) bvec4 arg0)
|
||||
(declare (in) bvec4 arg1))
|
||||
((return (expression bvec4 all_equal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec4 == (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec2
|
||||
(parameters
|
||||
(declare (in) ivec2 arg0)
|
||||
(declare (in) ivec2 arg1))
|
||||
((return (expression bvec2 all_equal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec2 == (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) ivec3 arg0)
|
||||
(declare (in) ivec3 arg1))
|
||||
((return (expression bvec3 all_equal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec3 == (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) ivec4 arg0)
|
||||
(declare (in) ivec4 arg1))
|
||||
((return (expression bvec4 all_equal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec4 == (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec2
|
||||
(parameters
|
||||
(declare (in) uvec2 arg0)
|
||||
(declare (in) uvec2 arg1))
|
||||
((return (expression bvec2 all_equal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec2 == (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) uvec3 arg0)
|
||||
(declare (in) uvec3 arg1))
|
||||
((return (expression bvec3 all_equal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec3 == (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) uvec4 arg0)
|
||||
(declare (in) uvec4 arg1))
|
||||
((return (expression bvec4 all_equal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec4 == (var_ref arg0) (var_ref arg1)))))
|
||||
))
|
||||
|
@@ -3,89 +3,53 @@
|
||||
(parameters
|
||||
(declare (in) vec2 arg0)
|
||||
(declare (in) vec2 arg1))
|
||||
((declare () bvec2 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec2 > (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) vec3 arg0)
|
||||
(declare (in) vec3 arg1))
|
||||
((declare () bvec3 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool > (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec3 > (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) vec4 arg0)
|
||||
(declare (in) vec4 arg1))
|
||||
((declare () bvec4 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool > (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(assign (constant bool (1)) (w) (var_ref temp) (expression bool > (swiz w (var_ref arg0))(swiz w (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec4 > (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec2
|
||||
(parameters
|
||||
(declare (in) ivec2 arg0)
|
||||
(declare (in) ivec2 arg1))
|
||||
((declare () bvec2 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec2 > (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) ivec3 arg0)
|
||||
(declare (in) ivec3 arg1))
|
||||
((declare () bvec3 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool > (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec3 > (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) ivec4 arg0)
|
||||
(declare (in) ivec4 arg1))
|
||||
((declare () bvec4 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool > (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(assign (constant bool (1)) (w) (var_ref temp) (expression bool > (swiz w (var_ref arg0))(swiz w (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec4 > (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec2
|
||||
(parameters
|
||||
(declare (in) uvec2 arg0)
|
||||
(declare (in) uvec2 arg1))
|
||||
((declare () bvec2 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec2 > (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) uvec3 arg0)
|
||||
(declare (in) uvec3 arg1))
|
||||
((declare () bvec3 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool > (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec3 > (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) uvec4 arg0)
|
||||
(declare (in) uvec4 arg1))
|
||||
((declare () bvec4 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool > (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool > (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool > (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(assign (constant bool (1)) (w) (var_ref temp) (expression bool > (swiz w (var_ref arg0))(swiz w (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec4 > (var_ref arg0) (var_ref arg1)))))
|
||||
))
|
||||
|
@@ -3,89 +3,53 @@
|
||||
(parameters
|
||||
(declare (in) vec2 arg0)
|
||||
(declare (in) vec2 arg1))
|
||||
((declare () bvec2 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec2 >= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) vec3 arg0)
|
||||
(declare (in) vec3 arg1))
|
||||
((declare () bvec3 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool >= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec3 >= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) vec4 arg0)
|
||||
(declare (in) vec4 arg1))
|
||||
((declare () bvec4 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool >= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(assign (constant bool (1)) (w) (var_ref temp) (expression bool >= (swiz w (var_ref arg0))(swiz w (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec4 >= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec2
|
||||
(parameters
|
||||
(declare (in) ivec2 arg0)
|
||||
(declare (in) ivec2 arg1))
|
||||
((declare () bvec2 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec2 >= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) ivec3 arg0)
|
||||
(declare (in) ivec3 arg1))
|
||||
((declare () bvec3 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool >= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec3 >= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) ivec4 arg0)
|
||||
(declare (in) ivec4 arg1))
|
||||
((declare () bvec4 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool >= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(assign (constant bool (1)) (w) (var_ref temp) (expression bool >= (swiz w (var_ref arg0))(swiz w (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec4 >= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec2
|
||||
(parameters
|
||||
(declare (in) uvec2 arg0)
|
||||
(declare (in) uvec2 arg1))
|
||||
((declare () bvec2 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec2 >= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) uvec3 arg0)
|
||||
(declare (in) uvec3 arg1))
|
||||
((declare () bvec3 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool >= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec3 >= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) uvec4 arg0)
|
||||
(declare (in) uvec4 arg1))
|
||||
((declare () bvec4 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool >= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool >= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool >= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(assign (constant bool (1)) (w) (var_ref temp) (expression bool >= (swiz w (var_ref arg0))(swiz w (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec4 >= (var_ref arg0) (var_ref arg1)))))
|
||||
))
|
||||
|
@@ -3,89 +3,53 @@
|
||||
(parameters
|
||||
(declare (in) vec2 arg0)
|
||||
(declare (in) vec2 arg1))
|
||||
((declare () bvec2 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec2 < (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) vec3 arg0)
|
||||
(declare (in) vec3 arg1))
|
||||
((declare () bvec3 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool < (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec3 < (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) vec4 arg0)
|
||||
(declare (in) vec4 arg1))
|
||||
((declare () bvec4 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool < (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(assign (constant bool (1)) (w) (var_ref temp) (expression bool < (swiz w (var_ref arg0))(swiz w (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec4 < (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec2
|
||||
(parameters
|
||||
(declare (in) ivec2 arg0)
|
||||
(declare (in) ivec2 arg1))
|
||||
((declare () bvec2 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec2 < (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) ivec3 arg0)
|
||||
(declare (in) ivec3 arg1))
|
||||
((declare () bvec3 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool < (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec3 < (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) ivec4 arg0)
|
||||
(declare (in) ivec4 arg1))
|
||||
((declare () bvec4 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool < (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(assign (constant bool (1)) (w) (var_ref temp) (expression bool < (swiz w (var_ref arg0))(swiz w (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec4 < (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec2
|
||||
(parameters
|
||||
(declare (in) uvec2 arg0)
|
||||
(declare (in) uvec2 arg1))
|
||||
((declare () bvec2 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec2 < (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) uvec3 arg0)
|
||||
(declare (in) uvec3 arg1))
|
||||
((declare () bvec3 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool < (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec3 < (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) uvec4 arg0)
|
||||
(declare (in) uvec4 arg1))
|
||||
((declare () bvec4 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool < (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool < (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool < (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(assign (constant bool (1)) (w) (var_ref temp) (expression bool < (swiz w (var_ref arg0))(swiz w (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec4 < (var_ref arg0) (var_ref arg1)))))
|
||||
))
|
||||
|
@@ -3,89 +3,53 @@
|
||||
(parameters
|
||||
(declare (in) vec2 arg0)
|
||||
(declare (in) vec2 arg1))
|
||||
((declare () bvec2 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec2 <= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) vec3 arg0)
|
||||
(declare (in) vec3 arg1))
|
||||
((declare () bvec3 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool <= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec3 <= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) vec4 arg0)
|
||||
(declare (in) vec4 arg1))
|
||||
((declare () bvec4 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool <= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(assign (constant bool (1)) (w) (var_ref temp) (expression bool <= (swiz w (var_ref arg0))(swiz w (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec4 <= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec2
|
||||
(parameters
|
||||
(declare (in) ivec2 arg0)
|
||||
(declare (in) ivec2 arg1))
|
||||
((declare () bvec2 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec2 <= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) ivec3 arg0)
|
||||
(declare (in) ivec3 arg1))
|
||||
((declare () bvec3 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool <= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec3 <= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) ivec4 arg0)
|
||||
(declare (in) ivec4 arg1))
|
||||
((declare () bvec4 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool <= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(assign (constant bool (1)) (w) (var_ref temp) (expression bool <= (swiz w (var_ref arg0))(swiz w (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec4 <= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec2
|
||||
(parameters
|
||||
(declare (in) uvec2 arg0)
|
||||
(declare (in) uvec2 arg1))
|
||||
((declare () bvec2 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec2 <= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) uvec3 arg0)
|
||||
(declare (in) uvec3 arg1))
|
||||
((declare () bvec3 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool <= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec3 <= (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) uvec4 arg0)
|
||||
(declare (in) uvec4 arg1))
|
||||
((declare () bvec4 temp)
|
||||
(assign (constant bool (1)) (x) (var_ref temp) (expression bool <= (swiz x (var_ref arg0))(swiz x (var_ref arg1))))
|
||||
(assign (constant bool (1)) (y) (var_ref temp) (expression bool <= (swiz y (var_ref arg0))(swiz y (var_ref arg1))))
|
||||
(assign (constant bool (1)) (z) (var_ref temp) (expression bool <= (swiz z (var_ref arg0))(swiz z (var_ref arg1))))
|
||||
(assign (constant bool (1)) (w) (var_ref temp) (expression bool <= (swiz w (var_ref arg0))(swiz w (var_ref arg1))))
|
||||
(return (var_ref temp))))
|
||||
((return (expression bvec4 <= (var_ref arg0) (var_ref arg1)))))
|
||||
))
|
||||
|
@@ -3,71 +3,71 @@
|
||||
(parameters
|
||||
(declare (in) vec2 arg0)
|
||||
(declare (in) vec2 arg1))
|
||||
((return (expression bvec2 any_nequal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec2 != (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) vec3 arg0)
|
||||
(declare (in) vec3 arg1))
|
||||
((return (expression bvec3 any_nequal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec3 != (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) vec4 arg0)
|
||||
(declare (in) vec4 arg1))
|
||||
((return (expression bvec4 any_nequal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec4 != (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec2
|
||||
(parameters
|
||||
(declare (in) bvec2 arg0)
|
||||
(declare (in) bvec2 arg1))
|
||||
((return (expression bvec2 any_nequal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec2 != (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) bvec3 arg0)
|
||||
(declare (in) bvec3 arg1))
|
||||
((return (expression bvec3 any_nequal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec3 != (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) bvec4 arg0)
|
||||
(declare (in) bvec4 arg1))
|
||||
((return (expression bvec4 any_nequal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec4 != (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec2
|
||||
(parameters
|
||||
(declare (in) ivec2 arg0)
|
||||
(declare (in) ivec2 arg1))
|
||||
((return (expression bvec2 any_nequal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec2 != (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) ivec3 arg0)
|
||||
(declare (in) ivec3 arg1))
|
||||
((return (expression bvec3 any_nequal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec3 != (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) ivec4 arg0)
|
||||
(declare (in) ivec4 arg1))
|
||||
((return (expression bvec4 any_nequal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec4 != (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec2
|
||||
(parameters
|
||||
(declare (in) uvec2 arg0)
|
||||
(declare (in) uvec2 arg1))
|
||||
((return (expression bvec2 any_nequal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec2 != (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec3
|
||||
(parameters
|
||||
(declare (in) uvec3 arg0)
|
||||
(declare (in) uvec3 arg1))
|
||||
((return (expression bvec3 any_nequal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec3 != (var_ref arg0) (var_ref arg1)))))
|
||||
|
||||
(signature bvec4
|
||||
(parameters
|
||||
(declare (in) uvec4 arg0)
|
||||
(declare (in) uvec4 arg1))
|
||||
((return (expression bvec4 any_nequal (var_ref arg0) (var_ref arg1)))))
|
||||
((return (expression bvec4 != (var_ref arg0) (var_ref arg1)))))
|
||||
))
|
||||
|
@@ -680,6 +680,11 @@ ast_struct_specifier::print(void) const
|
||||
ast_struct_specifier::ast_struct_specifier(char *identifier,
|
||||
ast_node *declarator_list)
|
||||
{
|
||||
if (identifier == NULL) {
|
||||
static unsigned anon_count = 1;
|
||||
identifier = talloc_asprintf(this, "#anon_struct_%04x", anon_count);
|
||||
anon_count++;
|
||||
}
|
||||
name = identifier;
|
||||
this->declarations.push_degenerate_list_at_head(&declarator_list->link);
|
||||
}
|
||||
|
@@ -1137,11 +1137,11 @@ ir_function::ir_function(const char *name)
|
||||
|
||||
|
||||
bool
|
||||
ir_function::has_builtin_signature()
|
||||
ir_function::has_user_signature()
|
||||
{
|
||||
foreach_list(n, &this->signatures) {
|
||||
ir_function_signature *const sig = (ir_function_signature *) n;
|
||||
if (sig->is_builtin)
|
||||
if (!sig->is_builtin)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@@ -41,7 +41,31 @@ extern "C" {
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \defgroup IR Intermediate representation nodes
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class tags
|
||||
*
|
||||
* Each concrete class derived from \c ir_instruction has a value in this
|
||||
* enumerant. The value for the type is stored in \c ir_instruction::ir_type
|
||||
* by the constructor. While using type tags is not very C++, it is extremely
|
||||
* convenient. For example, during debugging you can simply inspect
|
||||
* \c ir_instruction::ir_type to find out the actual type of the object.
|
||||
*
|
||||
* In addition, it is possible to use a switch-statement based on \c
|
||||
* \c ir_instruction::ir_type to select different behavior for different object
|
||||
* types. For functions that have only slight differences for several object
|
||||
* types, this allows writing very straightforward, readable code.
|
||||
*/
|
||||
enum ir_node_type {
|
||||
/**
|
||||
* Zero is unused so that the IR validator can detect cases where
|
||||
* \c ir_instruction::ir_type has not been initialized.
|
||||
*/
|
||||
ir_type_unset,
|
||||
ir_type_variable,
|
||||
ir_type_assignment,
|
||||
@@ -156,9 +180,12 @@ protected:
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Variable storage classes
|
||||
*/
|
||||
enum ir_variable_mode {
|
||||
ir_var_auto = 0,
|
||||
ir_var_uniform,
|
||||
ir_var_auto = 0, /**< Function local variables and globals. */
|
||||
ir_var_uniform, /**< Variable declared as a uniform. */
|
||||
ir_var_in,
|
||||
ir_var_out,
|
||||
ir_var_inout,
|
||||
@@ -209,6 +236,9 @@ public:
|
||||
*/
|
||||
unsigned component_slots() const;
|
||||
|
||||
/**
|
||||
* Delcared name of the variable
|
||||
*/
|
||||
const char *name;
|
||||
|
||||
/**
|
||||
@@ -218,11 +248,28 @@ public:
|
||||
*/
|
||||
unsigned max_array_access;
|
||||
|
||||
/**
|
||||
* Is the variable read-only?
|
||||
*
|
||||
* This is set for variables declared as \c const, shader inputs,
|
||||
* and uniforms.
|
||||
*/
|
||||
unsigned read_only:1;
|
||||
unsigned centroid:1;
|
||||
unsigned invariant:1;
|
||||
|
||||
/**
|
||||
* Storage class of the variable.
|
||||
*
|
||||
* \sa ir_variable_mode
|
||||
*/
|
||||
unsigned mode:3;
|
||||
|
||||
/**
|
||||
* Interpolation mode for shader inputs / outputs
|
||||
*
|
||||
* \sa ir_variable_interpolation
|
||||
*/
|
||||
unsigned interpolation:2;
|
||||
|
||||
/**
|
||||
@@ -233,9 +280,13 @@ public:
|
||||
*/
|
||||
unsigned array_lvalue:1;
|
||||
|
||||
/* ARB_fragment_coord_conventions */
|
||||
/**
|
||||
* \name ARB_fragment_coord_conventions
|
||||
* @{
|
||||
*/
|
||||
unsigned origin_upper_left:1;
|
||||
unsigned pixel_center_integer:1;
|
||||
/*@}*/
|
||||
|
||||
/**
|
||||
* Storage location of the base of this variable
|
||||
@@ -410,8 +461,8 @@ public:
|
||||
*/
|
||||
const char *name;
|
||||
|
||||
/** Whether or not this function has a signature that is a built-in. */
|
||||
bool has_builtin_signature();
|
||||
/** Whether or not this function has a signature that isn't a built-in. */
|
||||
bool has_user_signature();
|
||||
|
||||
/**
|
||||
* List of ir_function_signature for each overloaded function with this name.
|
||||
@@ -668,7 +719,8 @@ enum ir_expression_operation {
|
||||
ir_binop_mod,
|
||||
|
||||
/**
|
||||
* \name Binary comparison operators
|
||||
* \name Binary comparison operators which return a boolean vector.
|
||||
* The type of both operands must be equal.
|
||||
*/
|
||||
/*@{*/
|
||||
ir_binop_less,
|
||||
@@ -724,9 +776,22 @@ public:
|
||||
|
||||
virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const;
|
||||
|
||||
/**
|
||||
* Attempt to constant-fold the expression
|
||||
*
|
||||
* If the expression cannot be constant folded, this method will return
|
||||
* \c NULL.
|
||||
*/
|
||||
virtual ir_constant *constant_expression_value();
|
||||
|
||||
/**
|
||||
* Determine the number of operands used by an expression
|
||||
*/
|
||||
static unsigned int get_num_operands(ir_expression_operation);
|
||||
|
||||
/**
|
||||
* Determine the number of operands used by an expression
|
||||
*/
|
||||
unsigned int get_num_operands() const
|
||||
{
|
||||
return get_num_operands(operation);
|
||||
@@ -813,6 +878,9 @@ public:
|
||||
return callee->function_name();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the function signature bound to this function call
|
||||
*/
|
||||
ir_function_signature *get_callee()
|
||||
{
|
||||
return callee;
|
||||
@@ -977,11 +1045,11 @@ public:
|
||||
* Texture sampling opcodes used in ir_texture
|
||||
*/
|
||||
enum ir_texture_opcode {
|
||||
ir_tex, /* Regular texture look-up */
|
||||
ir_txb, /* Texture look-up with LOD bias */
|
||||
ir_txl, /* Texture look-up with explicit LOD */
|
||||
ir_txd, /* Texture look-up with partial derivatvies */
|
||||
ir_txf /* Texel fetch with explicit LOD */
|
||||
ir_tex, /**< Regular texture look-up */
|
||||
ir_txb, /**< Texture look-up with LOD bias */
|
||||
ir_txl, /**< Texture look-up with explicit LOD */
|
||||
ir_txd, /**< Texture look-up with partial derivatvies */
|
||||
ir_txf /**< Texel fetch with explicit LOD */
|
||||
};
|
||||
|
||||
|
||||
@@ -1384,9 +1452,17 @@ private:
|
||||
ir_constant(void);
|
||||
};
|
||||
|
||||
/*@}*/
|
||||
|
||||
/**
|
||||
* Apply a visitor to each IR node in a list
|
||||
*/
|
||||
void
|
||||
visit_exec_list(exec_list *list, ir_visitor *visitor);
|
||||
|
||||
/**
|
||||
* Validate invariants on each IR node in a list
|
||||
*/
|
||||
void validate_ir_tree(exec_list *instructions);
|
||||
|
||||
/**
|
||||
|
@@ -141,6 +141,9 @@ ir_loop::clone(void *mem_ctx, struct hash_table *ht) const
|
||||
ir_call *
|
||||
ir_call::clone(void *mem_ctx, struct hash_table *ht) const
|
||||
{
|
||||
if (this->type == glsl_type::error_type)
|
||||
return ir_call::get_error_instruction(mem_ctx);
|
||||
|
||||
exec_list new_parameters;
|
||||
|
||||
foreach_iter(exec_list_iterator, iter, this->actual_parameters) {
|
||||
|
@@ -623,36 +623,41 @@ ir_expression::constant_expression_value()
|
||||
}
|
||||
break;
|
||||
case ir_binop_equal:
|
||||
switch (op[0]->type->base_type) {
|
||||
case GLSL_TYPE_UINT:
|
||||
data.b[0] = op[0]->value.u[0] == op[1]->value.u[0];
|
||||
break;
|
||||
case GLSL_TYPE_INT:
|
||||
data.b[0] = op[0]->value.i[0] == op[1]->value.i[0];
|
||||
break;
|
||||
case GLSL_TYPE_FLOAT:
|
||||
data.b[0] = op[0]->value.f[0] == op[1]->value.f[0];
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
assert(op[0]->type == op[1]->type);
|
||||
for (unsigned c = 0; c < components; c++) {
|
||||
switch (op[0]->type->base_type) {
|
||||
case GLSL_TYPE_UINT:
|
||||
data.b[c] = op[0]->value.u[c] == op[1]->value.u[c];
|
||||
break;
|
||||
case GLSL_TYPE_INT:
|
||||
data.b[c] = op[0]->value.i[c] == op[1]->value.i[c];
|
||||
break;
|
||||
case GLSL_TYPE_FLOAT:
|
||||
data.b[c] = op[0]->value.f[c] == op[1]->value.f[c];
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ir_binop_nequal:
|
||||
switch (op[0]->type->base_type) {
|
||||
case GLSL_TYPE_UINT:
|
||||
data.b[0] = op[0]->value.u[0] != op[1]->value.u[0];
|
||||
break;
|
||||
case GLSL_TYPE_INT:
|
||||
data.b[0] = op[0]->value.i[0] != op[1]->value.i[0];
|
||||
break;
|
||||
case GLSL_TYPE_FLOAT:
|
||||
data.b[0] = op[0]->value.f[0] != op[1]->value.f[0];
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
assert(op[0]->type != op[1]->type);
|
||||
for (unsigned c = 0; c < components; c++) {
|
||||
switch (op[0]->type->base_type) {
|
||||
case GLSL_TYPE_UINT:
|
||||
data.b[c] = op[0]->value.u[c] != op[1]->value.u[c];
|
||||
break;
|
||||
case GLSL_TYPE_INT:
|
||||
data.b[c] = op[0]->value.i[c] != op[1]->value.i[c];
|
||||
break;
|
||||
case GLSL_TYPE_FLOAT:
|
||||
data.b[c] = op[0]->value.f[c] != op[1]->value.f[c];
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ir_binop_all_equal:
|
||||
data.b[0] = op[0]->has_value(op[1]);
|
||||
break;
|
||||
|
@@ -63,8 +63,11 @@ can_inline(ir_call *call)
|
||||
|
||||
v.run((exec_list *) &callee->body);
|
||||
|
||||
/* If the function is empty (no last instruction) or does not end with a
|
||||
* return statement, we need to count the implicit return.
|
||||
*/
|
||||
ir_instruction *last = (ir_instruction *)callee->body.get_tail();
|
||||
if (last && !last->as_return())
|
||||
if (last == NULL || !last->as_return())
|
||||
v.num_returns++;
|
||||
|
||||
return v.num_returns == 1;
|
||||
|
@@ -56,4 +56,6 @@ bool do_tree_grafting(exec_list *instructions);
|
||||
bool do_vec_index_to_cond_assign(exec_list *instructions);
|
||||
bool do_vec_index_to_swizzle(exec_list *instructions);
|
||||
bool lower_noise(exec_list *instructions);
|
||||
bool lower_variable_index_to_cond_assign(exec_list *instructions,
|
||||
bool lower_input, bool lower_output, bool lower_temp, bool lower_uniform);
|
||||
bool optimize_redundant_jumps(exec_list *instructions);
|
||||
|
@@ -153,6 +153,9 @@ void ir_print_visitor::visit(ir_function_signature *ir)
|
||||
|
||||
void ir_print_visitor::visit(ir_function *ir)
|
||||
{
|
||||
if (!ir->has_user_signature())
|
||||
return;
|
||||
|
||||
printf("(function %s\n", ir->name);
|
||||
indentation++;
|
||||
foreach_iter(exec_list_iterator, iter, *ir) {
|
||||
|
@@ -124,7 +124,8 @@ ir_validate::visit_leave(ir_loop *ir)
|
||||
" from: %p\n"
|
||||
" to: %p\n"
|
||||
" increment: %p\n",
|
||||
ir->counter, ir->from, ir->to, ir->increment);
|
||||
(void *) ir->counter, (void *) ir->from, (void *) ir->to,
|
||||
(void *) ir->increment);
|
||||
abort();
|
||||
}
|
||||
|
||||
@@ -139,7 +140,8 @@ ir_validate::visit_leave(ir_loop *ir)
|
||||
" from: %p\n"
|
||||
" to: %p\n"
|
||||
" increment: %p\n",
|
||||
ir->counter, ir->from, ir->to, ir->increment);
|
||||
(void *) ir->counter, (void *) ir->from, (void *) ir->to,
|
||||
(void *) ir->increment);
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
@@ -162,6 +162,9 @@ generate_110_uniforms(exec_list *instructions,
|
||||
state->Const.MaxTextureCoords);
|
||||
|
||||
add_uniform(instructions, state, "gl_TextureMatrix", mat4_array_type);
|
||||
add_uniform(instructions, state, "gl_TextureMatrixInverse", mat4_array_type);
|
||||
add_uniform(instructions, state, "gl_TextureMatrixTranspose", mat4_array_type);
|
||||
add_uniform(instructions, state, "gl_TextureMatrixInverseTranspose", mat4_array_type);
|
||||
|
||||
add_uniform(instructions, state, "gl_DepthRange",
|
||||
state->symbols->get_type("gl_DepthRangeParameters"));
|
||||
|
@@ -457,7 +457,7 @@ cross_validate_outputs_to_inputs(struct gl_shader_program *prog,
|
||||
*/
|
||||
if (input->type != output->type) {
|
||||
linker_error_printf(prog,
|
||||
"%s shader output `%s' delcared as "
|
||||
"%s shader output `%s' declared as "
|
||||
"type `%s', but %s shader input declared "
|
||||
"as type `%s'\n",
|
||||
producer_stage, output->name,
|
||||
|
@@ -85,7 +85,7 @@ int
|
||||
calculate_iterations(ir_rvalue *from, ir_rvalue *to, ir_rvalue *increment,
|
||||
enum ir_expression_operation op)
|
||||
{
|
||||
void *mem_ctx = talloc_init(__func__);
|
||||
void *mem_ctx = talloc_init("%s", __func__);
|
||||
|
||||
ir_expression *const sub =
|
||||
new(mem_ctx) ir_expression(ir_binop_sub, from->type, to, from);
|
||||
|
358
src/glsl/lower_variable_index_to_cond_assign.cpp
Normal file
358
src/glsl/lower_variable_index_to_cond_assign.cpp
Normal file
@@ -0,0 +1,358 @@
|
||||
/*
|
||||
* Copyright © 2010 Luca Barbieri
|
||||
*
|
||||
* 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 (including the next
|
||||
* paragraph) 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file lower_variable_index_to_cond_assign.cpp
|
||||
*
|
||||
* Turns non-constant indexing into array types to a series of
|
||||
* conditional moves of each element into a temporary.
|
||||
*
|
||||
* Pre-DX10 GPUs often don't have a native way to do this operation,
|
||||
* and this works around that.
|
||||
*/
|
||||
|
||||
#include "ir.h"
|
||||
#include "ir_rvalue_visitor.h"
|
||||
#include "ir_optimization.h"
|
||||
#include "glsl_types.h"
|
||||
#include "main/macros.h"
|
||||
|
||||
struct assignment_generator
|
||||
{
|
||||
ir_instruction* base_ir;
|
||||
ir_rvalue* array;
|
||||
bool is_write;
|
||||
ir_variable* var;
|
||||
|
||||
assignment_generator()
|
||||
{
|
||||
}
|
||||
|
||||
void generate(unsigned i, ir_rvalue* condition, exec_list *list) const
|
||||
{
|
||||
/* Just clone the rest of the deref chain when trying to get at the
|
||||
* underlying variable.
|
||||
*/
|
||||
void *mem_ctx = talloc_parent(base_ir);
|
||||
ir_rvalue *element =
|
||||
new(mem_ctx) ir_dereference_array(this->array->clone(mem_ctx, NULL),
|
||||
new(mem_ctx) ir_constant(i));
|
||||
ir_rvalue *variable = new(mem_ctx) ir_dereference_variable(this->var);
|
||||
|
||||
ir_assignment *assignment = (is_write)
|
||||
? new(mem_ctx) ir_assignment(element, variable, condition)
|
||||
: new(mem_ctx) ir_assignment(variable, element, condition);
|
||||
|
||||
list->push_tail(assignment);
|
||||
}
|
||||
};
|
||||
|
||||
struct switch_generator
|
||||
{
|
||||
/* make TFunction a template parameter if you need to use other generators */
|
||||
typedef assignment_generator TFunction;
|
||||
const TFunction& generator;
|
||||
|
||||
ir_variable* index;
|
||||
unsigned linear_sequence_max_length;
|
||||
unsigned condition_components;
|
||||
|
||||
void *mem_ctx;
|
||||
|
||||
switch_generator(const TFunction& generator, ir_variable *index,
|
||||
unsigned linear_sequence_max_length,
|
||||
unsigned condition_components)
|
||||
: generator(generator), index(index),
|
||||
linear_sequence_max_length(linear_sequence_max_length),
|
||||
condition_components(condition_components)
|
||||
{
|
||||
this->mem_ctx = talloc_parent(index);
|
||||
}
|
||||
|
||||
void linear_sequence(unsigned begin, unsigned end, exec_list *list)
|
||||
{
|
||||
if (begin == end)
|
||||
return;
|
||||
|
||||
/* If the array access is a read, read the first element of this subregion
|
||||
* unconditionally. The remaining tests will possibly overwrite this
|
||||
* value with one of the other array elements.
|
||||
*
|
||||
* This optimization cannot be done for writes because it will cause the
|
||||
* first element of the subregion to be written possibly *in addition* to
|
||||
* one of the other elements.
|
||||
*/
|
||||
unsigned first;
|
||||
if (!this->generator.is_write) {
|
||||
this->generator.generate(begin, 0, list);
|
||||
first = begin + 1;
|
||||
} else {
|
||||
first = begin;
|
||||
}
|
||||
|
||||
for (unsigned i = first; i < end; i += 4) {
|
||||
const unsigned comps = MIN2(condition_components, end - i);
|
||||
|
||||
ir_rvalue *broadcast_index =
|
||||
new(this->mem_ctx) ir_dereference_variable(index);
|
||||
|
||||
if (comps) {
|
||||
const ir_swizzle_mask m = { 0, 1, 2, 3, comps, false };
|
||||
broadcast_index = new(this->mem_ctx) ir_swizzle(broadcast_index, m);
|
||||
}
|
||||
|
||||
/* Compare the desired index value with the next block of four indices.
|
||||
*/
|
||||
ir_constant_data test_indices_data;
|
||||
memset(&test_indices_data, 0, sizeof(test_indices_data));
|
||||
test_indices_data.i[0] = i;
|
||||
test_indices_data.i[1] = i + 1;
|
||||
test_indices_data.i[2] = i + 2;
|
||||
test_indices_data.i[3] = i + 3;
|
||||
ir_constant *const test_indices =
|
||||
new(this->mem_ctx) ir_constant(broadcast_index->type,
|
||||
&test_indices_data);
|
||||
|
||||
ir_rvalue *const condition_val =
|
||||
new(this->mem_ctx) ir_expression(ir_binop_equal,
|
||||
&glsl_type::bool_type[comps - 1],
|
||||
broadcast_index,
|
||||
test_indices);
|
||||
|
||||
ir_variable *const condition =
|
||||
new(this->mem_ctx) ir_variable(condition_val->type,
|
||||
"dereference_array_condition",
|
||||
ir_var_temporary);
|
||||
list->push_tail(condition);
|
||||
|
||||
ir_rvalue *const cond_deref =
|
||||
new(this->mem_ctx) ir_dereference_variable(condition);
|
||||
list->push_tail(new(this->mem_ctx) ir_assignment(cond_deref,
|
||||
condition_val, 0));
|
||||
|
||||
if (comps == 1) {
|
||||
ir_rvalue *const cond_deref =
|
||||
new(this->mem_ctx) ir_dereference_variable(condition);
|
||||
|
||||
this->generator.generate(i, cond_deref, list);
|
||||
} else {
|
||||
for (unsigned j = 0; j < comps; j++) {
|
||||
ir_rvalue *const cond_deref =
|
||||
new(this->mem_ctx) ir_dereference_variable(condition);
|
||||
ir_rvalue *const cond_swiz =
|
||||
new(this->mem_ctx) ir_swizzle(cond_deref, j, 0, 0, 0, 1);
|
||||
|
||||
this->generator.generate(i + j, cond_swiz, list);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void bisect(unsigned begin, unsigned end, exec_list *list)
|
||||
{
|
||||
unsigned middle = (begin + end) >> 1;
|
||||
|
||||
assert(index->type->is_integer());
|
||||
|
||||
ir_constant *const middle_c = (index->type->base_type == GLSL_TYPE_UINT)
|
||||
? new(this->mem_ctx) ir_constant((unsigned)middle)
|
||||
: new(this->mem_ctx) ir_constant((int)middle);
|
||||
|
||||
|
||||
ir_dereference_variable *deref =
|
||||
new(this->mem_ctx) ir_dereference_variable(this->index);
|
||||
|
||||
ir_expression *less =
|
||||
new(this->mem_ctx) ir_expression(ir_binop_less, glsl_type::bool_type,
|
||||
deref, middle_c);
|
||||
|
||||
ir_if *if_less = new(this->mem_ctx) ir_if(less);
|
||||
|
||||
generate(begin, middle, &if_less->then_instructions);
|
||||
generate(middle, end, &if_less->else_instructions);
|
||||
|
||||
list->push_tail(if_less);
|
||||
}
|
||||
|
||||
void generate(unsigned begin, unsigned end, exec_list *list)
|
||||
{
|
||||
unsigned length = end - begin;
|
||||
if (length <= this->linear_sequence_max_length)
|
||||
return linear_sequence(begin, end, list);
|
||||
else
|
||||
return bisect(begin, end, list);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Visitor class for replacing expressions with ir_constant values.
|
||||
*/
|
||||
|
||||
class variable_index_to_cond_assign_visitor : public ir_rvalue_visitor {
|
||||
public:
|
||||
variable_index_to_cond_assign_visitor(bool lower_input,
|
||||
bool lower_output,
|
||||
bool lower_temp,
|
||||
bool lower_uniform)
|
||||
{
|
||||
this->progress = false;
|
||||
this->lower_inputs = lower_input;
|
||||
this->lower_outputs = lower_output;
|
||||
this->lower_temps = lower_temp;
|
||||
this->lower_uniforms = lower_uniform;
|
||||
}
|
||||
|
||||
bool progress;
|
||||
bool lower_inputs;
|
||||
bool lower_outputs;
|
||||
bool lower_temps;
|
||||
bool lower_uniforms;
|
||||
|
||||
bool is_array_or_matrix(const ir_instruction *ir) const
|
||||
{
|
||||
return (ir->type->is_array() || ir->type->is_matrix());
|
||||
}
|
||||
|
||||
bool needs_lowering(ir_dereference_array *deref) const
|
||||
{
|
||||
if (deref == NULL || deref->array_index->as_constant()
|
||||
|| !is_array_or_matrix(deref->array))
|
||||
return false;
|
||||
|
||||
if (deref->array->ir_type == ir_type_constant)
|
||||
return this->lower_temps;
|
||||
|
||||
const ir_variable *const var = deref->array->variable_referenced();
|
||||
switch (var->mode) {
|
||||
case ir_var_auto:
|
||||
case ir_var_temporary:
|
||||
return this->lower_temps;
|
||||
case ir_var_uniform:
|
||||
return this->lower_uniforms;
|
||||
case ir_var_in:
|
||||
return (var->location == -1) ? this->lower_temps : this->lower_inputs;
|
||||
case ir_var_out:
|
||||
return (var->location == -1) ? this->lower_temps : this->lower_outputs;
|
||||
case ir_var_inout:
|
||||
return this->lower_temps;
|
||||
}
|
||||
|
||||
assert(!"Should not get here.");
|
||||
return false;
|
||||
}
|
||||
|
||||
ir_variable *convert_dereference_array(ir_dereference_array *orig_deref,
|
||||
ir_rvalue* value)
|
||||
{
|
||||
assert(is_array_or_matrix(orig_deref->array));
|
||||
|
||||
const unsigned length = (orig_deref->array->type->is_array())
|
||||
? orig_deref->array->type->length
|
||||
: orig_deref->array->type->matrix_columns;
|
||||
|
||||
void *const mem_ctx = talloc_parent(base_ir);
|
||||
ir_variable *var =
|
||||
new(mem_ctx) ir_variable(orig_deref->type, "dereference_array_value",
|
||||
ir_var_temporary);
|
||||
base_ir->insert_before(var);
|
||||
|
||||
if (value) {
|
||||
ir_dereference *lhs = new(mem_ctx) ir_dereference_variable(var);
|
||||
ir_assignment *assign = new(mem_ctx) ir_assignment(lhs, value, NULL);
|
||||
|
||||
base_ir->insert_before(assign);
|
||||
}
|
||||
|
||||
/* Store the index to a temporary to avoid reusing its tree. */
|
||||
ir_variable *index =
|
||||
new(mem_ctx) ir_variable(orig_deref->array_index->type,
|
||||
"dereference_array_index", ir_var_temporary);
|
||||
base_ir->insert_before(index);
|
||||
|
||||
ir_dereference *lhs = new(mem_ctx) ir_dereference_variable(index);
|
||||
ir_assignment *assign =
|
||||
new(mem_ctx) ir_assignment(lhs, orig_deref->array_index, NULL);
|
||||
base_ir->insert_before(assign);
|
||||
|
||||
assignment_generator ag;
|
||||
ag.array = orig_deref->array;
|
||||
ag.base_ir = base_ir;
|
||||
ag.var = var;
|
||||
ag.is_write = !!value;
|
||||
|
||||
switch_generator sg(ag, index, 4, 4);
|
||||
|
||||
exec_list list;
|
||||
sg.generate(0, length, &list);
|
||||
base_ir->insert_before(&list);
|
||||
|
||||
return var;
|
||||
}
|
||||
|
||||
virtual void handle_rvalue(ir_rvalue **pir)
|
||||
{
|
||||
if (!*pir)
|
||||
return;
|
||||
|
||||
ir_dereference_array* orig_deref = (*pir)->as_dereference_array();
|
||||
if (needs_lowering(orig_deref)) {
|
||||
ir_variable* var = convert_dereference_array(orig_deref, 0);
|
||||
assert(var);
|
||||
*pir = new(talloc_parent(base_ir)) ir_dereference_variable(var);
|
||||
this->progress = true;
|
||||
}
|
||||
}
|
||||
|
||||
ir_visitor_status
|
||||
visit_leave(ir_assignment *ir)
|
||||
{
|
||||
ir_rvalue_visitor::visit_leave(ir);
|
||||
|
||||
ir_dereference_array *orig_deref = ir->lhs->as_dereference_array();
|
||||
|
||||
if (needs_lowering(orig_deref)) {
|
||||
convert_dereference_array(orig_deref, ir->rhs);
|
||||
ir->remove();
|
||||
this->progress = true;
|
||||
}
|
||||
|
||||
return visit_continue;
|
||||
}
|
||||
};
|
||||
|
||||
bool
|
||||
lower_variable_index_to_cond_assign(exec_list *instructions,
|
||||
bool lower_input,
|
||||
bool lower_output,
|
||||
bool lower_temp,
|
||||
bool lower_uniform)
|
||||
{
|
||||
variable_index_to_cond_assign_visitor v(lower_input,
|
||||
lower_output,
|
||||
lower_temp,
|
||||
lower_uniform);
|
||||
|
||||
visit_list_elements(&v, instructions);
|
||||
|
||||
return v.progress;
|
||||
}
|
@@ -118,6 +118,8 @@ dri2_destroy_context(struct glx_context *context)
|
||||
struct dri2_context *pcp = (struct dri2_context *) context;
|
||||
struct dri2_screen *psc = (struct dri2_screen *) context->psc;
|
||||
|
||||
driReleaseDrawables(&pcp->base);
|
||||
|
||||
if (context->xid)
|
||||
glx_send_destroy_context(psc->base.dpy, context->xid);
|
||||
|
||||
@@ -158,7 +160,8 @@ dri2_unbind_context(struct glx_context *context, struct glx_context *new)
|
||||
|
||||
(*psc->core->unbindContext) (pcp->driContext);
|
||||
|
||||
driReleaseDrawables(&pcp->base);
|
||||
if (context == new)
|
||||
driReleaseDrawables(&pcp->base);
|
||||
}
|
||||
|
||||
static struct glx_context *
|
||||
|
@@ -1034,8 +1034,8 @@ __indirect_glDrawRangeElements(GLenum mode, GLuint start, GLuint end,
|
||||
|
||||
|
||||
void
|
||||
__indirect_glMultiDrawArraysEXT(GLenum mode, GLint * first, GLsizei * count,
|
||||
GLsizei primcount)
|
||||
__indirect_glMultiDrawArraysEXT(GLenum mode, const GLint *first,
|
||||
const GLsizei *count, GLsizei primcount)
|
||||
{
|
||||
struct glx_context *gc = __glXGetCurrentContext();
|
||||
const __GLXattribute *state =
|
||||
|
@@ -106,8 +106,8 @@
|
||||
<category name="GL_EXT_multi_draw_arrays" number="69">
|
||||
<function name="MultiDrawArraysEXT" offset="assign">
|
||||
<param name="mode" type="GLenum"/>
|
||||
<param name="first" type="GLint *"/> <!-- Spec bug. Should be const. -->
|
||||
<param name="count" type="GLsizei *"/> <!-- Spec bug. Should be const. -->
|
||||
<param name="first" type="const GLint *"/>
|
||||
<param name="count" type="const GLsizei *"/>
|
||||
<param name="primcount" type="GLsizei"/>
|
||||
<glx handcode="true"/>
|
||||
</function>
|
||||
|
@@ -38,7 +38,7 @@
|
||||
#include "GL/gl.h"
|
||||
#include "GL/glext.h"
|
||||
|
||||
#ifndef GL_FIXED
|
||||
#ifndef GL_OES_fixed_point
|
||||
typedef int GLfixed;
|
||||
typedef int GLclampx;
|
||||
#endif
|
||||
|
@@ -880,6 +880,7 @@ dri2CreateNewScreen(int scrn, int fd,
|
||||
}
|
||||
|
||||
psp->DriverAPI = driDriverAPI;
|
||||
psp->loaderPrivate = data;
|
||||
|
||||
driParseOptionInfo(&psp->optionInfo, __dri2ConfigOptions,
|
||||
__dri2NConfigOptions);
|
||||
|
@@ -539,6 +539,7 @@ struct __DRIscreenRec {
|
||||
driOptionCache optionInfo;
|
||||
driOptionCache optionCache;
|
||||
unsigned int api_mask;
|
||||
void *loaderPrivate;
|
||||
};
|
||||
|
||||
extern void
|
||||
|
@@ -90,6 +90,7 @@ static void prepare_cc_unit(struct brw_context *brw)
|
||||
*/
|
||||
static void upload_cc_unit(struct brw_context *brw)
|
||||
{
|
||||
struct intel_context *intel = &brw->intel;
|
||||
GLcontext *ctx = &brw->intel.ctx;
|
||||
struct brw_cc_unit_state cc;
|
||||
void *map;
|
||||
@@ -203,12 +204,12 @@ static void upload_cc_unit(struct brw_context *brw)
|
||||
cc.cc2.depth_write_enable = ctx->Depth.Mask;
|
||||
}
|
||||
|
||||
if (intel->stats_wm || (INTEL_DEBUG & DEBUG_STATS))
|
||||
cc.cc5.statistics_enable = 1;
|
||||
|
||||
/* CACHE_NEW_CC_VP */
|
||||
cc.cc4.cc_viewport_state_offset = brw->cc.vp_bo->offset >> 5; /* reloc */
|
||||
|
||||
if (INTEL_DEBUG & DEBUG_STATS)
|
||||
cc.cc5.statistics_enable = 1;
|
||||
|
||||
map = brw_state_batch(brw, sizeof(cc), 64,
|
||||
&brw->cc.state_bo, &brw->cc.state_offset);
|
||||
memcpy(map, &cc, sizeof(cc));
|
||||
|
@@ -41,7 +41,6 @@
|
||||
#include "intel_span.h"
|
||||
#include "tnl/t_pipeline.h"
|
||||
|
||||
|
||||
/***************************************
|
||||
* Mesa's Driver Functions
|
||||
***************************************/
|
||||
@@ -116,6 +115,13 @@ GLboolean brwCreateContext( int api,
|
||||
ctx->ShaderCompilerOptions[i].EmitNVTempInitialization = GL_TRUE;
|
||||
ctx->ShaderCompilerOptions[i].EmitNoNoise = GL_TRUE;
|
||||
ctx->ShaderCompilerOptions[i].EmitNoMainReturn = GL_TRUE;
|
||||
ctx->ShaderCompilerOptions[i].EmitNoIndirectInput = GL_TRUE;
|
||||
ctx->ShaderCompilerOptions[i].EmitNoIndirectOutput = GL_TRUE;
|
||||
|
||||
ctx->ShaderCompilerOptions[i].EmitNoIndirectUniform =
|
||||
(i == MESA_SHADER_FRAGMENT);
|
||||
ctx->ShaderCompilerOptions[i].EmitNoIndirectTemp =
|
||||
(i == MESA_SHADER_FRAGMENT);
|
||||
}
|
||||
|
||||
ctx->Const.VertexProgram.MaxNativeInstructions = (16 * 1024);
|
||||
|
@@ -215,6 +215,7 @@ static void do_wm_prog( struct brw_context *brw,
|
||||
static void brw_wm_populate_key( struct brw_context *brw,
|
||||
struct brw_wm_prog_key *key )
|
||||
{
|
||||
struct intel_context *intel = &brw->intel;
|
||||
GLcontext *ctx = &brw->intel.ctx;
|
||||
/* BRW_NEW_FRAGMENT_PROGRAM */
|
||||
const struct brw_fragment_program *fp =
|
||||
@@ -279,7 +280,8 @@ static void brw_wm_populate_key( struct brw_context *brw,
|
||||
}
|
||||
}
|
||||
|
||||
brw_wm_lookup_iz(line_aa,
|
||||
brw_wm_lookup_iz(intel,
|
||||
line_aa,
|
||||
lookup,
|
||||
uses_depth,
|
||||
key);
|
||||
|
@@ -299,7 +299,8 @@ void brw_wm_print_insn( struct brw_wm_compile *c,
|
||||
void brw_wm_print_program( struct brw_wm_compile *c,
|
||||
const char *stage );
|
||||
|
||||
void brw_wm_lookup_iz( GLuint line_aa,
|
||||
void brw_wm_lookup_iz( struct intel_context *intel,
|
||||
GLuint line_aa,
|
||||
GLuint lookup,
|
||||
GLboolean ps_uses_depth,
|
||||
struct brw_wm_prog_key *key );
|
||||
@@ -373,6 +374,7 @@ void emit_fb_write(struct brw_wm_compile *c,
|
||||
void emit_frontfacing(struct brw_compile *p,
|
||||
const struct brw_reg *dst,
|
||||
GLuint mask);
|
||||
void emit_kil_nv(struct brw_wm_compile *c);
|
||||
void emit_linterp(struct brw_compile *p,
|
||||
const struct brw_reg *dst,
|
||||
GLuint mask,
|
||||
|
@@ -1223,7 +1223,7 @@ static void emit_kil( struct brw_wm_compile *c,
|
||||
/* KIL_NV kills the pixels that are currently executing, not based on a test
|
||||
* of the arguments.
|
||||
*/
|
||||
static void emit_kil_nv( struct brw_wm_compile *c )
|
||||
void emit_kil_nv( struct brw_wm_compile *c )
|
||||
{
|
||||
struct brw_compile *p = &c->func;
|
||||
struct brw_reg r0uw = retype(brw_vec1_grf(0, 0), BRW_REGISTER_TYPE_UW);
|
||||
|
@@ -614,21 +614,6 @@ static void emit_arl(struct brw_wm_compile *c,
|
||||
brw_set_saturate(p, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* For GLSL shaders, this KIL will be unconditional.
|
||||
* It may be contained inside an IF/ENDIF structure of course.
|
||||
*/
|
||||
static void emit_kil(struct brw_wm_compile *c)
|
||||
{
|
||||
struct brw_compile *p = &c->func;
|
||||
struct brw_reg depth = retype(brw_vec1_grf(0, 0), BRW_REGISTER_TYPE_UW);
|
||||
brw_push_insn_state(p);
|
||||
brw_set_mask_control(p, BRW_MASK_DISABLE);
|
||||
brw_NOT(p, c->emit_mask_reg, brw_mask_reg(1)); /* IMASK */
|
||||
brw_AND(p, depth, c->emit_mask_reg, depth);
|
||||
brw_pop_insn_state(p);
|
||||
}
|
||||
|
||||
static INLINE struct brw_reg high_words( struct brw_reg reg )
|
||||
{
|
||||
return stride( suboffset( retype( reg, BRW_REGISTER_TYPE_W ), 1 ),
|
||||
@@ -898,7 +883,7 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)
|
||||
c->fp->program.Base.SamplerUnits[inst->TexSrcUnit]);
|
||||
break;
|
||||
case OPCODE_KIL_NV:
|
||||
emit_kil(c);
|
||||
emit_kil_nv(c);
|
||||
break;
|
||||
case OPCODE_IF:
|
||||
assert(if_depth < MAX_IF_DEPTH);
|
||||
|
@@ -120,24 +120,38 @@ const struct {
|
||||
* \param line_aa AA_NEVER, AA_ALWAYS or AA_SOMETIMES
|
||||
* \param lookup bitmask of IZ_* flags
|
||||
*/
|
||||
void brw_wm_lookup_iz( GLuint line_aa,
|
||||
void brw_wm_lookup_iz( struct intel_context *intel,
|
||||
GLuint line_aa,
|
||||
GLuint lookup,
|
||||
GLboolean ps_uses_depth,
|
||||
struct brw_wm_prog_key *key )
|
||||
{
|
||||
GLuint reg = 2;
|
||||
GLboolean kill_stats_promoted_workaround = GL_FALSE;
|
||||
|
||||
assert (lookup < IZ_BIT_MAX);
|
||||
|
||||
/* Crazy workaround in the windowizer, which we need to track in
|
||||
* our register allocation and render target writes. See the "If
|
||||
* statistics are enabled..." paragraph of 11.5.3.2: Early Depth
|
||||
* Test Cases [Pre-DevGT] of the 3D Pipeline - Windower B-Spec.
|
||||
*/
|
||||
if (intel->stats_wm &&
|
||||
(lookup & IZ_PS_KILL_ALPHATEST_BIT) &&
|
||||
wm_iz_table[lookup].mode == P) {
|
||||
kill_stats_promoted_workaround = GL_TRUE;
|
||||
}
|
||||
|
||||
if (lookup & IZ_PS_COMPUTES_DEPTH_BIT)
|
||||
key->computes_depth = 1;
|
||||
|
||||
if (wm_iz_table[lookup].sd_present || ps_uses_depth) {
|
||||
if (wm_iz_table[lookup].sd_present || ps_uses_depth ||
|
||||
kill_stats_promoted_workaround) {
|
||||
key->source_depth_reg = reg;
|
||||
reg += 2;
|
||||
}
|
||||
|
||||
if (wm_iz_table[lookup].sd_to_rt)
|
||||
if (wm_iz_table[lookup].sd_to_rt || kill_stats_promoted_workaround)
|
||||
key->source_depth_to_render_target = 1;
|
||||
|
||||
if (wm_iz_table[lookup].ds_present || line_aa != AA_NEVER) {
|
||||
|
@@ -89,7 +89,6 @@ static const struct dri_extension card_extensions[] = {
|
||||
{ "GL_ARB_point_sprite", NULL },
|
||||
{ "GL_ARB_shader_objects", GL_ARB_shader_objects_functions },
|
||||
{ "GL_ARB_shading_language_100", GL_VERSION_2_0_functions },
|
||||
{ "GL_ARB_shading_language_120", GL_VERSION_2_1_functions },
|
||||
{ "GL_ARB_sync", GL_ARB_sync_functions },
|
||||
{ "GL_ARB_texture_border_clamp", NULL },
|
||||
{ "GL_ARB_texture_cube_map", NULL },
|
||||
@@ -213,6 +212,9 @@ intelInitExtensions(GLcontext *ctx)
|
||||
*/
|
||||
driInitExtensions(ctx, card_extensions, GL_FALSE);
|
||||
|
||||
_mesa_map_function_array(GL_VERSION_2_1_functions);
|
||||
ctx->Const.GLSLVersion = 120;
|
||||
|
||||
if (intel->gen >= 5)
|
||||
driInitExtensions(ctx, ironlake_extensions, GL_FALSE);
|
||||
|
||||
|
@@ -202,8 +202,8 @@ intel_image_target_renderbuffer_storage(GLcontext *ctx,
|
||||
__DRIimage *image;
|
||||
|
||||
screen = intel->intelScreen->driScrnPriv;
|
||||
image = screen->dri2.image->lookupEGLImage(intel->driContext, image_handle,
|
||||
intel->driContext->loaderPrivate);
|
||||
image = screen->dri2.image->lookupEGLImage(screen, image_handle,
|
||||
screen->loaderPrivate);
|
||||
if (image == NULL)
|
||||
return;
|
||||
|
||||
|
@@ -123,12 +123,12 @@ static const struct __DRI2flushExtensionRec intelFlushExtension = {
|
||||
};
|
||||
|
||||
static __DRIimage *
|
||||
intel_create_image_from_name(__DRIcontext *context,
|
||||
intel_create_image_from_name(__DRIscreen *screen,
|
||||
int width, int height, int format,
|
||||
int name, int pitch, void *loaderPrivate)
|
||||
{
|
||||
struct intel_screen *intelScreen = screen->private;
|
||||
__DRIimage *image;
|
||||
struct intel_context *intel = context->driverPrivate;
|
||||
int cpp;
|
||||
|
||||
image = CALLOC(sizeof *image);
|
||||
@@ -159,7 +159,7 @@ intel_create_image_from_name(__DRIcontext *context,
|
||||
image->data = loaderPrivate;
|
||||
cpp = _mesa_get_format_bytes(image->format);
|
||||
|
||||
image->region = intel_region_alloc_for_handle(intel->intelScreen,
|
||||
image->region = intel_region_alloc_for_handle(intelScreen,
|
||||
cpp, width, height,
|
||||
pitch, name, "image");
|
||||
if (image->region == NULL) {
|
||||
|
@@ -805,8 +805,8 @@ intel_image_target_texture_2d(GLcontext *ctx, GLenum target,
|
||||
__DRIimage *image;
|
||||
|
||||
screen = intel->intelScreen->driScrnPriv;
|
||||
image = screen->dri2.image->lookupEGLImage(intel->driContext, image_handle,
|
||||
intel->driContext->loaderPrivate);
|
||||
image = screen->dri2.image->lookupEGLImage(screen, image_handle,
|
||||
screen->loaderPrivate);
|
||||
if (image == NULL)
|
||||
return;
|
||||
|
||||
|
@@ -475,8 +475,8 @@ static void constant_folding(struct radeon_compiler * c, struct rc_instruction *
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns a writemask that indicates wich components are
|
||||
* read by src and also written by dst.
|
||||
* If src and dst use the same register, this function returns a writemask that
|
||||
* indicates wich components are read by src. Otherwise zero is returned.
|
||||
*/
|
||||
static unsigned int src_reads_dst_mask(struct rc_src_register src,
|
||||
struct rc_dst_register dst)
|
||||
@@ -563,10 +563,18 @@ static int presub_helper(
|
||||
* s->Inst->U.I.DstReg, because if it does we must not
|
||||
* remove s->Inst. */
|
||||
for(i = 0; i < info->NumSrcRegs; i++) {
|
||||
if(s->Inst->U.I.DstReg.WriteMask !=
|
||||
src_reads_dst_mask(inst->U.I.SrcReg[i],
|
||||
s->Inst->U.I.DstReg)) {
|
||||
continue;
|
||||
unsigned int mask = src_reads_dst_mask(
|
||||
inst->U.I.SrcReg[i], s->Inst->U.I.DstReg);
|
||||
/* XXX We could be more aggressive here using
|
||||
* presubtract. It is okay if SrcReg[i] only reads
|
||||
* from some of the mask components. */
|
||||
if(s->Inst->U.I.DstReg.WriteMask != mask) {
|
||||
if (s->Inst->U.I.DstReg.WriteMask & mask) {
|
||||
can_remove = 0;
|
||||
break;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (cant_sub || !can_use_presub) {
|
||||
can_remove = 0;
|
||||
@@ -626,6 +634,21 @@ static void presub_replace_add(struct peephole_state *s,
|
||||
inst->U.I.SrcReg[src_index].Index = presub_opcode;
|
||||
}
|
||||
|
||||
static int is_presub_candidate(struct rc_instruction * inst)
|
||||
{
|
||||
const struct rc_opcode_info * info = rc_get_opcode_info(inst->U.I.Opcode);
|
||||
unsigned int i;
|
||||
|
||||
if (inst->U.I.PreSub.Opcode != RC_PRESUB_NONE || inst->U.I.SaturateMode)
|
||||
return 0;
|
||||
|
||||
for(i = 0; i < info->NumSrcRegs; i++) {
|
||||
if (src_reads_dst_mask(inst->U.I.SrcReg[i], inst->U.I.DstReg))
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int peephole_add_presub_add(
|
||||
struct radeon_compiler * c,
|
||||
struct rc_instruction * inst_add)
|
||||
@@ -635,10 +658,7 @@ static int peephole_add_presub_add(
|
||||
unsigned int i;
|
||||
struct peephole_state s;
|
||||
|
||||
if (inst_add->U.I.PreSub.Opcode != RC_PRESUB_NONE)
|
||||
return 0;
|
||||
|
||||
if (inst_add->U.I.SaturateMode)
|
||||
if (!is_presub_candidate(inst_add))
|
||||
return 0;
|
||||
|
||||
if (inst_add->U.I.SrcReg[0].Swizzle != inst_add->U.I.SrcReg[1].Swizzle)
|
||||
@@ -705,10 +725,7 @@ static int peephole_add_presub_inv(
|
||||
unsigned int i, swz, mask;
|
||||
struct peephole_state s;
|
||||
|
||||
if (inst_add->U.I.PreSub.Opcode != RC_PRESUB_NONE)
|
||||
return 0;
|
||||
|
||||
if (inst_add->U.I.SaturateMode)
|
||||
if (!is_presub_candidate(inst_add))
|
||||
return 0;
|
||||
|
||||
mask = inst_add->U.I.DstReg.WriteMask;
|
||||
|
@@ -865,7 +865,7 @@ static void evergreenSetDepthTarget(context_t *context)
|
||||
{
|
||||
EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
|
||||
struct radeon_renderbuffer *rrb;
|
||||
unsigned int nPitchInPixel;
|
||||
unsigned int nPitchInPixel, height;
|
||||
|
||||
rrb = radeon_get_depthbuffer(&context->radeon);
|
||||
if (!rrb)
|
||||
@@ -879,13 +879,22 @@ static void evergreenSetDepthTarget(context_t *context)
|
||||
|
||||
nPitchInPixel = rrb->pitch/rrb->cpp;
|
||||
|
||||
if (context->radeon.radeonScreen->driScreen->dri2.enabled)
|
||||
{
|
||||
height = rrb->base.Height;
|
||||
}
|
||||
else
|
||||
{
|
||||
height = context->radeon.radeonScreen->driScreen->fbHeight;
|
||||
}
|
||||
|
||||
SETfield(evergreen->DB_DEPTH_SIZE.u32All, (nPitchInPixel/8)-1,
|
||||
EG_DB_DEPTH_SIZE__PITCH_TILE_MAX_shift,
|
||||
EG_DB_DEPTH_SIZE__PITCH_TILE_MAX_mask);
|
||||
SETfield(evergreen->DB_DEPTH_SIZE.u32All, (context->radeon.radeonScreen->driScreen->fbHeight/8)-1,
|
||||
SETfield(evergreen->DB_DEPTH_SIZE.u32All, (height/8)-1,
|
||||
EG_DB_DEPTH_SIZE__HEIGHT_TILE_MAX_shift,
|
||||
EG_DB_DEPTH_SIZE__HEIGHT_TILE_MAX_mask);
|
||||
evergreen->DB_DEPTH_SLICE.u32All = ( (nPitchInPixel * context->radeon.radeonScreen->driScreen->fbHeight)/64 )-1;
|
||||
evergreen->DB_DEPTH_SLICE.u32All = ( (nPitchInPixel * height)/64 )-1;
|
||||
|
||||
if(4 == rrb->cpp)
|
||||
{
|
||||
@@ -1052,7 +1061,7 @@ static void evergreenSetRenderTarget(context_t *context, int id)
|
||||
EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
|
||||
uint32_t format = COLOR_8_8_8_8, comp_swap = SWAP_ALT, number_type = NUMBER_UNORM, source_format = 1;
|
||||
struct radeon_renderbuffer *rrb;
|
||||
unsigned int nPitchInPixel;
|
||||
unsigned int nPitchInPixel, height;
|
||||
|
||||
rrb = radeon_get_colorbuffer(&context->radeon);
|
||||
if (!rrb || !rrb->bo) {
|
||||
@@ -1067,13 +1076,22 @@ static void evergreenSetRenderTarget(context_t *context, int id)
|
||||
/* pitch */
|
||||
nPitchInPixel = rrb->pitch/rrb->cpp;
|
||||
|
||||
if (context->radeon.radeonScreen->driScreen->dri2.enabled)
|
||||
{
|
||||
height = rrb->base.Height;
|
||||
}
|
||||
else
|
||||
{
|
||||
height = context->radeon.radeonScreen->driScreen->fbHeight;
|
||||
}
|
||||
|
||||
SETfield(evergreen->render_target[id].CB_COLOR0_PITCH.u32All, (nPitchInPixel/8)-1,
|
||||
EG_CB_COLOR0_PITCH__TILE_MAX_shift,
|
||||
EG_CB_COLOR0_PITCH__TILE_MAX_mask);
|
||||
|
||||
/* slice */
|
||||
SETfield(evergreen->render_target[id].CB_COLOR0_SLICE.u32All,
|
||||
( (nPitchInPixel * context->radeon.radeonScreen->driScreen->fbHeight)/64 )-1,
|
||||
( (nPitchInPixel * height)/64 )-1,
|
||||
EG_CB_COLOR0_SLICE__TILE_MAX_shift,
|
||||
EG_CB_COLOR0_SLICE__TILE_MAX_mask);
|
||||
|
||||
|
@@ -166,7 +166,6 @@ static const struct dri_extension mm_extensions[] = {
|
||||
static const struct dri_extension gl_20_extension[] = {
|
||||
#ifdef R600_ENABLE_GLSL_TEST
|
||||
{"GL_ARB_shading_language_100", GL_VERSION_2_0_functions },
|
||||
{"GL_ARB_shading_language_120", GL_VERSION_2_1_functions },
|
||||
#else
|
||||
{"GL_VERSION_2_0", GL_VERSION_2_0_functions },
|
||||
#endif /* R600_ENABLE_GLSL_TEST */
|
||||
@@ -266,6 +265,8 @@ static void r600InitConstValues(GLcontext *ctx, radeonScreenPtr screen)
|
||||
r700->bShaderUseMemConstant = GL_FALSE;
|
||||
}
|
||||
|
||||
ctx->Const.GLSLVersion = 120;
|
||||
|
||||
ctx->Const.MaxTextureImageUnits = 16;
|
||||
/* 8 per clause on r6xx, 16 on r7xx
|
||||
* but I think mesa only supports 8 at the moment
|
||||
|
@@ -270,7 +270,7 @@ static void r700SetRenderTarget(context_t *context, int id)
|
||||
R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
|
||||
uint32_t format = COLOR_8_8_8_8, comp_swap = SWAP_ALT, number_type = NUMBER_UNORM;
|
||||
struct radeon_renderbuffer *rrb;
|
||||
unsigned int nPitchInPixel;
|
||||
unsigned int nPitchInPixel, height;
|
||||
|
||||
rrb = radeon_get_colorbuffer(&context->radeon);
|
||||
if (!rrb || !rrb->bo) {
|
||||
@@ -283,9 +283,19 @@ static void r700SetRenderTarget(context_t *context, int id)
|
||||
r700->render_target[id].CB_COLOR0_BASE.u32All = context->radeon.state.color.draw_offset / 256;
|
||||
|
||||
nPitchInPixel = rrb->pitch/rrb->cpp;
|
||||
|
||||
if (context->radeon.radeonScreen->driScreen->dri2.enabled)
|
||||
{
|
||||
height = rrb->base.Height;
|
||||
}
|
||||
else
|
||||
{
|
||||
height = context->radeon.radeonScreen->driScreen->fbHeight;
|
||||
}
|
||||
|
||||
SETfield(r700->render_target[id].CB_COLOR0_SIZE.u32All, (nPitchInPixel/8)-1,
|
||||
PITCH_TILE_MAX_shift, PITCH_TILE_MAX_mask);
|
||||
SETfield(r700->render_target[id].CB_COLOR0_SIZE.u32All, ( (nPitchInPixel * context->radeon.radeonScreen->driScreen->fbHeight)/64 )-1,
|
||||
SETfield(r700->render_target[id].CB_COLOR0_SIZE.u32All, ( (nPitchInPixel * height)/64 )-1,
|
||||
SLICE_TILE_MAX_shift, SLICE_TILE_MAX_mask);
|
||||
SETfield(r700->render_target[id].CB_COLOR0_INFO.u32All, ENDIAN_NONE, ENDIAN_shift, ENDIAN_mask);
|
||||
SETfield(r700->render_target[id].CB_COLOR0_INFO.u32All, ARRAY_LINEAR_GENERAL,
|
||||
@@ -544,7 +554,7 @@ static void r700SetDepthTarget(context_t *context)
|
||||
R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
|
||||
|
||||
struct radeon_renderbuffer *rrb;
|
||||
unsigned int nPitchInPixel;
|
||||
unsigned int nPitchInPixel, height;
|
||||
|
||||
rrb = radeon_get_depthbuffer(&context->radeon);
|
||||
if (!rrb)
|
||||
@@ -560,9 +570,18 @@ static void r700SetDepthTarget(context_t *context)
|
||||
|
||||
nPitchInPixel = rrb->pitch/rrb->cpp;
|
||||
|
||||
if (context->radeon.radeonScreen->driScreen->dri2.enabled)
|
||||
{
|
||||
height = rrb->base.Height;
|
||||
}
|
||||
else
|
||||
{
|
||||
height = context->radeon.radeonScreen->driScreen->fbHeight;
|
||||
}
|
||||
|
||||
SETfield(r700->DB_DEPTH_SIZE.u32All, (nPitchInPixel/8)-1,
|
||||
PITCH_TILE_MAX_shift, PITCH_TILE_MAX_mask);
|
||||
SETfield(r700->DB_DEPTH_SIZE.u32All, ( (nPitchInPixel * context->radeon.radeonScreen->driScreen->fbHeight)/64 )-1,
|
||||
SETfield(r700->DB_DEPTH_SIZE.u32All, ( (nPitchInPixel * height)/64 )-1,
|
||||
SLICE_TILE_MAX_shift, SLICE_TILE_MAX_mask); /* size in pixel / 64 - 1 */
|
||||
|
||||
if(4 == rrb->cpp)
|
||||
|
@@ -245,9 +245,16 @@ GLboolean radeonInitContext(radeonContextPtr radeon,
|
||||
DRI_CONF_TEXTURE_DEPTH_32 : DRI_CONF_TEXTURE_DEPTH_16;
|
||||
|
||||
if (IS_R600_CLASS(radeon->radeonScreen)) {
|
||||
radeon->texture_row_align = 256;
|
||||
radeon->texture_rect_row_align = 256;
|
||||
radeon->texture_compressed_row_align = 256;
|
||||
int chip_family = radeon->radeonScreen->chip_family;
|
||||
if (chip_family >= CHIP_FAMILY_CEDAR) {
|
||||
radeon->texture_row_align = 512;
|
||||
radeon->texture_rect_row_align = 512;
|
||||
radeon->texture_compressed_row_align = 512;
|
||||
} else {
|
||||
radeon->texture_row_align = 256;
|
||||
radeon->texture_rect_row_align = 256;
|
||||
radeon->texture_compressed_row_align = 256;
|
||||
}
|
||||
} else if (IS_R200_CLASS(radeon->radeonScreen) ||
|
||||
IS_R100_CLASS(radeon->radeonScreen)) {
|
||||
radeon->texture_row_align = 32;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user