Compare commits
25 Commits
bisect-tem
...
mesa-11.0.
Author | SHA1 | Date | |
---|---|---|---|
|
3f8d44210c | ||
|
579ca506ae | ||
|
94205d0aa2 | ||
|
1b40221850 | ||
|
2fe87a1b68 | ||
|
b83b452eea | ||
|
68bd2ddda0 | ||
|
9db5c2ca2e | ||
|
08c41221d7 | ||
|
896ef5cb95 | ||
|
594388e577 | ||
|
812f2855dd | ||
|
5d8ce45d90 | ||
|
33b0f6e5e1 | ||
|
6659fba2c0 | ||
|
adae777f24 | ||
|
0b690e39dc | ||
|
67fc4b417a | ||
|
7a8d2048bc | ||
|
bf84c85130 | ||
|
aab6075613 | ||
|
2ef3434328 | ||
|
3d58fea2e3 | ||
|
ab94875352 | ||
|
f077632030 |
145
configure.ac
145
configure.ac
@@ -9,7 +9,6 @@ dnl Copyright © 2009-2014 Jon TURNEY
|
||||
dnl Copyright © 2011-2012 Benjamin Franzke
|
||||
dnl Copyright © 2008-2014 David Airlie
|
||||
dnl Copyright © 2009-2013 Brian Paul
|
||||
dnl Copyright © 2003-2007 Keith Packard, Daniel Stone
|
||||
dnl
|
||||
dnl Permission is hereby granted, free of charge, to any person obtaining a
|
||||
dnl copy of this software and associated documentation files (the "Software"),
|
||||
@@ -988,144 +987,6 @@ fi
|
||||
|
||||
AC_SUBST([MESA_LLVM])
|
||||
|
||||
# SHA1 hashing
|
||||
AC_ARG_WITH([sha1],
|
||||
[AS_HELP_STRING([--with-sha1=libc|libmd|libnettle|libgcrypt|libcrypto|libsha1|CommonCrypto|CryptoAPI],
|
||||
[choose SHA1 implementation])])
|
||||
case "x$with_sha1" in
|
||||
x | xlibc | xlibmd | xlibnettle | xlibgcrypt | xlibcrypto | xlibsha1 | xCommonCrypto | xCryptoAPI)
|
||||
;;
|
||||
*)
|
||||
AC_MSG_ERROR([Illegal value for --with-sha1: $with_sha1])
|
||||
esac
|
||||
|
||||
AC_CHECK_FUNC([SHA1Init], [HAVE_SHA1_IN_LIBC=yes])
|
||||
if test "x$with_sha1" = x && test "x$HAVE_SHA1_IN_LIBC" = xyes; then
|
||||
with_sha1=libc
|
||||
fi
|
||||
if test "x$with_sha1" = xlibc && test "x$HAVE_SHA1_IN_LIBC" != xyes; then
|
||||
AC_MSG_ERROR([sha1 in libc requested but not found])
|
||||
fi
|
||||
if test "x$with_sha1" = xlibc; then
|
||||
AC_DEFINE([HAVE_SHA1_IN_LIBC], [1],
|
||||
[Use libc SHA1 functions])
|
||||
SHA1_LIBS=""
|
||||
fi
|
||||
AC_CHECK_FUNC([CC_SHA1_Init], [HAVE_SHA1_IN_COMMONCRYPTO=yes])
|
||||
if test "x$with_sha1" = x && test "x$HAVE_SHA1_IN_COMMONCRYPTO" = xyes; then
|
||||
with_sha1=CommonCrypto
|
||||
fi
|
||||
if test "x$with_sha1" = xCommonCrypto && test "x$HAVE_SHA1_IN_COMMONCRYPTO" != xyes; then
|
||||
AC_MSG_ERROR([CommonCrypto requested but not found])
|
||||
fi
|
||||
if test "x$with_sha1" = xCommonCrypto; then
|
||||
AC_DEFINE([HAVE_SHA1_IN_COMMONCRYPTO], [1],
|
||||
[Use CommonCrypto SHA1 functions])
|
||||
SHA1_LIBS=""
|
||||
fi
|
||||
dnl stdcall functions cannot be tested with AC_CHECK_LIB
|
||||
AC_CHECK_HEADER([wincrypt.h], [HAVE_SHA1_IN_CRYPTOAPI=yes], [], [#include <windows.h>])
|
||||
if test "x$with_sha1" = x && test "x$HAVE_SHA1_IN_CRYPTOAPI" = xyes; then
|
||||
with_sha1=CryptoAPI
|
||||
fi
|
||||
if test "x$with_sha1" = xCryptoAPI && test "x$HAVE_SHA1_IN_CRYPTOAPI" != xyes; then
|
||||
AC_MSG_ERROR([CryptoAPI requested but not found])
|
||||
fi
|
||||
if test "x$with_sha1" = xCryptoAPI; then
|
||||
AC_DEFINE([HAVE_SHA1_IN_CRYPTOAPI], [1],
|
||||
[Use CryptoAPI SHA1 functions])
|
||||
SHA1_LIBS=""
|
||||
fi
|
||||
AC_CHECK_LIB([md], [SHA1Init], [HAVE_LIBMD=yes])
|
||||
if test "x$with_sha1" = x && test "x$HAVE_LIBMD" = xyes; then
|
||||
with_sha1=libmd
|
||||
fi
|
||||
if test "x$with_sha1" = xlibmd && test "x$HAVE_LIBMD" != xyes; then
|
||||
AC_MSG_ERROR([libmd requested but not found])
|
||||
fi
|
||||
if test "x$with_sha1" = xlibmd; then
|
||||
AC_DEFINE([HAVE_SHA1_IN_LIBMD], [1],
|
||||
[Use libmd SHA1 functions])
|
||||
SHA1_LIBS=-lmd
|
||||
fi
|
||||
PKG_CHECK_MODULES([LIBSHA1], [libsha1], [HAVE_LIBSHA1=yes], [HAVE_LIBSHA1=no])
|
||||
if test "x$with_sha1" = x && test "x$HAVE_LIBSHA1" = xyes; then
|
||||
with_sha1=libsha1
|
||||
fi
|
||||
if test "x$with_sha1" = xlibsha1 && test "x$HAVE_LIBSHA1" != xyes; then
|
||||
AC_MSG_ERROR([libsha1 requested but not found])
|
||||
fi
|
||||
if test "x$with_sha1" = xlibsha1; then
|
||||
AC_DEFINE([HAVE_SHA1_IN_LIBSHA1], [1],
|
||||
[Use libsha1 for SHA1])
|
||||
SHA1_LIBS=-lsha1
|
||||
fi
|
||||
AC_CHECK_LIB([nettle], [nettle_sha1_init], [HAVE_LIBNETTLE=yes])
|
||||
if test "x$with_sha1" = x && test "x$HAVE_LIBNETTLE" = xyes; then
|
||||
with_sha1=libnettle
|
||||
fi
|
||||
if test "x$with_sha1" = xlibnettle && test "x$HAVE_LIBNETTLE" != xyes; then
|
||||
AC_MSG_ERROR([libnettle requested but not found])
|
||||
fi
|
||||
if test "x$with_sha1" = xlibnettle; then
|
||||
AC_DEFINE([HAVE_SHA1_IN_LIBNETTLE], [1],
|
||||
[Use libnettle SHA1 functions])
|
||||
SHA1_LIBS=-lnettle
|
||||
fi
|
||||
AC_CHECK_LIB([gcrypt], [gcry_md_open], [HAVE_LIBGCRYPT=yes])
|
||||
if test "x$with_sha1" = x && test "x$HAVE_LIBGCRYPT" = xyes; then
|
||||
with_sha1=libgcrypt
|
||||
fi
|
||||
if test "x$with_sha1" = xlibgcrypt && test "x$HAVE_LIBGCRYPT" != xyes; then
|
||||
AC_MSG_ERROR([libgcrypt requested but not found])
|
||||
fi
|
||||
if test "x$with_sha1" = xlibgcrypt; then
|
||||
AC_DEFINE([HAVE_SHA1_IN_LIBGCRYPT], [1],
|
||||
[Use libgcrypt SHA1 functions])
|
||||
SHA1_LIBS=-lgcrypt
|
||||
fi
|
||||
# We don't need all of the OpenSSL libraries, just libcrypto
|
||||
AC_CHECK_LIB([crypto], [SHA1_Init], [HAVE_LIBCRYPTO=yes])
|
||||
PKG_CHECK_MODULES([OPENSSL], [openssl], [HAVE_OPENSSL_PKC=yes],
|
||||
[HAVE_OPENSSL_PKC=no])
|
||||
if test "x$HAVE_LIBCRYPTO" = xyes || test "x$HAVE_OPENSSL_PKC" = xyes; then
|
||||
if test "x$with_sha1" = x; then
|
||||
with_sha1=libcrypto
|
||||
fi
|
||||
else
|
||||
if test "x$with_sha1" = xlibcrypto; then
|
||||
AC_MSG_ERROR([OpenSSL libcrypto requested but not found])
|
||||
fi
|
||||
fi
|
||||
if test "x$with_sha1" = xlibcrypto; then
|
||||
if test "x$HAVE_LIBCRYPTO" = xyes; then
|
||||
SHA1_LIBS=-lcrypto
|
||||
else
|
||||
SHA1_LIBS="$OPENSSL_LIBS"
|
||||
SHA1_CFLAGS="$OPENSSL_CFLAGS"
|
||||
fi
|
||||
fi
|
||||
AC_MSG_CHECKING([for SHA1 implementation])
|
||||
AC_MSG_RESULT([$with_sha1])
|
||||
AC_SUBST(SHA1_LIBS)
|
||||
AC_SUBST(SHA1_CFLAGS)
|
||||
|
||||
# Allow user to configure out the shader-cache feature
|
||||
AC_ARG_ENABLE([shader-cache],
|
||||
AS_HELP_STRING([--disable-shader-cache], [Disable binary shader cache]),
|
||||
[enable_shader_cache="$enableval"],
|
||||
[if test "x$with_sha1" != "x"; then
|
||||
enable_shader_cache=yes
|
||||
else
|
||||
enable_shader_cache=no
|
||||
fi])
|
||||
if test "x$with_sha1" = "x"; then
|
||||
if test "x$enable_shader_cache" = "xyes"; then
|
||||
AC_MSG_ERROR([Cannot enable shader cache (no SHA-1 implementation found)])
|
||||
fi
|
||||
fi
|
||||
AM_CONDITIONAL([ENABLE_SHADER_CACHE], [test x$enable_shader_cache = xyes])
|
||||
|
||||
case "$host_os" in
|
||||
linux*)
|
||||
need_pci_id=yes ;;
|
||||
@@ -2484,12 +2345,6 @@ else
|
||||
echo " Gallium: no"
|
||||
fi
|
||||
|
||||
dnl Shader cache
|
||||
echo ""
|
||||
echo " Shader cache: $enable_shader_cache"
|
||||
if test "x$enable_shader_cache" = "xyes"; then
|
||||
echo " With SHA1 from: $with_sha1"
|
||||
fi
|
||||
|
||||
dnl Libraries
|
||||
echo ""
|
||||
|
@@ -41,6 +41,7 @@
|
||||
#include "util/u_tile.h"
|
||||
#include "util/u_prim.h"
|
||||
#include "util/u_surface.h"
|
||||
#include <inttypes.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <limits.h> /* CHAR_BIT */
|
||||
@@ -275,7 +276,7 @@ debug_get_flags_option(const char *name,
|
||||
for (; flags->name; ++flags)
|
||||
namealign = MAX2(namealign, strlen(flags->name));
|
||||
for (flags = orig; flags->name; ++flags)
|
||||
_debug_printf("| %*s [0x%0*lx]%s%s\n", namealign, flags->name,
|
||||
_debug_printf("| %*s [0x%0*"PRIu64"]%s%s\n", namealign, flags->name,
|
||||
(int)sizeof(uint64_t)*CHAR_BIT/4, flags->value,
|
||||
flags->desc ? " " : "", flags->desc ? flags->desc : "");
|
||||
}
|
||||
@@ -290,9 +291,9 @@ debug_get_flags_option(const char *name,
|
||||
|
||||
if (debug_get_option_should_print()) {
|
||||
if (str) {
|
||||
debug_printf("%s: %s = 0x%lx (%s)\n", __FUNCTION__, name, result, str);
|
||||
debug_printf("%s: %s = 0x%"PRIu64" (%s)\n", __FUNCTION__, name, result, str);
|
||||
} else {
|
||||
debug_printf("%s: %s = 0x%lx\n", __FUNCTION__, name, result);
|
||||
debug_printf("%s: %s = 0x%"PRIu64"\n", __FUNCTION__, name, result);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -563,10 +563,29 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
|
||||
val |= COND(fp->writes_pos, A3XX_GRAS_CL_CLIP_CNTL_ZCLIP_DISABLE);
|
||||
val |= COND(fp->frag_coord, A3XX_GRAS_CL_CLIP_CNTL_ZCOORD |
|
||||
A3XX_GRAS_CL_CLIP_CNTL_WCOORD);
|
||||
/* TODO only use if prog doesn't use clipvertex/clipdist */
|
||||
val |= MIN2(util_bitcount(ctx->rasterizer->clip_plane_enable), 6) << 26;
|
||||
OUT_PKT0(ring, REG_A3XX_GRAS_CL_CLIP_CNTL, 1);
|
||||
OUT_RING(ring, val);
|
||||
}
|
||||
|
||||
if (dirty & (FD_DIRTY_RASTERIZER | FD_DIRTY_UCP)) {
|
||||
uint32_t planes = ctx->rasterizer->clip_plane_enable;
|
||||
int count = 0;
|
||||
|
||||
while (planes && count < 6) {
|
||||
int i = ffs(planes) - 1;
|
||||
|
||||
planes &= ~(1U << i);
|
||||
fd_wfi(ctx, ring);
|
||||
OUT_PKT0(ring, REG_A3XX_GRAS_CL_USER_PLANE(count++), 4);
|
||||
OUT_RING(ring, fui(ctx->ucp.ucp[i][0]));
|
||||
OUT_RING(ring, fui(ctx->ucp.ucp[i][1]));
|
||||
OUT_RING(ring, fui(ctx->ucp.ucp[i][2]));
|
||||
OUT_RING(ring, fui(ctx->ucp.ucp[i][3]));
|
||||
}
|
||||
}
|
||||
|
||||
/* NOTE: since primitive_restart is not actually part of any
|
||||
* state object, we need to make sure that we always emit
|
||||
* PRIM_VTX_CNTL.. either that or be more clever and detect
|
||||
|
@@ -334,6 +334,7 @@ struct fd_context {
|
||||
FD_DIRTY_INDEXBUF = (1 << 16),
|
||||
FD_DIRTY_SCISSOR = (1 << 17),
|
||||
FD_DIRTY_STREAMOUT = (1 << 18),
|
||||
FD_DIRTY_UCP = (1 << 19),
|
||||
} dirty;
|
||||
|
||||
struct pipe_blend_state *blend;
|
||||
@@ -355,6 +356,7 @@ struct fd_context {
|
||||
struct fd_constbuf_stateobj constbuf[PIPE_SHADER_TYPES];
|
||||
struct pipe_index_buffer indexbuf;
|
||||
struct fd_streamout_stateobj streamout;
|
||||
struct pipe_clip_state ucp;
|
||||
|
||||
/* GMEM/tile handling fxns: */
|
||||
void (*emit_tile_init)(struct fd_context *ctx);
|
||||
|
@@ -65,7 +65,9 @@ static void
|
||||
fd_set_clip_state(struct pipe_context *pctx,
|
||||
const struct pipe_clip_state *clip)
|
||||
{
|
||||
DBG("TODO: ");
|
||||
struct fd_context *ctx = fd_context(pctx);
|
||||
ctx->ucp = *clip;
|
||||
ctx->dirty |= FD_DIRTY_UCP;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -117,7 +117,6 @@ nv50_blend_state_create(struct pipe_context *pipe,
|
||||
struct nv50_blend_stateobj *so = CALLOC_STRUCT(nv50_blend_stateobj);
|
||||
int i;
|
||||
bool emit_common_func = cso->rt[0].blend_enable;
|
||||
uint32_t ms;
|
||||
|
||||
if (nv50_context(pipe)->screen->tesla->oclass >= NVA3_3D_CLASS) {
|
||||
SB_BEGIN_3D(so, BLEND_INDEPENDENT, 1);
|
||||
@@ -189,15 +188,6 @@ nv50_blend_state_create(struct pipe_context *pipe,
|
||||
SB_DATA (so, nv50_colormask(cso->rt[0].colormask));
|
||||
}
|
||||
|
||||
ms = 0;
|
||||
if (cso->alpha_to_coverage)
|
||||
ms |= NV50_3D_MULTISAMPLE_CTRL_ALPHA_TO_COVERAGE;
|
||||
if (cso->alpha_to_one)
|
||||
ms |= NV50_3D_MULTISAMPLE_CTRL_ALPHA_TO_ONE;
|
||||
|
||||
SB_BEGIN_3D(so, MULTISAMPLE_CTRL, 1);
|
||||
SB_DATA (so, ms);
|
||||
|
||||
assert(so->size <= (sizeof(so->state) / sizeof(so->state[0])));
|
||||
return so;
|
||||
}
|
||||
|
@@ -1,4 +1,6 @@
|
||||
|
||||
#include "util/u_format.h"
|
||||
|
||||
#include "nv50/nv50_context.h"
|
||||
#include "nv50/nv50_defs.xml.h"
|
||||
|
||||
@@ -313,6 +315,25 @@ nv50_validate_derived_2(struct nv50_context *nv50)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_validate_derived_3(struct nv50_context *nv50)
|
||||
{
|
||||
struct nouveau_pushbuf *push = nv50->base.pushbuf;
|
||||
struct pipe_framebuffer_state *fb = &nv50->framebuffer;
|
||||
uint32_t ms = 0;
|
||||
|
||||
if ((!fb->nr_cbufs || !fb->cbufs[0] ||
|
||||
!util_format_is_pure_integer(fb->cbufs[0]->format)) && nv50->blend) {
|
||||
if (nv50->blend->pipe.alpha_to_coverage)
|
||||
ms |= NV50_3D_MULTISAMPLE_CTRL_ALPHA_TO_COVERAGE;
|
||||
if (nv50->blend->pipe.alpha_to_one)
|
||||
ms |= NV50_3D_MULTISAMPLE_CTRL_ALPHA_TO_ONE;
|
||||
}
|
||||
|
||||
BEGIN_NV04(push, NV50_3D(MULTISAMPLE_CTRL), 1);
|
||||
PUSH_DATA (push, ms);
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_validate_clip(struct nv50_context *nv50)
|
||||
{
|
||||
@@ -474,6 +495,7 @@ static struct state_validate {
|
||||
{ nv50_validate_derived_rs, NV50_NEW_FRAGPROG | NV50_NEW_RASTERIZER |
|
||||
NV50_NEW_VERTPROG | NV50_NEW_GMTYPROG },
|
||||
{ nv50_validate_derived_2, NV50_NEW_ZSA | NV50_NEW_FRAMEBUFFER },
|
||||
{ nv50_validate_derived_3, NV50_NEW_BLEND | NV50_NEW_FRAMEBUFFER },
|
||||
{ nv50_validate_clip, NV50_NEW_CLIP | NV50_NEW_RASTERIZER |
|
||||
NV50_NEW_VERTPROG | NV50_NEW_GMTYPROG },
|
||||
{ nv50_constbufs_validate, NV50_NEW_CONSTBUF },
|
||||
|
@@ -19,7 +19,7 @@
|
||||
struct nv50_blend_stateobj {
|
||||
struct pipe_blend_state pipe;
|
||||
int size;
|
||||
uint32_t state[84]; // TODO: allocate less if !independent_blend_enable
|
||||
uint32_t state[82]; // TODO: allocate less if !independent_blend_enable
|
||||
};
|
||||
|
||||
struct nv50_rasterizer_stateobj {
|
||||
|
@@ -68,6 +68,10 @@ nv50_2d_format(enum pipe_format format, bool dst, bool dst_src_equal)
|
||||
return NV50_SURFACE_FORMAT_R16_UNORM;
|
||||
case 4:
|
||||
return NV50_SURFACE_FORMAT_BGRA8_UNORM;
|
||||
case 8:
|
||||
return NV50_SURFACE_FORMAT_RGBA16_FLOAT;
|
||||
case 16:
|
||||
return NV50_SURFACE_FORMAT_RGBA32_FLOAT;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -1003,6 +1007,8 @@ nv50_blitctx_prepare_state(struct nv50_blitctx *blit)
|
||||
/* zsa state */
|
||||
BEGIN_NV04(push, NV50_3D(DEPTH_TEST_ENABLE), 1);
|
||||
PUSH_DATA (push, 0);
|
||||
BEGIN_NV04(push, NV50_3D(DEPTH_BOUNDS_EN), 1);
|
||||
PUSH_DATA (push, 0);
|
||||
BEGIN_NV04(push, NV50_3D(STENCIL_ENABLE), 1);
|
||||
PUSH_DATA (push, 0);
|
||||
BEGIN_NV04(push, NV50_3D(ALPHA_TEST_ENABLE), 1);
|
||||
|
@@ -887,6 +887,7 @@ nvc0_blitctx_prepare_state(struct nvc0_blitctx *blit)
|
||||
|
||||
/* zsa state */
|
||||
IMMED_NVC0(push, NVC0_3D(DEPTH_TEST_ENABLE), 0);
|
||||
IMMED_NVC0(push, NVC0_3D(DEPTH_BOUNDS_EN), 0);
|
||||
IMMED_NVC0(push, NVC0_3D(STENCIL_ENABLE), 0);
|
||||
IMMED_NVC0(push, NVC0_3D(ALPHA_TEST_ENABLE), 0);
|
||||
|
||||
|
@@ -2029,6 +2029,8 @@ void r600_bytecode_disasm(struct r600_bytecode *bc)
|
||||
fprintf(stderr, "CND:%X ", cf->cond);
|
||||
if (cf->pop_count)
|
||||
fprintf(stderr, "POP:%X ", cf->pop_count);
|
||||
if (cf->end_of_program)
|
||||
fprintf(stderr, "EOP ");
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
}
|
||||
|
@@ -939,21 +939,22 @@ static inline bool r600_can_read_depth(struct r600_texture *rtex)
|
||||
static inline unsigned r600_conv_prim_to_gs_out(unsigned mode)
|
||||
{
|
||||
static const int prim_conv[] = {
|
||||
V_028A6C_OUTPRIM_TYPE_POINTLIST,
|
||||
V_028A6C_OUTPRIM_TYPE_LINESTRIP,
|
||||
V_028A6C_OUTPRIM_TYPE_LINESTRIP,
|
||||
V_028A6C_OUTPRIM_TYPE_LINESTRIP,
|
||||
V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
V_028A6C_OUTPRIM_TYPE_LINESTRIP,
|
||||
V_028A6C_OUTPRIM_TYPE_LINESTRIP,
|
||||
V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
V_028A6C_OUTPRIM_TYPE_TRISTRIP
|
||||
[PIPE_PRIM_POINTS] = V_028A6C_OUTPRIM_TYPE_POINTLIST,
|
||||
[PIPE_PRIM_LINES] = V_028A6C_OUTPRIM_TYPE_LINESTRIP,
|
||||
[PIPE_PRIM_LINE_LOOP] = V_028A6C_OUTPRIM_TYPE_LINESTRIP,
|
||||
[PIPE_PRIM_LINE_STRIP] = V_028A6C_OUTPRIM_TYPE_LINESTRIP,
|
||||
[PIPE_PRIM_TRIANGLES] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
[PIPE_PRIM_TRIANGLE_STRIP] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
[PIPE_PRIM_TRIANGLE_FAN] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
[PIPE_PRIM_QUADS] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
[PIPE_PRIM_QUAD_STRIP] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
[PIPE_PRIM_POLYGON] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
[PIPE_PRIM_LINES_ADJACENCY] = V_028A6C_OUTPRIM_TYPE_LINESTRIP,
|
||||
[PIPE_PRIM_LINE_STRIP_ADJACENCY] = V_028A6C_OUTPRIM_TYPE_LINESTRIP,
|
||||
[PIPE_PRIM_TRIANGLES_ADJACENCY] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
[PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
|
||||
[PIPE_PRIM_PATCHES] = V_028A6C_OUTPRIM_TYPE_POINTLIST,
|
||||
[R600_PRIM_RECTANGLE_LIST] = V_028A6C_OUTPRIM_TYPE_TRISTRIP
|
||||
};
|
||||
assert(mode < Elements(prim_conv));
|
||||
|
||||
|
@@ -6151,10 +6151,10 @@ static int tgsi_cmp(struct r600_shader_ctx *ctx)
|
||||
r = tgsi_make_src_for_op3(ctx, temp_regs[0], i, &alu.src[0], &ctx->src[0]);
|
||||
if (r)
|
||||
return r;
|
||||
r = tgsi_make_src_for_op3(ctx, temp_regs[1], i, &alu.src[1], &ctx->src[2]);
|
||||
r = tgsi_make_src_for_op3(ctx, temp_regs[2], i, &alu.src[1], &ctx->src[2]);
|
||||
if (r)
|
||||
return r;
|
||||
r = tgsi_make_src_for_op3(ctx, temp_regs[2], i, &alu.src[2], &ctx->src[1]);
|
||||
r = tgsi_make_src_for_op3(ctx, temp_regs[1], i, &alu.src[2], &ctx->src[1]);
|
||||
if (r)
|
||||
return r;
|
||||
tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
|
||||
|
@@ -32,6 +32,7 @@ int bc_decoder::decode_cf(unsigned &i, bc_cf& bc) {
|
||||
int r = 0;
|
||||
uint32_t dw0 = dw[i];
|
||||
uint32_t dw1 = dw[i+1];
|
||||
assert(i+1 <= ndw);
|
||||
|
||||
if ((dw1 >> 29) & 1) { // CF_ALU
|
||||
return decode_cf_alu(i, bc);
|
||||
|
@@ -95,7 +95,7 @@ int bc_parser::decode_shader() {
|
||||
if ((r = decode_cf(i, eop)))
|
||||
return r;
|
||||
|
||||
} while (!eop || (i >> 1) <= max_cf);
|
||||
} while (!eop || (i >> 1) < max_cf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -769,6 +769,7 @@ int bc_parser::prepare_ir() {
|
||||
}
|
||||
|
||||
int bc_parser::prepare_loop(cf_node* c) {
|
||||
assert(c->bc.addr-1 < cf_map.size());
|
||||
|
||||
cf_node *end = cf_map[c->bc.addr - 1];
|
||||
assert(end->bc.op == CF_OP_LOOP_END);
|
||||
@@ -788,8 +789,12 @@ int bc_parser::prepare_loop(cf_node* c) {
|
||||
}
|
||||
|
||||
int bc_parser::prepare_if(cf_node* c) {
|
||||
assert(c->bc.addr-1 < cf_map.size());
|
||||
cf_node *c_else = NULL, *end = cf_map[c->bc.addr];
|
||||
|
||||
if (!end)
|
||||
return 0; // not quite sure how this happens, malformed input?
|
||||
|
||||
BCP_DUMP(
|
||||
sblog << "parsing JUMP @" << c->bc.id;
|
||||
sblog << "\n";
|
||||
@@ -815,7 +820,7 @@ int bc_parser::prepare_if(cf_node* c) {
|
||||
if (c_else->parent != c->parent)
|
||||
c_else = NULL;
|
||||
|
||||
if (end->parent != c->parent)
|
||||
if (end && end->parent != c->parent)
|
||||
end = NULL;
|
||||
|
||||
region_node *reg = sh->create_region();
|
||||
|
@@ -236,7 +236,7 @@ void rp_gpr_tracker::unreserve(alu_node* n) {
|
||||
|
||||
for (i = 0; i < nsrc; ++i) {
|
||||
value *v = n->src[i];
|
||||
if (v->is_readonly())
|
||||
if (v->is_readonly() || v->is_undef())
|
||||
continue;
|
||||
if (i == 1 && opt)
|
||||
continue;
|
||||
|
@@ -197,7 +197,7 @@ static void r600_emit_query_begin(struct r600_common_context *ctx, struct r600_q
|
||||
radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 2, 0));
|
||||
radeon_emit(cs, EVENT_TYPE(EVENT_TYPE_ZPASS_DONE) | EVENT_INDEX(1));
|
||||
radeon_emit(cs, va);
|
||||
radeon_emit(cs, (va >> 32UL) & 0xFF);
|
||||
radeon_emit(cs, (va >> 32) & 0xFFFF);
|
||||
break;
|
||||
case PIPE_QUERY_PRIMITIVES_EMITTED:
|
||||
case PIPE_QUERY_PRIMITIVES_GENERATED:
|
||||
@@ -206,13 +206,13 @@ static void r600_emit_query_begin(struct r600_common_context *ctx, struct r600_q
|
||||
radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 2, 0));
|
||||
radeon_emit(cs, EVENT_TYPE(event_type_for_stream(query)) | EVENT_INDEX(3));
|
||||
radeon_emit(cs, va);
|
||||
radeon_emit(cs, (va >> 32UL) & 0xFF);
|
||||
radeon_emit(cs, (va >> 32) & 0xFFFF);
|
||||
break;
|
||||
case PIPE_QUERY_TIME_ELAPSED:
|
||||
radeon_emit(cs, PKT3(PKT3_EVENT_WRITE_EOP, 4, 0));
|
||||
radeon_emit(cs, EVENT_TYPE(EVENT_TYPE_CACHE_FLUSH_AND_INV_TS_EVENT) | EVENT_INDEX(5));
|
||||
radeon_emit(cs, va);
|
||||
radeon_emit(cs, (3 << 29) | ((va >> 32UL) & 0xFF));
|
||||
radeon_emit(cs, (3 << 29) | ((va >> 32) & 0xFFFF));
|
||||
radeon_emit(cs, 0);
|
||||
radeon_emit(cs, 0);
|
||||
break;
|
||||
@@ -220,7 +220,7 @@ static void r600_emit_query_begin(struct r600_common_context *ctx, struct r600_q
|
||||
radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 2, 0));
|
||||
radeon_emit(cs, EVENT_TYPE(EVENT_TYPE_SAMPLE_PIPELINESTAT) | EVENT_INDEX(2));
|
||||
radeon_emit(cs, va);
|
||||
radeon_emit(cs, (va >> 32UL) & 0xFF);
|
||||
radeon_emit(cs, (va >> 32) & 0xFFFF);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
@@ -254,7 +254,7 @@ static void r600_emit_query_end(struct r600_common_context *ctx, struct r600_que
|
||||
radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 2, 0));
|
||||
radeon_emit(cs, EVENT_TYPE(EVENT_TYPE_ZPASS_DONE) | EVENT_INDEX(1));
|
||||
radeon_emit(cs, va);
|
||||
radeon_emit(cs, (va >> 32UL) & 0xFF);
|
||||
radeon_emit(cs, (va >> 32) & 0xFFFF);
|
||||
break;
|
||||
case PIPE_QUERY_PRIMITIVES_EMITTED:
|
||||
case PIPE_QUERY_PRIMITIVES_GENERATED:
|
||||
@@ -264,7 +264,7 @@ static void r600_emit_query_end(struct r600_common_context *ctx, struct r600_que
|
||||
radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 2, 0));
|
||||
radeon_emit(cs, EVENT_TYPE(event_type_for_stream(query)) | EVENT_INDEX(3));
|
||||
radeon_emit(cs, va);
|
||||
radeon_emit(cs, (va >> 32UL) & 0xFF);
|
||||
radeon_emit(cs, (va >> 32) & 0xFFFF);
|
||||
break;
|
||||
case PIPE_QUERY_TIME_ELAPSED:
|
||||
va += query->buffer.results_end + query->result_size/2;
|
||||
@@ -273,7 +273,7 @@ static void r600_emit_query_end(struct r600_common_context *ctx, struct r600_que
|
||||
radeon_emit(cs, PKT3(PKT3_EVENT_WRITE_EOP, 4, 0));
|
||||
radeon_emit(cs, EVENT_TYPE(EVENT_TYPE_CACHE_FLUSH_AND_INV_TS_EVENT) | EVENT_INDEX(5));
|
||||
radeon_emit(cs, va);
|
||||
radeon_emit(cs, (3 << 29) | ((va >> 32UL) & 0xFF));
|
||||
radeon_emit(cs, (3 << 29) | ((va >> 32) & 0xFFFF));
|
||||
radeon_emit(cs, 0);
|
||||
radeon_emit(cs, 0);
|
||||
break;
|
||||
@@ -282,7 +282,7 @@ static void r600_emit_query_end(struct r600_common_context *ctx, struct r600_que
|
||||
radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 2, 0));
|
||||
radeon_emit(cs, EVENT_TYPE(EVENT_TYPE_SAMPLE_PIPELINESTAT) | EVENT_INDEX(2));
|
||||
radeon_emit(cs, va);
|
||||
radeon_emit(cs, (va >> 32UL) & 0xFF);
|
||||
radeon_emit(cs, (va >> 32) & 0xFFFF);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
|
@@ -97,22 +97,17 @@ static boolean radeon_init_cs_context(struct radeon_cs_context *csc,
|
||||
{
|
||||
int i;
|
||||
|
||||
csc->buf = MALLOC(ws->ib_max_size);
|
||||
if (!csc->buf)
|
||||
return FALSE;
|
||||
csc->fd = ws->fd;
|
||||
csc->nrelocs = 512;
|
||||
csc->relocs_bo = (struct radeon_bo**)
|
||||
CALLOC(1, csc->nrelocs * sizeof(struct radeon_bo*));
|
||||
if (!csc->relocs_bo) {
|
||||
FREE(csc->buf);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
csc->relocs = (struct drm_radeon_cs_reloc*)
|
||||
CALLOC(1, csc->nrelocs * sizeof(struct drm_radeon_cs_reloc));
|
||||
if (!csc->relocs) {
|
||||
FREE(csc->buf);
|
||||
FREE(csc->relocs_bo);
|
||||
return FALSE;
|
||||
}
|
||||
@@ -165,7 +160,6 @@ static void radeon_destroy_cs_context(struct radeon_cs_context *csc)
|
||||
radeon_cs_context_cleanup(csc);
|
||||
FREE(csc->relocs_bo);
|
||||
FREE(csc->relocs);
|
||||
FREE(csc->buf);
|
||||
}
|
||||
|
||||
|
||||
@@ -206,7 +200,7 @@ radeon_drm_cs_create(struct radeon_winsys_ctx *ctx,
|
||||
cs->cst = &cs->csc2;
|
||||
cs->base.buf = cs->csc->buf;
|
||||
cs->base.ring_type = ring_type;
|
||||
cs->base.max_dw = ws->ib_max_size / 4;
|
||||
cs->base.max_dw = ARRAY_SIZE(cs->csc->buf);
|
||||
|
||||
p_atomic_inc(&ws->num_cs);
|
||||
return &cs->base;
|
||||
|
@@ -30,7 +30,7 @@
|
||||
#include "radeon_drm_bo.h"
|
||||
|
||||
struct radeon_cs_context {
|
||||
uint32_t *buf;
|
||||
uint32_t buf[16 * 1024];
|
||||
|
||||
int fd;
|
||||
struct drm_radeon_cs cs;
|
||||
|
@@ -395,20 +395,16 @@ static boolean do_winsys_init(struct radeon_drm_winsys *ws)
|
||||
}
|
||||
|
||||
ws->info.r600_virtual_address = FALSE;
|
||||
ws->ib_max_size = 64 * 1024;
|
||||
|
||||
if (ws->info.drm_minor >= 13) {
|
||||
uint32_t ib_vm_max_size;
|
||||
|
||||
ws->info.r600_virtual_address = TRUE;
|
||||
if (!radeon_get_drm_value(ws->fd, RADEON_INFO_VA_START, NULL,
|
||||
&ws->va_start))
|
||||
ws->info.r600_virtual_address = FALSE;
|
||||
|
||||
if (radeon_get_drm_value(ws->fd, RADEON_INFO_IB_VM_MAX_SIZE, NULL,
|
||||
&ws->ib_max_size))
|
||||
ws->ib_max_size *= 4; /* the kernel returns the size in dwords */
|
||||
else
|
||||
if (!radeon_get_drm_value(ws->fd, RADEON_INFO_IB_VM_MAX_SIZE, NULL,
|
||||
&ib_vm_max_size))
|
||||
ws->info.r600_virtual_address = FALSE;
|
||||
|
||||
radeon_get_drm_value(ws->fd, RADEON_INFO_VA_UNMAP_WORKING, NULL,
|
||||
&ws->va_unmap_working);
|
||||
}
|
||||
|
@@ -73,7 +73,6 @@ struct radeon_drm_winsys {
|
||||
|
||||
enum radeon_generation gen;
|
||||
struct radeon_info info;
|
||||
uint32_t ib_max_size;
|
||||
uint32_t va_start;
|
||||
uint32_t va_unmap_working;
|
||||
uint32_t accel_working2;
|
||||
|
@@ -793,21 +793,6 @@ brw_emit_vertices(struct brw_context *brw)
|
||||
((i * 4) << BRW_VE1_DST_OFFSET_SHIFT));
|
||||
}
|
||||
|
||||
if (brw->gen >= 6 && gen6_edgeflag_input) {
|
||||
uint32_t format =
|
||||
brw_get_vertex_surface_type(brw, gen6_edgeflag_input->glarray);
|
||||
|
||||
OUT_BATCH((gen6_edgeflag_input->buffer << GEN6_VE0_INDEX_SHIFT) |
|
||||
GEN6_VE0_VALID |
|
||||
GEN6_VE0_EDGE_FLAG_ENABLE |
|
||||
(format << BRW_VE0_FORMAT_SHIFT) |
|
||||
(gen6_edgeflag_input->offset << BRW_VE0_SRC_OFFSET_SHIFT));
|
||||
OUT_BATCH((BRW_VE1_COMPONENT_STORE_SRC << BRW_VE1_COMPONENT_0_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_1_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_2_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_3_SHIFT));
|
||||
}
|
||||
|
||||
if (brw->vs.prog_data->uses_vertexid || brw->vs.prog_data->uses_instanceid) {
|
||||
uint32_t dw0 = 0, dw1 = 0;
|
||||
uint32_t comp0 = BRW_VE1_COMPONENT_STORE_0;
|
||||
@@ -848,6 +833,21 @@ brw_emit_vertices(struct brw_context *brw)
|
||||
OUT_BATCH(dw1);
|
||||
}
|
||||
|
||||
if (brw->gen >= 6 && gen6_edgeflag_input) {
|
||||
uint32_t format =
|
||||
brw_get_vertex_surface_type(brw, gen6_edgeflag_input->glarray);
|
||||
|
||||
OUT_BATCH((gen6_edgeflag_input->buffer << GEN6_VE0_INDEX_SHIFT) |
|
||||
GEN6_VE0_VALID |
|
||||
GEN6_VE0_EDGE_FLAG_ENABLE |
|
||||
(format << BRW_VE0_FORMAT_SHIFT) |
|
||||
(gen6_edgeflag_input->offset << BRW_VE0_SRC_OFFSET_SHIFT));
|
||||
OUT_BATCH((BRW_VE1_COMPONENT_STORE_SRC << BRW_VE1_COMPONENT_0_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_1_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_2_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_3_SHIFT));
|
||||
}
|
||||
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
|
||||
|
@@ -4801,12 +4801,12 @@ fs_visitor::optimize()
|
||||
*/
|
||||
bld = fs_builder(this, 64);
|
||||
|
||||
split_virtual_grfs();
|
||||
|
||||
move_uniform_array_access_to_pull_constants();
|
||||
assign_constant_locations();
|
||||
demote_pull_constants();
|
||||
|
||||
split_virtual_grfs();
|
||||
|
||||
#define OPT(pass, args...) ({ \
|
||||
pass_num++; \
|
||||
bool this_progress = pass(args); \
|
||||
|
@@ -878,7 +878,8 @@ brw_upload_invariant_state(struct brw_context *brw)
|
||||
{
|
||||
const bool is_965 = brw->gen == 4 && !brw->is_g4x;
|
||||
|
||||
brw_select_pipeline(brw, BRW_RENDER_PIPELINE);
|
||||
brw_emit_select_pipeline(brw, BRW_RENDER_PIPELINE);
|
||||
brw->last_pipeline = BRW_RENDER_PIPELINE;
|
||||
|
||||
if (brw->gen < 6) {
|
||||
/* Disable depth offset clamping. */
|
||||
|
@@ -40,16 +40,25 @@ gen8_emit_vertices(struct brw_context *brw)
|
||||
{
|
||||
struct gl_context *ctx = &brw->ctx;
|
||||
uint32_t mocs_wb = brw->gen >= 9 ? SKL_MOCS_WB : BDW_MOCS_WB;
|
||||
bool uses_edge_flag;
|
||||
|
||||
brw_prepare_vertices(brw);
|
||||
brw_prepare_shader_draw_parameters(brw);
|
||||
|
||||
uses_edge_flag = (ctx->Polygon.FrontMode != GL_FILL ||
|
||||
ctx->Polygon.BackMode != GL_FILL);
|
||||
|
||||
if (brw->vs.prog_data->uses_vertexid || brw->vs.prog_data->uses_instanceid) {
|
||||
unsigned vue = brw->vb.nr_enabled;
|
||||
|
||||
WARN_ONCE(brw->vs.prog_data->inputs_read & VERT_BIT_EDGEFLAG,
|
||||
"Using VID/IID with edgeflags, need to reorder the "
|
||||
"vertex attributes");
|
||||
/* The element for the edge flags must always be last, so we have to
|
||||
* insert the SGVS before it in that case.
|
||||
*/
|
||||
if (uses_edge_flag) {
|
||||
assert(vue > 0);
|
||||
vue--;
|
||||
}
|
||||
|
||||
WARN_ONCE(vue >= 33,
|
||||
"Trying to insert VID/IID past 33rd vertex element, "
|
||||
"need to reorder the vertex attrbutes.");
|
||||
@@ -138,7 +147,18 @@ gen8_emit_vertices(struct brw_context *brw)
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
|
||||
unsigned nr_elements = brw->vb.nr_enabled + brw->vs.prog_data->uses_vertexid;
|
||||
/* Normally we don't need an element for the SGVS attribute because the
|
||||
* 3DSTATE_VF_SGVS instruction lets you store the generated attribute in an
|
||||
* element that is past the list in 3DSTATE_VERTEX_ELEMENTS. However if the
|
||||
* vertex ID is used then it needs an element for the base vertex buffer.
|
||||
* Additionally if there is an edge flag element then the SGVS can't be
|
||||
* inserted past that so we need a dummy element to ensure that the edge
|
||||
* flag is the last one.
|
||||
*/
|
||||
bool needs_sgvs_element = (brw->vs.prog_data->uses_vertexid ||
|
||||
(brw->vs.prog_data->uses_instanceid &&
|
||||
uses_edge_flag));
|
||||
unsigned nr_elements = brw->vb.nr_enabled + needs_sgvs_element;
|
||||
|
||||
/* The hardware allows one more VERTEX_ELEMENTS than VERTEX_BUFFERS,
|
||||
* presumably for VertexID/InstanceID.
|
||||
@@ -192,6 +212,24 @@ gen8_emit_vertices(struct brw_context *brw)
|
||||
(comp3 << BRW_VE1_COMPONENT_3_SHIFT));
|
||||
}
|
||||
|
||||
if (needs_sgvs_element) {
|
||||
if (brw->vs.prog_data->uses_vertexid) {
|
||||
OUT_BATCH(GEN6_VE0_VALID |
|
||||
brw->vb.nr_buffers << GEN6_VE0_INDEX_SHIFT |
|
||||
BRW_SURFACEFORMAT_R32_UINT << BRW_VE0_FORMAT_SHIFT);
|
||||
OUT_BATCH((BRW_VE1_COMPONENT_STORE_SRC << BRW_VE1_COMPONENT_0_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_1_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_2_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_3_SHIFT));
|
||||
} else {
|
||||
OUT_BATCH(GEN6_VE0_VALID);
|
||||
OUT_BATCH((BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_0_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_1_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_2_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_3_SHIFT));
|
||||
}
|
||||
}
|
||||
|
||||
if (gen6_edgeflag_input) {
|
||||
uint32_t format =
|
||||
brw_get_vertex_surface_type(brw, gen6_edgeflag_input->glarray);
|
||||
@@ -206,25 +244,26 @@ gen8_emit_vertices(struct brw_context *brw)
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_2_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_3_SHIFT));
|
||||
}
|
||||
|
||||
if (brw->vs.prog_data->uses_vertexid) {
|
||||
OUT_BATCH(GEN6_VE0_VALID |
|
||||
brw->vb.nr_buffers << GEN6_VE0_INDEX_SHIFT |
|
||||
BRW_SURFACEFORMAT_R32_UINT << BRW_VE0_FORMAT_SHIFT);
|
||||
OUT_BATCH((BRW_VE1_COMPONENT_STORE_SRC << BRW_VE1_COMPONENT_0_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_1_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_2_SHIFT) |
|
||||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_3_SHIFT));
|
||||
}
|
||||
ADVANCE_BATCH();
|
||||
|
||||
for (unsigned i = 0; i < brw->vb.nr_enabled; i++) {
|
||||
for (unsigned i = 0, j = 0; i < brw->vb.nr_enabled; i++) {
|
||||
const struct brw_vertex_element *input = brw->vb.enabled[i];
|
||||
const struct brw_vertex_buffer *buffer = &brw->vb.buffers[input->buffer];
|
||||
unsigned element_index;
|
||||
|
||||
/* The edge flag element is reordered to be the last one in the code
|
||||
* above so we need to compensate for that in the element indices used
|
||||
* below.
|
||||
*/
|
||||
if (input == gen6_edgeflag_input)
|
||||
element_index = nr_elements - 1;
|
||||
else
|
||||
element_index = j++;
|
||||
|
||||
BEGIN_BATCH(3);
|
||||
OUT_BATCH(_3DSTATE_VF_INSTANCING << 16 | (3 - 2));
|
||||
OUT_BATCH(i | (buffer->step_rate ? GEN8_VF_INSTANCING_ENABLE : 0));
|
||||
OUT_BATCH(element_index |
|
||||
(buffer->step_rate ? GEN8_VF_INSTANCING_ENABLE : 0));
|
||||
OUT_BATCH(buffer->step_rate);
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
|
@@ -35,6 +35,7 @@
|
||||
#include "mtypes.h"
|
||||
#include "state.h"
|
||||
#include "texcompress.h"
|
||||
#include "texstate.h"
|
||||
#include "framebuffer.h"
|
||||
#include "samplerobj.h"
|
||||
#include "stencil.h"
|
||||
@@ -1785,6 +1786,52 @@ _mesa_GetDoublev(GLenum pname, GLdouble *params)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a GL texture binding enum such as GL_TEXTURE_BINDING_2D
|
||||
* into the corresponding Mesa texture target index.
|
||||
* \return TEXTURE_x_INDEX or -1 if binding is invalid
|
||||
*/
|
||||
static int
|
||||
tex_binding_to_index(const struct gl_context *ctx, GLenum binding)
|
||||
{
|
||||
switch (binding) {
|
||||
case GL_TEXTURE_BINDING_1D:
|
||||
return _mesa_is_desktop_gl(ctx) ? TEXTURE_1D_INDEX : -1;
|
||||
case GL_TEXTURE_BINDING_2D:
|
||||
return TEXTURE_2D_INDEX;
|
||||
case GL_TEXTURE_BINDING_3D:
|
||||
return ctx->API != API_OPENGLES ? TEXTURE_3D_INDEX : -1;
|
||||
case GL_TEXTURE_BINDING_CUBE_MAP:
|
||||
return ctx->Extensions.ARB_texture_cube_map
|
||||
? TEXTURE_CUBE_INDEX : -1;
|
||||
case GL_TEXTURE_BINDING_RECTANGLE:
|
||||
return _mesa_is_desktop_gl(ctx) && ctx->Extensions.NV_texture_rectangle
|
||||
? TEXTURE_RECT_INDEX : -1;
|
||||
case GL_TEXTURE_BINDING_1D_ARRAY:
|
||||
return _mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_array
|
||||
? TEXTURE_1D_ARRAY_INDEX : -1;
|
||||
case GL_TEXTURE_BINDING_2D_ARRAY:
|
||||
return (_mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_array)
|
||||
|| _mesa_is_gles3(ctx)
|
||||
? TEXTURE_2D_ARRAY_INDEX : -1;
|
||||
case GL_TEXTURE_BINDING_BUFFER:
|
||||
return ctx->API == API_OPENGL_CORE &&
|
||||
ctx->Extensions.ARB_texture_buffer_object ?
|
||||
TEXTURE_BUFFER_INDEX : -1;
|
||||
case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
|
||||
return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_cube_map_array
|
||||
? TEXTURE_CUBE_ARRAY_INDEX : -1;
|
||||
case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
|
||||
return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_multisample
|
||||
? TEXTURE_2D_MULTISAMPLE_INDEX : -1;
|
||||
case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
|
||||
return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_multisample
|
||||
? TEXTURE_2D_MULTISAMPLE_ARRAY_INDEX : -1;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static enum value_type
|
||||
find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
|
||||
{
|
||||
@@ -2048,6 +2095,45 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
|
||||
v->value_int = ctx->ImageUnits[index].Format;
|
||||
return TYPE_INT;
|
||||
|
||||
/* ARB_direct_state_access */
|
||||
case GL_TEXTURE_BINDING_1D:
|
||||
case GL_TEXTURE_BINDING_1D_ARRAY:
|
||||
case GL_TEXTURE_BINDING_2D:
|
||||
case GL_TEXTURE_BINDING_2D_ARRAY:
|
||||
case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
|
||||
case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
|
||||
case GL_TEXTURE_BINDING_3D:
|
||||
case GL_TEXTURE_BINDING_BUFFER:
|
||||
case GL_TEXTURE_BINDING_CUBE_MAP:
|
||||
case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
|
||||
case GL_TEXTURE_BINDING_RECTANGLE: {
|
||||
int target;
|
||||
|
||||
if (ctx->API != API_OPENGL_CORE)
|
||||
goto invalid_enum;
|
||||
target = tex_binding_to_index(ctx, pname);
|
||||
if (target < 0)
|
||||
goto invalid_enum;
|
||||
if (index >= _mesa_max_tex_unit(ctx))
|
||||
goto invalid_value;
|
||||
|
||||
v->value_int = ctx->Texture.Unit[index].CurrentTex[target]->Name;
|
||||
return TYPE_INT;
|
||||
}
|
||||
|
||||
case GL_SAMPLER_BINDING: {
|
||||
struct gl_sampler_object *samp;
|
||||
|
||||
if (ctx->API != API_OPENGL_CORE)
|
||||
goto invalid_enum;
|
||||
if (index >= _mesa_max_tex_unit(ctx))
|
||||
goto invalid_value;
|
||||
|
||||
samp = ctx->Texture.Unit[index].Sampler;
|
||||
v->value_int = samp ? samp->Name : 0;
|
||||
return TYPE_INT;
|
||||
}
|
||||
|
||||
case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
|
||||
if (!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_compute_shader)
|
||||
goto invalid_enum;
|
||||
|
@@ -1213,6 +1213,13 @@ getteximage_error_check(struct gl_context *ctx,
|
||||
"%s(format=GL_STENCIL_INDEX)", caller);
|
||||
return true;
|
||||
}
|
||||
else if (_mesa_is_stencil_format(format)
|
||||
&& !_mesa_is_depthstencil_format(baseFormat)
|
||||
&& !_mesa_is_stencil_format(baseFormat)) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"%s(format mismatch)", caller);
|
||||
return true;
|
||||
}
|
||||
else if (_mesa_is_ycbcr_format(format)
|
||||
&& !_mesa_is_ycbcr_format(baseFormat)) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
|
@@ -3711,12 +3711,12 @@ texturesubimage(struct gl_context *ctx, GLuint dims,
|
||||
rowStride = _mesa_image_image_stride(&ctx->Unpack, width, height,
|
||||
format, type);
|
||||
/* Copy in each face. */
|
||||
for (i = 0; i < 6; ++i) {
|
||||
for (i = zoffset; i < zoffset + depth; ++i) {
|
||||
texImage = texObj->Image[i][level];
|
||||
assert(texImage);
|
||||
|
||||
_mesa_texture_sub_image(ctx, 3, texObj, texImage, texObj->Target,
|
||||
level, xoffset, yoffset, zoffset,
|
||||
level, xoffset, yoffset, 0,
|
||||
width, height, 1, format,
|
||||
type, pixels, true);
|
||||
pixels = (GLubyte *) pixels + rowStride;
|
||||
@@ -5569,10 +5569,13 @@ static GLboolean
|
||||
is_renderable_texture_format(struct gl_context *ctx, GLenum internalformat)
|
||||
{
|
||||
/* Everything that is allowed for renderbuffers,
|
||||
* except for a base format of GL_STENCIL_INDEX.
|
||||
* except for a base format of GL_STENCIL_INDEX, unless supported.
|
||||
*/
|
||||
GLenum baseFormat = _mesa_base_fbo_format(ctx, internalformat);
|
||||
return baseFormat != 0 && baseFormat != GL_STENCIL_INDEX;
|
||||
if (ctx->Extensions.ARB_texture_stencil8)
|
||||
return baseFormat != 0;
|
||||
else
|
||||
return baseFormat != 0 && baseFormat != GL_STENCIL_INDEX;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -1914,6 +1914,12 @@ get_tex_parameterfv(struct gl_context *ctx,
|
||||
*params = (GLfloat) obj->ImageFormatCompatibilityType;
|
||||
break;
|
||||
|
||||
case GL_TEXTURE_TARGET:
|
||||
if (ctx->API != API_OPENGL_CORE)
|
||||
goto invalid_pname;
|
||||
*params = ENUM_TO_FLOAT(obj->Target);
|
||||
break;
|
||||
|
||||
default:
|
||||
goto invalid_pname;
|
||||
}
|
||||
@@ -2139,6 +2145,12 @@ get_tex_parameteriv(struct gl_context *ctx,
|
||||
*params = obj->ImageFormatCompatibilityType;
|
||||
break;
|
||||
|
||||
case GL_TEXTURE_TARGET:
|
||||
if (ctx->API != API_OPENGL_CORE)
|
||||
goto invalid_pname;
|
||||
*params = (GLint) obj->Target;
|
||||
break;
|
||||
|
||||
default:
|
||||
goto invalid_pname;
|
||||
}
|
||||
|
@@ -1004,6 +1004,7 @@ store_texsubimage(struct gl_context *ctx,
|
||||
/* compute slice info (and do some sanity checks) */
|
||||
switch (target) {
|
||||
case GL_TEXTURE_2D:
|
||||
case GL_TEXTURE_2D_MULTISAMPLE:
|
||||
case GL_TEXTURE_RECTANGLE:
|
||||
case GL_TEXTURE_CUBE_MAP:
|
||||
case GL_TEXTURE_EXTERNAL_OES:
|
||||
@@ -1025,6 +1026,7 @@ store_texsubimage(struct gl_context *ctx,
|
||||
srcImageStride = _mesa_image_row_stride(packing, width, format, type);
|
||||
break;
|
||||
case GL_TEXTURE_2D_ARRAY:
|
||||
case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
|
||||
numSlices = depth;
|
||||
sliceOffset = zoffset;
|
||||
depth = 1;
|
||||
|
@@ -319,24 +319,31 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
|
||||
|
||||
return;
|
||||
}
|
||||
if ((uni->type->base_type == GLSL_TYPE_DOUBLE &&
|
||||
returnType != GLSL_TYPE_DOUBLE) ||
|
||||
(uni->type->base_type != GLSL_TYPE_DOUBLE &&
|
||||
returnType == GLSL_TYPE_DOUBLE)) {
|
||||
_mesa_error( ctx, GL_INVALID_OPERATION,
|
||||
"glGetnUniform*vARB(incompatible uniform types)");
|
||||
return;
|
||||
}
|
||||
|
||||
{
|
||||
unsigned elements = (uni->type->is_sampler())
|
||||
? 1 : uni->type->components();
|
||||
const int dmul = uni->type->base_type == GLSL_TYPE_DOUBLE ? 2 : 1;
|
||||
|
||||
/* Calculate the source base address *BEFORE* modifying elements to
|
||||
* account for the size of the user's buffer.
|
||||
*/
|
||||
const union gl_constant_value *const src =
|
||||
&uni->storage[offset * elements];
|
||||
&uni->storage[offset * elements * dmul];
|
||||
|
||||
assert(returnType == GLSL_TYPE_FLOAT || returnType == GLSL_TYPE_INT ||
|
||||
returnType == GLSL_TYPE_UINT);
|
||||
/* The three (currently) supported types all have the same size,
|
||||
* which is of course the same as their union. That'll change
|
||||
* with glGetUniformdv()...
|
||||
*/
|
||||
unsigned bytes = sizeof(src[0]) * elements;
|
||||
returnType == GLSL_TYPE_UINT || returnType == GLSL_TYPE_DOUBLE);
|
||||
|
||||
/* doubles have a different size than the other 3 types */
|
||||
unsigned bytes = sizeof(src[0]) * elements * dmul;
|
||||
if (bufSize < 0 || bytes > (unsigned) bufSize) {
|
||||
_mesa_error( ctx, GL_INVALID_OPERATION,
|
||||
"glGetnUniform*vARB(out of bounds: bufSize is %d,"
|
||||
|
@@ -888,16 +888,7 @@ _mesa_GetnUniformdvARB(GLuint program, GLint location,
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
|
||||
(void) program;
|
||||
(void) location;
|
||||
(void) bufSize;
|
||||
(void) params;
|
||||
|
||||
/*
|
||||
_mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_DOUBLE, params);
|
||||
*/
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformdvARB"
|
||||
"(GL_ARB_gpu_shader_fp64 not implemented)");
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
|
@@ -36,7 +36,6 @@ libmesautil_la_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src/mesa \
|
||||
-I$(top_srcdir)/src/gallium/include \
|
||||
-I$(top_srcdir)/src/gallium/auxiliary \
|
||||
$(SHA1_CFLAGS) \
|
||||
$(VISIBILITY_CFLAGS) \
|
||||
$(MSVC2008_COMPAT_CFLAGS)
|
||||
|
||||
@@ -44,12 +43,6 @@ libmesautil_la_SOURCES = \
|
||||
$(MESA_UTIL_FILES) \
|
||||
$(MESA_UTIL_GENERATED_FILES)
|
||||
|
||||
if ENABLE_SHADER_CACHE
|
||||
libmesautil_la_SOURCES += $(MESA_UTIL_SHADER_CACHE_FILES)
|
||||
|
||||
libmesautil_la_LIBADD = $(SHA1_LIBS)
|
||||
endif
|
||||
|
||||
roundeven_test_LDADD = -lm
|
||||
|
||||
check_PROGRAMS = u_atomic_test roundeven_test
|
||||
|
@@ -1,7 +1,3 @@
|
||||
MESA_UTIL_SHADER_CACHE_FILES := \
|
||||
mesa-sha1.c \
|
||||
mesa-sha1.h
|
||||
|
||||
MESA_UTIL_FILES := \
|
||||
bitset.h \
|
||||
format_srgb.h \
|
||||
|
@@ -33,11 +33,6 @@ mesautil_sources = (
|
||||
source_lists['MESA_UTIL_GENERATED_FILES']
|
||||
)
|
||||
|
||||
# XXX We don't yet have scons support for detecting any of the various
|
||||
# HAVE_SHA1_* definitions, so for now simply disable the shader cache.
|
||||
if False:
|
||||
mesautil_sources += source_lists['MESA_UTIL_SHADER_CACHE_FILES']
|
||||
|
||||
mesautil = env.ConvenienceLibrary(
|
||||
target = 'mesautil',
|
||||
source = mesautil_sources,
|
||||
|
@@ -1,316 +0,0 @@
|
||||
/* Copyright © 2007 Carl Worth
|
||||
* Copyright © 2009 Jeremy Huddleston, Julien Cristau, and Matthieu Herrb
|
||||
* Copyright © 2009-2010 Mikhail Gusarov
|
||||
* Copyright © 2012 Yaakov Selkowitz and Keith Packard
|
||||
* Copyright © 2014 Intel Corporation
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "mesa-sha1.h"
|
||||
|
||||
#if defined(HAVE_SHA1_IN_LIBMD) /* Use libmd for SHA1 */ \
|
||||
|| defined(HAVE_SHA1_IN_LIBC) /* Use libc for SHA1 */
|
||||
|
||||
#include <sha1.h>
|
||||
|
||||
struct mesa_sha1 *
|
||||
_mesa_sha1_init(void)
|
||||
{
|
||||
SHA1_CTX *ctx = malloc(sizeof(*ctx));
|
||||
|
||||
if (!ctx)
|
||||
return NULL;
|
||||
|
||||
SHA1Init(ctx);
|
||||
return (struct mesa_sha1 *) ctx;
|
||||
}
|
||||
|
||||
int
|
||||
_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size)
|
||||
{
|
||||
SHA1_CTX *sha1_ctx = (SHA1_CTX *) ctx;
|
||||
|
||||
SHA1Update(sha1_ctx, data, size);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20])
|
||||
{
|
||||
SHA1_CTX *sha1_ctx = (SHA1_CTX *) ctx;
|
||||
|
||||
SHA1Final(result, sha1_ctx);
|
||||
free(sha1_ctx);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#elif defined(HAVE_SHA1_IN_COMMONCRYPTO) /* Use CommonCrypto for SHA1 */
|
||||
|
||||
#include <CommonCrypto/CommonDigest.h>
|
||||
|
||||
struct mesa_sha1 *
|
||||
_mesa_sha1_init(void)
|
||||
{
|
||||
CC_SHA1_CTX *ctx = malloc(sizeof(*ctx));
|
||||
|
||||
if (!ctx)
|
||||
return NULL;
|
||||
|
||||
CC_SHA1_Init(ctx);
|
||||
return (struct mesa_sha1 *) ctx;
|
||||
}
|
||||
|
||||
int
|
||||
_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size)
|
||||
{
|
||||
CC_SHA1_CTX *sha1_ctx = (CC_SHA1_CTX *) ctx;
|
||||
|
||||
CC_SHA1_Update(sha1_ctx, data, size);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20])
|
||||
{
|
||||
CC_SHA1_CTX *sha1_ctx = (CC_SHA1_CTX *) ctx;
|
||||
|
||||
CC_SHA1_Final(result, sha1_ctx);
|
||||
free(sha1_ctx);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#elif defined(HAVE_SHA1_IN_CRYPTOAPI) /* Use CryptoAPI for SHA1 */
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <wincrypt.h>
|
||||
|
||||
static HCRYPTPROV hProv;
|
||||
|
||||
struct mesa_sha1 *
|
||||
_mesa_sha1_init(void)
|
||||
{
|
||||
HCRYPTHASH *ctx = malloc(sizeof(*ctx));
|
||||
|
||||
if (!ctx)
|
||||
return NULL;
|
||||
|
||||
CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
|
||||
CryptCreateHash(hProv, CALG_SHA1, 0, 0, ctx);
|
||||
return (struct mesa_sha1 *) ctx;
|
||||
}
|
||||
|
||||
int
|
||||
_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size)
|
||||
{
|
||||
HCRYPTHASH *hHash = (HCRYPTHASH *) ctx;
|
||||
|
||||
CryptHashData(*hHash, data, size, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20])
|
||||
{
|
||||
HCRYPTHASH *hHash = (HCRYPTHASH *) ctx;
|
||||
DWORD len = 20;
|
||||
|
||||
CryptGetHashParam(*hHash, HP_HASHVAL, result, &len, 0);
|
||||
CryptDestroyHash(*hHash);
|
||||
CryptReleaseContext(hProv, 0);
|
||||
free(ctx);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#elif defined(HAVE_SHA1_IN_LIBNETTLE) /* Use libnettle for SHA1 */
|
||||
|
||||
#include <nettle/sha.h>
|
||||
|
||||
struct mesa_sha1 *
|
||||
_mesa_sha1_init(void)
|
||||
{
|
||||
struct sha1_ctx *ctx = malloc(sizeof(*ctx));
|
||||
|
||||
if (!ctx)
|
||||
return NULL;
|
||||
sha1_init(ctx);
|
||||
return (struct mesa_sha1 *) ctx;
|
||||
}
|
||||
|
||||
int
|
||||
_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size)
|
||||
{
|
||||
sha1_update((struct sha1_ctx *) ctx, size, data);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20])
|
||||
{
|
||||
sha1_digest((struct sha1_ctx *) ctx, 20, result);
|
||||
free(ctx);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#elif defined(HAVE_SHA1_IN_LIBGCRYPT) /* Use libgcrypt for SHA1 */
|
||||
|
||||
#include <gcrypt.h>
|
||||
|
||||
struct mesa_sha1 *
|
||||
_mesa_sha1_init(void)
|
||||
{
|
||||
static int init;
|
||||
gcry_md_hd_t h;
|
||||
gcry_error_t err;
|
||||
|
||||
if (!init) {
|
||||
if (!gcry_check_version(NULL))
|
||||
return NULL;
|
||||
gcry_control(GCRYCTL_DISABLE_SECMEM, 0);
|
||||
gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
|
||||
init = 1;
|
||||
}
|
||||
|
||||
err = gcry_md_open(&h, GCRY_MD_SHA1, 0);
|
||||
if (err)
|
||||
return NULL;
|
||||
return (struct mesa_sha1 *) h;
|
||||
}
|
||||
|
||||
int
|
||||
_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size)
|
||||
{
|
||||
gcry_md_hd_t h = (gcry_md_hd_t) ctx;
|
||||
|
||||
gcry_md_write(h, data, size);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20])
|
||||
{
|
||||
gcry_md_hd_t h = (gcry_md_hd_t) ctx;
|
||||
|
||||
memcpy(result, gcry_md_read(h, GCRY_MD_SHA1), 20);
|
||||
gcry_md_close(h);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#elif defined(HAVE_SHA1_IN_LIBSHA1) /* Use libsha1 */
|
||||
|
||||
#include <libsha1.h>
|
||||
|
||||
struct mesa_sha1 *
|
||||
_mesa_sha1_init(void)
|
||||
{
|
||||
sha1_ctx *ctx = malloc(sizeof(*ctx));
|
||||
|
||||
if (!ctx)
|
||||
return NULL;
|
||||
sha1_begin(ctx);
|
||||
return (struct mesa_sha1 *) ctx;
|
||||
}
|
||||
|
||||
int
|
||||
_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size)
|
||||
{
|
||||
sha1_hash(data, size, (sha1_ctx *) ctx);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20])
|
||||
{
|
||||
sha1_end(result, (sha1_ctx *) ctx);
|
||||
free(ctx);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#else /* Use OpenSSL's libcrypto */
|
||||
|
||||
#include <stddef.h> /* buggy openssl/sha.h wants size_t */
|
||||
#include <openssl/sha.h>
|
||||
|
||||
struct mesa_sha1 *
|
||||
_mesa_sha1_init(void)
|
||||
{
|
||||
int ret;
|
||||
SHA_CTX *ctx = malloc(sizeof(*ctx));
|
||||
|
||||
if (!ctx)
|
||||
return NULL;
|
||||
ret = SHA1_Init(ctx);
|
||||
if (!ret) {
|
||||
free(ctx);
|
||||
return NULL;
|
||||
}
|
||||
return (struct mesa_sha1 *) ctx;
|
||||
}
|
||||
|
||||
int
|
||||
_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size)
|
||||
{
|
||||
int ret;
|
||||
SHA_CTX *sha_ctx = (SHA_CTX *) ctx;
|
||||
|
||||
ret = SHA1_Update(sha_ctx, data, size);
|
||||
if (!ret)
|
||||
free(sha_ctx);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20])
|
||||
{
|
||||
int ret;
|
||||
SHA_CTX *sha_ctx = (SHA_CTX *) ctx;
|
||||
|
||||
ret = SHA1_Final(result, (SHA_CTX *) sha_ctx);
|
||||
free(sha_ctx);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void
|
||||
_mesa_sha1_compute(const void *data, size_t size, unsigned char result[20])
|
||||
{
|
||||
struct mesa_sha1 *ctx;
|
||||
|
||||
ctx = _mesa_sha1_init();
|
||||
_mesa_sha1_update(ctx, data, size);
|
||||
_mesa_sha1_final(ctx, result);
|
||||
}
|
||||
|
||||
char *
|
||||
_mesa_sha1_format(char *buf, const unsigned char *sha1)
|
||||
{
|
||||
static const char hex_digits[] = "0123456789abcdef";
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 40; i += 2) {
|
||||
buf[i] = hex_digits[sha1[i >> 1] >> 4];
|
||||
buf[i + 1] = hex_digits[sha1[i >> 1] & 0x0f];
|
||||
}
|
||||
buf[i] = '\0';
|
||||
|
||||
return buf;
|
||||
}
|
@@ -1,53 +0,0 @@
|
||||
/* Copyright © 2014 Intel Corporation
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef SHA1_H
|
||||
#define SHA1_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
struct mesa_sha1;
|
||||
|
||||
struct mesa_sha1 *
|
||||
_mesa_sha1_init(void);
|
||||
|
||||
int
|
||||
_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size);
|
||||
|
||||
int
|
||||
_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20]);
|
||||
|
||||
char *
|
||||
_mesa_sha1_format(char *buf, const unsigned char *sha1);
|
||||
|
||||
void
|
||||
_mesa_sha1_compute(const void *data, size_t size, unsigned char result[20]);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern C */
|
||||
#endif
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user