Compare commits
23 Commits
explicit-s
...
mesa-10.2-
Author | SHA1 | Date | |
---|---|---|---|
|
2e3ded0f44 | ||
|
fbc15d34c3 | ||
|
f6b31ce57d | ||
|
441a8ea491 | ||
|
3d10bc0e5f | ||
|
559fc2d706 | ||
|
e216ce1795 | ||
|
de219af04c | ||
|
6be3f110e9 | ||
|
c469c8daab | ||
|
0b3924b41e | ||
|
e120f1a958 | ||
|
cc92276cb8 | ||
|
fac042fa05 | ||
|
d26b59ec27 | ||
|
c2c15a9a37 | ||
|
e6c98309c6 | ||
|
ffc0cc027a | ||
|
658d0410d0 | ||
|
a1dd1e62fa | ||
|
c7a3c2d29d | ||
|
0a5034517a | ||
|
e8f6150320 |
15
configure.ac
15
configure.ac
@@ -1179,6 +1179,13 @@ if test "x$enable_gbm" = xyes; then
|
||||
if test "x$enable_shared_glapi" = xno; then
|
||||
AC_MSG_ERROR([gbm_dri requires --enable-shared-glapi])
|
||||
fi
|
||||
else
|
||||
# Strictly speaking libgbm does not require --enable-dri, although
|
||||
# both of its backends do. Thus one can build libgbm without any
|
||||
# backends if --disable-dri is set.
|
||||
# To avoid unnecessary complexity of checking if at least one backend
|
||||
# is available when building, just mandate --enable-dri.
|
||||
AC_MSG_ERROR([gbm requires --enable-dri])
|
||||
fi
|
||||
fi
|
||||
AM_CONDITIONAL(HAVE_GBM, test "x$enable_gbm" = xyes)
|
||||
@@ -1605,6 +1612,12 @@ if test "x$enable_gallium_llvm" = xyes; then
|
||||
AC_COMPUTE_INT([LLVM_VERSION_MINOR], [LLVM_VERSION_MINOR],
|
||||
[#include "${LLVM_INCLUDEDIR}/llvm/Config/llvm-config.h"])
|
||||
|
||||
dnl In LLVM 3.4.1 patch level was defined in config.h and not
|
||||
dnl llvm-config.h
|
||||
AC_COMPUTE_INT([LLVM_VERSION_PATCH], [LLVM_VERSION_PATCH],
|
||||
[#include "${LLVM_INCLUDEDIR}/llvm/Config/config.h"],
|
||||
LLVM_VERSION_PATCH=0) dnl Default if LLVM_VERSION_PATCH not found
|
||||
|
||||
if test -n "${LLVM_VERSION_MAJOR}"; then
|
||||
LLVM_VERSION_INT="${LLVM_VERSION_MAJOR}0${LLVM_VERSION_MINOR}"
|
||||
else
|
||||
@@ -1627,7 +1640,7 @@ if test "x$enable_gallium_llvm" = xyes; then
|
||||
LLVM_COMPONENTS="${LLVM_COMPONENTS} option"
|
||||
fi
|
||||
fi
|
||||
DEFINES="${DEFINES} -DHAVE_LLVM=0x0$LLVM_VERSION_INT"
|
||||
DEFINES="${DEFINES} -DHAVE_LLVM=0x0$LLVM_VERSION_INT -DLLVM_VERSION_PATCH=$LLVM_VERSION_PATCH"
|
||||
MESA_LLVM=1
|
||||
|
||||
dnl Check for Clang internal headers
|
||||
|
@@ -1000,6 +1000,8 @@ draw_get_shader_param_no_llvm(unsigned shader, enum pipe_shader_cap param)
|
||||
/**
|
||||
* XXX: Results for PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS because there are two
|
||||
* different ways of setting textures, and drivers typically only support one.
|
||||
* Drivers requesting a draw context explicitly without llvm must call
|
||||
* draw_get_shader_param_no_llvm instead.
|
||||
*/
|
||||
int
|
||||
draw_get_shader_param(unsigned shader, enum pipe_shader_cap param)
|
||||
|
@@ -597,7 +597,7 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader,
|
||||
|
||||
|
||||
#ifdef HAVE_LLVM
|
||||
if (draw_get_option_use_llvm()) {
|
||||
if (shader->draw->llvm) {
|
||||
shader->gs_output = output_verts->verts;
|
||||
if (max_out_prims > shader->max_out_prims) {
|
||||
unsigned i;
|
||||
@@ -674,7 +674,7 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader,
|
||||
void draw_geometry_shader_prepare(struct draw_geometry_shader *shader,
|
||||
struct draw_context *draw)
|
||||
{
|
||||
boolean use_llvm = draw_get_option_use_llvm();
|
||||
boolean use_llvm = draw->llvm != NULL;
|
||||
if (!use_llvm && shader && shader->machine->Tokens != shader->state.tokens) {
|
||||
tgsi_exec_machine_bind_shader(shader->machine,
|
||||
shader->state.tokens,
|
||||
@@ -686,7 +686,7 @@ void draw_geometry_shader_prepare(struct draw_geometry_shader *shader,
|
||||
boolean
|
||||
draw_gs_init( struct draw_context *draw )
|
||||
{
|
||||
if (!draw_get_option_use_llvm()) {
|
||||
if (!draw->llvm) {
|
||||
draw->gs.tgsi.machine = tgsi_exec_machine_create();
|
||||
if (!draw->gs.tgsi.machine)
|
||||
return FALSE;
|
||||
@@ -715,7 +715,7 @@ draw_create_geometry_shader(struct draw_context *draw,
|
||||
const struct pipe_shader_state *state)
|
||||
{
|
||||
#ifdef HAVE_LLVM
|
||||
boolean use_llvm = draw_get_option_use_llvm();
|
||||
boolean use_llvm = draw->llvm != NULL;
|
||||
struct llvm_geometry_shader *llvm_gs;
|
||||
#endif
|
||||
struct draw_geometry_shader *gs;
|
||||
@@ -870,7 +870,7 @@ void draw_delete_geometry_shader(struct draw_context *draw,
|
||||
return;
|
||||
}
|
||||
#ifdef HAVE_LLVM
|
||||
if (draw_get_option_use_llvm()) {
|
||||
if (draw->llvm) {
|
||||
struct llvm_geometry_shader *shader = llvm_geometry_shader(dgs);
|
||||
struct draw_gs_llvm_variant_list_item *li;
|
||||
|
||||
|
@@ -47,7 +47,6 @@
|
||||
#include "tgsi/tgsi_scan.h"
|
||||
|
||||
#ifdef HAVE_LLVM
|
||||
struct draw_llvm;
|
||||
struct gallivm_state;
|
||||
#endif
|
||||
|
||||
@@ -69,6 +68,7 @@ struct tgsi_exec_machine;
|
||||
struct tgsi_sampler;
|
||||
struct draw_pt_front_end;
|
||||
struct draw_assembler;
|
||||
struct draw_llvm;
|
||||
|
||||
|
||||
/**
|
||||
@@ -318,9 +318,7 @@ struct draw_context
|
||||
unsigned start_instance;
|
||||
unsigned start_index;
|
||||
|
||||
#ifdef HAVE_LLVM
|
||||
struct draw_llvm *llvm;
|
||||
#endif
|
||||
|
||||
/** Texture sampler and sampler view state.
|
||||
* Note that we have arrays indexed by shader type. At this time
|
||||
|
@@ -149,7 +149,7 @@ draw_vs_init( struct draw_context *draw )
|
||||
{
|
||||
draw->dump_vs = debug_get_option_gallium_dump_vs();
|
||||
|
||||
if (!draw_get_option_use_llvm()) {
|
||||
if (!draw->llvm) {
|
||||
draw->vs.tgsi.machine = tgsi_exec_machine_create();
|
||||
if (!draw->vs.tgsi.machine)
|
||||
return FALSE;
|
||||
@@ -175,7 +175,7 @@ draw_vs_destroy( struct draw_context *draw )
|
||||
if (draw->vs.emit_cache)
|
||||
translate_cache_destroy(draw->vs.emit_cache);
|
||||
|
||||
if (!draw_get_option_use_llvm())
|
||||
if (!draw->llvm)
|
||||
tgsi_exec_machine_destroy(draw->vs.tgsi.machine);
|
||||
}
|
||||
|
||||
|
@@ -63,7 +63,7 @@ vs_exec_prepare( struct draw_vertex_shader *shader,
|
||||
{
|
||||
struct exec_vertex_shader *evs = exec_vertex_shader(shader);
|
||||
|
||||
debug_assert(!draw_get_option_use_llvm());
|
||||
debug_assert(!draw->llvm);
|
||||
/* Specify the vertex program to interpret/execute.
|
||||
* Avoid rebinding when possible.
|
||||
*/
|
||||
@@ -97,7 +97,7 @@ vs_exec_run_linear( struct draw_vertex_shader *shader,
|
||||
unsigned slot;
|
||||
boolean clamp_vertex_color = shader->draw->rasterizer->clamp_vertex_color;
|
||||
|
||||
debug_assert(!draw_get_option_use_llvm());
|
||||
debug_assert(!shader->draw->llvm);
|
||||
tgsi_exec_set_constant_buffers(machine, PIPE_MAX_CONSTANT_BUFFERS,
|
||||
constants, const_size);
|
||||
|
||||
|
@@ -145,9 +145,6 @@ pipe_loader_sw_release(struct pipe_loader_device **dev)
|
||||
{
|
||||
struct pipe_loader_sw_device *sdev = pipe_loader_sw_device(*dev);
|
||||
|
||||
if (sdev->ws && sdev->ws->destroy)
|
||||
sdev->ws->destroy(sdev->ws);
|
||||
|
||||
if (sdev->lib)
|
||||
util_dl_close(sdev->lib);
|
||||
|
||||
|
@@ -915,6 +915,9 @@ CodeEmitterGK110::emitSET(const CmpInstruction *i)
|
||||
modNegAbsF32_3b(i, 1);
|
||||
}
|
||||
FTZ_(3a);
|
||||
|
||||
if (i->dType == TYPE_F32)
|
||||
code[1] |= 1 << 23;
|
||||
}
|
||||
if (i->sType == TYPE_S32)
|
||||
code[1] |= 1 << 19;
|
||||
|
@@ -152,7 +152,7 @@ static void si_update_descriptors(struct si_context *sctx,
|
||||
7 + /* copy */
|
||||
(4 + desc->element_dw_size) * util_bitcount(desc->dirty_mask) + /* update */
|
||||
4; /* pointer update */
|
||||
#if HAVE_LLVM >= 0x0305
|
||||
#if LLVM_SUPPORTS_GEOM_SHADERS
|
||||
if (desc->shader_userdata_reg >= R_00B130_SPI_SHADER_USER_DATA_VS_0 &&
|
||||
desc->shader_userdata_reg < R_00B230_SPI_SHADER_USER_DATA_GS_0)
|
||||
desc->atom.num_dw += 4; /* second pointer update */
|
||||
@@ -177,7 +177,7 @@ static void si_emit_shader_pointer(struct si_context *sctx,
|
||||
radeon_emit(cs, va);
|
||||
radeon_emit(cs, va >> 32);
|
||||
|
||||
#if HAVE_LLVM >= 0x0305
|
||||
#if LLVM_SUPPORTS_GEOM_SHADERS
|
||||
if (desc->shader_userdata_reg >= R_00B130_SPI_SHADER_USER_DATA_VS_0 &&
|
||||
desc->shader_userdata_reg < R_00B230_SPI_SHADER_USER_DATA_GS_0) {
|
||||
radeon_emit(cs, PKT3(PKT3_SET_SH_REG, 2, 0));
|
||||
|
@@ -224,7 +224,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
|
||||
return 4;
|
||||
|
||||
case PIPE_CAP_GLSL_FEATURE_LEVEL:
|
||||
return HAVE_LLVM >= 0x0305 ? 330 : 140;
|
||||
return (LLVM_SUPPORTS_GEOM_SHADERS) ? 330 : 140;
|
||||
|
||||
case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
|
||||
return MIN2(sscreen->b.info.vram_size, 0xFFFFFFFF);
|
||||
@@ -308,7 +308,7 @@ static int si_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enu
|
||||
case PIPE_SHADER_VERTEX:
|
||||
break;
|
||||
case PIPE_SHADER_GEOMETRY:
|
||||
#if HAVE_LLVM < 0x0305
|
||||
#if !(LLVM_SUPPORTS_GEOM_SHADERS)
|
||||
return 0;
|
||||
#endif
|
||||
break;
|
||||
|
@@ -39,6 +39,10 @@
|
||||
|
||||
#define SI_MAX_DRAW_CS_DWORDS 18
|
||||
|
||||
#define LLVM_SUPPORTS_GEOM_SHADERS \
|
||||
((HAVE_LLVM >= 0x0305) || \
|
||||
(HAVE_LLVM == 0x0304 && LLVM_VERSION_PATCH >= 1))
|
||||
|
||||
struct si_pipe_compute;
|
||||
|
||||
struct si_screen {
|
||||
|
@@ -2173,7 +2173,7 @@ static void *si_create_fs_state(struct pipe_context *ctx,
|
||||
return si_create_shader_state(ctx, state, PIPE_SHADER_FRAGMENT);
|
||||
}
|
||||
|
||||
#if HAVE_LLVM >= 0x0305
|
||||
#if LLVM_SUPPORTS_GEOM_SHADERS
|
||||
|
||||
static void *si_create_gs_state(struct pipe_context *ctx,
|
||||
const struct pipe_shader_state *state)
|
||||
@@ -2203,7 +2203,7 @@ static void si_bind_vs_shader(struct pipe_context *ctx, void *state)
|
||||
sctx->vs_shader = sel;
|
||||
}
|
||||
|
||||
#if HAVE_LLVM >= 0x0305
|
||||
#if LLVM_SUPPORTS_GEOM_SHADERS
|
||||
|
||||
static void si_bind_gs_shader(struct pipe_context *ctx, void *state)
|
||||
{
|
||||
@@ -2271,7 +2271,7 @@ static void si_delete_vs_shader(struct pipe_context *ctx, void *state)
|
||||
si_delete_shader_selector(ctx, sel);
|
||||
}
|
||||
|
||||
#if HAVE_LLVM >= 0x0305
|
||||
#if LLVM_SUPPORTS_GEOM_SHADERS
|
||||
|
||||
static void si_delete_gs_shader(struct pipe_context *ctx, void *state)
|
||||
{
|
||||
@@ -2767,7 +2767,7 @@ static void si_bind_vs_sampler_states(struct pipe_context *ctx, unsigned count,
|
||||
si_set_sampler_states(sctx, pm4, count, states,
|
||||
&sctx->samplers[PIPE_SHADER_VERTEX],
|
||||
R_00B130_SPI_SHADER_USER_DATA_VS_0);
|
||||
#if HAVE_LLVM >= 0x0305
|
||||
#if LLVM_SUPPORTS_GEOM_SHADERS
|
||||
si_set_sampler_states(sctx, pm4, count, states,
|
||||
&sctx->samplers[PIPE_SHADER_VERTEX],
|
||||
R_00B330_SPI_SHADER_USER_DATA_ES_0);
|
||||
@@ -2999,7 +2999,7 @@ void si_init_state_functions(struct si_context *sctx)
|
||||
sctx->b.b.bind_fs_state = si_bind_ps_shader;
|
||||
sctx->b.b.delete_vs_state = si_delete_vs_shader;
|
||||
sctx->b.b.delete_fs_state = si_delete_ps_shader;
|
||||
#if HAVE_LLVM >= 0x0305
|
||||
#if LLVM_SUPPORTS_GEOM_SHADERS
|
||||
sctx->b.b.create_gs_state = si_create_gs_state;
|
||||
sctx->b.b.bind_gs_state = si_bind_gs_shader;
|
||||
sctx->b.b.delete_gs_state = si_delete_gs_shader;
|
||||
|
@@ -42,8 +42,11 @@ namespace {
|
||||
device::device(clover::platform &platform, pipe_loader_device *ldev) :
|
||||
platform(platform), ldev(ldev) {
|
||||
pipe = pipe_loader_create_screen(ldev, PIPE_SEARCH_DIR);
|
||||
if (!pipe || !pipe->get_param(pipe, PIPE_CAP_COMPUTE))
|
||||
if (!pipe || !pipe->get_param(pipe, PIPE_CAP_COMPUTE)) {
|
||||
if (pipe)
|
||||
pipe->destroy(pipe);
|
||||
throw error(CL_INVALID_DEVICE);
|
||||
}
|
||||
}
|
||||
|
||||
device::~device() {
|
||||
|
@@ -223,7 +223,7 @@ XA_EXPORT int
|
||||
xa_copy_prepare(struct xa_context *ctx,
|
||||
struct xa_surface *dst, struct xa_surface *src)
|
||||
{
|
||||
if (src == dst || ctx->srf != NULL)
|
||||
if (src == dst)
|
||||
return -XA_ERR_INVAL;
|
||||
|
||||
if (src->tex->format != dst->tex->format) {
|
||||
|
@@ -1319,6 +1319,13 @@ layout_qualifier_id:
|
||||
if (match_layout_qualifier("location", $1, state) == 0) {
|
||||
$$.flags.q.explicit_location = 1;
|
||||
|
||||
if ($$.flags.q.attribute == 1 &&
|
||||
state->ARB_explicit_attrib_location_warn) {
|
||||
_mesa_glsl_warning(& @1, state,
|
||||
"GL_ARB_explicit_attrib_location layout "
|
||||
"identifier `%s' used", $1);
|
||||
}
|
||||
|
||||
if ($3 >= 0) {
|
||||
$$.location = $3;
|
||||
} else {
|
||||
@@ -1426,10 +1433,6 @@ layout_qualifier_id:
|
||||
_mesa_glsl_error(& @1, state, "unrecognized layout identifier "
|
||||
"`%s'", $1);
|
||||
YYERROR;
|
||||
} else if (state->ARB_explicit_attrib_location_warn) {
|
||||
_mesa_glsl_warning(& @1, state,
|
||||
"GL_ARB_explicit_attrib_location layout "
|
||||
"identifier `%s' used", $1);
|
||||
}
|
||||
}
|
||||
| interface_block_layout_qualifier
|
||||
|
@@ -1092,11 +1092,11 @@ bool
|
||||
populate_consumer_input_sets(void *mem_ctx, exec_list *ir,
|
||||
hash_table *consumer_inputs,
|
||||
hash_table *consumer_interface_inputs,
|
||||
ir_variable *consumer_inputs_with_locations[MAX_VARYING])
|
||||
ir_variable *consumer_inputs_with_locations[VARYING_SLOT_MAX])
|
||||
{
|
||||
memset(consumer_inputs_with_locations,
|
||||
0,
|
||||
sizeof(consumer_inputs_with_locations[0]) * MAX_VARYING);
|
||||
sizeof(consumer_inputs_with_locations[0]) * VARYING_SLOT_MAX);
|
||||
|
||||
foreach_list(node, ir) {
|
||||
ir_variable *const input_var = ((ir_instruction *) node)->as_variable();
|
||||
@@ -1152,7 +1152,7 @@ get_matching_input(void *mem_ctx,
|
||||
const ir_variable *output_var,
|
||||
hash_table *consumer_inputs,
|
||||
hash_table *consumer_interface_inputs,
|
||||
ir_variable *consumer_inputs_with_locations[MAX_VARYING])
|
||||
ir_variable *consumer_inputs_with_locations[VARYING_SLOT_MAX])
|
||||
{
|
||||
ir_variable *input_var;
|
||||
|
||||
@@ -1277,7 +1277,7 @@ assign_varying_locations(struct gl_context *ctx,
|
||||
= hash_table_ctor(0, hash_table_string_hash, hash_table_string_compare);
|
||||
hash_table *consumer_interface_inputs
|
||||
= hash_table_ctor(0, hash_table_string_hash, hash_table_string_compare);
|
||||
ir_variable *consumer_inputs_with_locations[MAX_VARYING] = {
|
||||
ir_variable *consumer_inputs_with_locations[VARYING_SLOT_MAX] = {
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
@@ -39,14 +39,14 @@ bool
|
||||
populate_consumer_input_sets(void *mem_ctx, exec_list *ir,
|
||||
hash_table *consumer_inputs,
|
||||
hash_table *consumer_interface_inputs,
|
||||
ir_variable *consumer_inputs_with_locations[MAX_VARYING]);
|
||||
ir_variable *consumer_inputs_with_locations[VARYING_SLOT_MAX]);
|
||||
|
||||
ir_variable *
|
||||
get_matching_input(void *mem_ctx,
|
||||
const ir_variable *output_var,
|
||||
hash_table *consumer_inputs,
|
||||
hash_table *consumer_interface_inputs,
|
||||
ir_variable *consumer_inputs_with_locations[MAX_VARYING]);
|
||||
ir_variable *consumer_inputs_with_locations[VARYING_SLOT_MAX]);
|
||||
}
|
||||
|
||||
class link_varyings : public ::testing::Test {
|
||||
@@ -70,7 +70,7 @@ public:
|
||||
hash_table *consumer_interface_inputs;
|
||||
|
||||
const glsl_type *simple_interface;
|
||||
ir_variable *junk[MAX_VARYING];
|
||||
ir_variable *junk[VARYING_SLOT_MAX];
|
||||
};
|
||||
|
||||
link_varyings::link_varyings()
|
||||
@@ -197,9 +197,8 @@ TEST_F(link_varyings, gl_ClipDistance)
|
||||
consumer_interface_inputs,
|
||||
junk));
|
||||
|
||||
EXPECT_EQ((void *) clipdistance,
|
||||
hash_table_find(consumer_inputs, "gl_ClipDistance"));
|
||||
EXPECT_EQ(1u, num_elements(consumer_inputs));
|
||||
EXPECT_EQ(clipdistance, junk[VARYING_SLOT_CLIP_DIST0]);
|
||||
EXPECT_TRUE(is_empty(consumer_inputs));
|
||||
EXPECT_TRUE(is_empty(consumer_interface_inputs));
|
||||
}
|
||||
|
||||
|
@@ -141,10 +141,10 @@ fake_queryString(__DRIscreen *screen, int attribute, const char **val)
|
||||
}
|
||||
|
||||
static const __DRI2rendererQueryExtension rendererQueryExt = {
|
||||
.base = { __DRI2_RENDERER_QUERY, 1 },
|
||||
{ __DRI2_RENDERER_QUERY, 1 },
|
||||
|
||||
.queryInteger = fake_queryInteger,
|
||||
.queryString = fake_queryString
|
||||
fake_queryInteger,
|
||||
fake_queryString
|
||||
};
|
||||
|
||||
void dri2_query_renderer_string_test::SetUp()
|
||||
|
@@ -86,6 +86,9 @@
|
||||
/** Return offset in bytes of the field within a vertex struct */
|
||||
#define OFFSET(FIELD) ((void *) offsetof(struct vertex, FIELD))
|
||||
|
||||
static void
|
||||
meta_clear(struct gl_context *ctx, GLbitfield buffers, bool glsl);
|
||||
|
||||
static struct blit_shader *
|
||||
choose_blit_shader(GLenum target, struct blit_shader_table *table);
|
||||
|
||||
@@ -389,6 +392,24 @@ _mesa_meta_init(struct gl_context *ctx)
|
||||
ctx->Meta = CALLOC_STRUCT(gl_meta_state);
|
||||
}
|
||||
|
||||
static GLenum
|
||||
gl_buffer_index_to_drawbuffers_enum(gl_buffer_index bufindex)
|
||||
{
|
||||
assert(bufindex < BUFFER_COUNT);
|
||||
|
||||
if (bufindex >= BUFFER_COLOR0)
|
||||
return GL_COLOR_ATTACHMENT0 + bufindex - BUFFER_COLOR0;
|
||||
else if (bufindex == BUFFER_FRONT_LEFT)
|
||||
return GL_FRONT_LEFT;
|
||||
else if (bufindex == BUFFER_FRONT_RIGHT)
|
||||
return GL_FRONT_RIGHT;
|
||||
else if (bufindex == BUFFER_BACK_LEFT)
|
||||
return GL_BACK_LEFT;
|
||||
else if (bufindex == BUFFER_BACK_RIGHT)
|
||||
return GL_BACK_RIGHT;
|
||||
|
||||
return GL_NONE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Free context meta-op state.
|
||||
@@ -775,6 +796,23 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state)
|
||||
_mesa_set_framebuffer_srgb(ctx, GL_FALSE);
|
||||
}
|
||||
|
||||
if (state & MESA_META_DRAW_BUFFERS) {
|
||||
int buf, real_color_buffers = 0;
|
||||
memset(save->ColorDrawBuffers, 0, sizeof(save->ColorDrawBuffers));
|
||||
|
||||
for (buf = 0; buf < MAX_DRAW_BUFFERS; buf++) {
|
||||
int buf_index = ctx->DrawBuffer->_ColorDrawBufferIndexes[buf];
|
||||
if (buf_index == -1)
|
||||
continue;
|
||||
|
||||
save->ColorDrawBuffers[buf] =
|
||||
gl_buffer_index_to_drawbuffers_enum(buf_index);
|
||||
|
||||
if (++real_color_buffers >= ctx->DrawBuffer->_NumColorDrawBuffers)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* misc */
|
||||
{
|
||||
save->Lighting = ctx->Light.Enabled;
|
||||
@@ -1173,6 +1211,10 @@ _mesa_meta_end(struct gl_context *ctx)
|
||||
ctx->CurrentRenderbuffer->Name != save->RenderbufferName)
|
||||
_mesa_BindRenderbuffer(GL_RENDERBUFFER, save->RenderbufferName);
|
||||
|
||||
if (state & MESA_META_DRAW_BUFFERS) {
|
||||
_mesa_DrawBuffers(MAX_DRAW_BUFFERS, save->ColorDrawBuffers);
|
||||
}
|
||||
|
||||
ctx->Meta->SaveStackDepth--;
|
||||
|
||||
ctx->API = save->API;
|
||||
@@ -1459,100 +1501,13 @@ _mesa_meta_setup_ff_tnl_for_blit(GLuint *VAO, GLuint *VBO,
|
||||
void
|
||||
_mesa_meta_Clear(struct gl_context *ctx, GLbitfield buffers)
|
||||
{
|
||||
struct clear_state *clear = &ctx->Meta->Clear;
|
||||
struct vertex verts[4];
|
||||
/* save all state but scissor, pixel pack/unpack */
|
||||
GLbitfield metaSave = (MESA_META_ALL -
|
||||
MESA_META_SCISSOR -
|
||||
MESA_META_PIXEL_STORE -
|
||||
MESA_META_CONDITIONAL_RENDER -
|
||||
MESA_META_FRAMEBUFFER_SRGB);
|
||||
const GLuint stencilMax = (1 << ctx->DrawBuffer->Visual.stencilBits) - 1;
|
||||
meta_clear(ctx, buffers, false);
|
||||
}
|
||||
|
||||
if (buffers & BUFFER_BITS_COLOR) {
|
||||
/* if clearing color buffers, don't save/restore colormask */
|
||||
metaSave -= MESA_META_COLOR_MASK;
|
||||
}
|
||||
|
||||
_mesa_meta_begin(ctx, metaSave);
|
||||
|
||||
_mesa_meta_setup_vertex_objects(&clear->VAO, &clear->VBO, false, 3, 0, 4);
|
||||
|
||||
/* GL_COLOR_BUFFER_BIT */
|
||||
if (buffers & BUFFER_BITS_COLOR) {
|
||||
/* leave colormask, glDrawBuffer state as-is */
|
||||
|
||||
/* Clears never have the color clamped. */
|
||||
if (ctx->Extensions.ARB_color_buffer_float)
|
||||
_mesa_ClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE);
|
||||
}
|
||||
else {
|
||||
ASSERT(metaSave & MESA_META_COLOR_MASK);
|
||||
_mesa_ColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
||||
}
|
||||
|
||||
/* GL_DEPTH_BUFFER_BIT */
|
||||
if (buffers & BUFFER_BIT_DEPTH) {
|
||||
_mesa_set_enable(ctx, GL_DEPTH_TEST, GL_TRUE);
|
||||
_mesa_DepthFunc(GL_ALWAYS);
|
||||
_mesa_DepthMask(GL_TRUE);
|
||||
}
|
||||
else {
|
||||
assert(!ctx->Depth.Test);
|
||||
}
|
||||
|
||||
/* GL_STENCIL_BUFFER_BIT */
|
||||
if (buffers & BUFFER_BIT_STENCIL) {
|
||||
_mesa_set_enable(ctx, GL_STENCIL_TEST, GL_TRUE);
|
||||
_mesa_StencilOpSeparate(GL_FRONT_AND_BACK,
|
||||
GL_REPLACE, GL_REPLACE, GL_REPLACE);
|
||||
_mesa_StencilFuncSeparate(GL_FRONT_AND_BACK, GL_ALWAYS,
|
||||
ctx->Stencil.Clear & stencilMax,
|
||||
ctx->Stencil.WriteMask[0]);
|
||||
}
|
||||
else {
|
||||
assert(!ctx->Stencil.Enabled);
|
||||
}
|
||||
|
||||
/* vertex positions/colors */
|
||||
{
|
||||
const GLfloat x0 = (GLfloat) ctx->DrawBuffer->_Xmin;
|
||||
const GLfloat y0 = (GLfloat) ctx->DrawBuffer->_Ymin;
|
||||
const GLfloat x1 = (GLfloat) ctx->DrawBuffer->_Xmax;
|
||||
const GLfloat y1 = (GLfloat) ctx->DrawBuffer->_Ymax;
|
||||
const GLfloat z = invert_z(ctx->Depth.Clear);
|
||||
GLuint i;
|
||||
|
||||
verts[0].x = x0;
|
||||
verts[0].y = y0;
|
||||
verts[0].z = z;
|
||||
verts[1].x = x1;
|
||||
verts[1].y = y0;
|
||||
verts[1].z = z;
|
||||
verts[2].x = x1;
|
||||
verts[2].y = y1;
|
||||
verts[2].z = z;
|
||||
verts[3].x = x0;
|
||||
verts[3].y = y1;
|
||||
verts[3].z = z;
|
||||
|
||||
/* vertex colors */
|
||||
for (i = 0; i < 4; i++) {
|
||||
verts[i].r = ctx->Color.ClearColor.f[0];
|
||||
verts[i].g = ctx->Color.ClearColor.f[1];
|
||||
verts[i].b = ctx->Color.ClearColor.f[2];
|
||||
verts[i].a = ctx->Color.ClearColor.f[3];
|
||||
}
|
||||
|
||||
/* upload new vertex data */
|
||||
_mesa_BufferData(GL_ARRAY_BUFFER_ARB, sizeof(verts), verts,
|
||||
GL_DYNAMIC_DRAW_ARB);
|
||||
}
|
||||
|
||||
/* draw quad */
|
||||
_mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
||||
|
||||
_mesa_meta_end(ctx);
|
||||
void
|
||||
_mesa_meta_glsl_Clear(struct gl_context *ctx, GLbitfield buffers)
|
||||
{
|
||||
meta_clear(ctx, buffers, true);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1699,22 +1654,61 @@ meta_glsl_clear_cleanup(struct clear_state *clear)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a bitfield of BUFFER_BIT_x draw buffers, call glDrawBuffers to
|
||||
* set GL to only draw to those buffers.
|
||||
*
|
||||
* Since the bitfield has no associated order, the assignment of draw buffer
|
||||
* indices to color attachment indices is rather arbitrary.
|
||||
*/
|
||||
static void
|
||||
drawbuffers_from_bitfield(GLbitfield bits)
|
||||
{
|
||||
GLenum enums[MAX_DRAW_BUFFERS];
|
||||
int i = 0;
|
||||
int n;
|
||||
|
||||
/* This function is only legal for color buffer bitfields. */
|
||||
assert((bits & ~BUFFER_BITS_COLOR) == 0);
|
||||
|
||||
/* Make sure we don't overflow any arrays. */
|
||||
assert(_mesa_bitcount(bits) <= MAX_DRAW_BUFFERS);
|
||||
|
||||
enums[0] = GL_NONE;
|
||||
|
||||
if (bits & BUFFER_BIT_FRONT_LEFT)
|
||||
enums[i++] = GL_FRONT_LEFT;
|
||||
|
||||
if (bits & BUFFER_BIT_FRONT_RIGHT)
|
||||
enums[i++] = GL_FRONT_RIGHT;
|
||||
|
||||
if (bits & BUFFER_BIT_BACK_LEFT)
|
||||
enums[i++] = GL_BACK_LEFT;
|
||||
|
||||
if (bits & BUFFER_BIT_BACK_RIGHT)
|
||||
enums[i++] = GL_BACK_RIGHT;
|
||||
|
||||
for (n = 0; n < MAX_COLOR_ATTACHMENTS; n++) {
|
||||
if (bits & (1 << (BUFFER_COLOR0 + n)))
|
||||
enums[i++] = GL_COLOR_ATTACHMENT0 + n;
|
||||
}
|
||||
|
||||
_mesa_DrawBuffers(i, enums);
|
||||
}
|
||||
|
||||
/**
|
||||
* Meta implementation of ctx->Driver.Clear() in terms of polygon rendering.
|
||||
*/
|
||||
void
|
||||
_mesa_meta_glsl_Clear(struct gl_context *ctx, GLbitfield buffers)
|
||||
static void
|
||||
meta_clear(struct gl_context *ctx, GLbitfield buffers, bool glsl)
|
||||
{
|
||||
struct clear_state *clear = &ctx->Meta->Clear;
|
||||
GLbitfield metaSave;
|
||||
const GLuint stencilMax = (1 << ctx->DrawBuffer->Visual.stencilBits) - 1;
|
||||
struct gl_framebuffer *fb = ctx->DrawBuffer;
|
||||
const float x0 = ((float)fb->_Xmin / fb->Width) * 2.0f - 1.0f;
|
||||
const float y0 = ((float)fb->_Ymin / fb->Height) * 2.0f - 1.0f;
|
||||
const float x1 = ((float)fb->_Xmax / fb->Width) * 2.0f - 1.0f;
|
||||
const float y1 = ((float)fb->_Ymax / fb->Height) * 2.0f - 1.0f;
|
||||
const float z = -invert_z(ctx->Depth.Clear);
|
||||
float x0, y0, x1, y1, z;
|
||||
struct vertex verts[4];
|
||||
int i;
|
||||
|
||||
metaSave = (MESA_META_ALPHA_TEST |
|
||||
MESA_META_BLEND |
|
||||
@@ -1729,7 +1723,18 @@ _mesa_meta_glsl_Clear(struct gl_context *ctx, GLbitfield buffers)
|
||||
MESA_META_MULTISAMPLE |
|
||||
MESA_META_OCCLUSION_QUERY);
|
||||
|
||||
if (!(buffers & BUFFER_BITS_COLOR)) {
|
||||
if (!glsl) {
|
||||
metaSave |= MESA_META_FOG |
|
||||
MESA_META_PIXEL_TRANSFER |
|
||||
MESA_META_TRANSFORM |
|
||||
MESA_META_TEXTURE |
|
||||
MESA_META_CLAMP_VERTEX_COLOR |
|
||||
MESA_META_SELECT_FEEDBACK;
|
||||
}
|
||||
|
||||
if (buffers & BUFFER_BITS_COLOR) {
|
||||
metaSave |= MESA_META_DRAW_BUFFERS;
|
||||
} else {
|
||||
/* We'll use colormask to disable color writes. Otherwise,
|
||||
* respect color mask
|
||||
*/
|
||||
@@ -1738,13 +1743,30 @@ _mesa_meta_glsl_Clear(struct gl_context *ctx, GLbitfield buffers)
|
||||
|
||||
_mesa_meta_begin(ctx, metaSave);
|
||||
|
||||
meta_glsl_clear_init(ctx, clear);
|
||||
if (glsl) {
|
||||
meta_glsl_clear_init(ctx, clear);
|
||||
|
||||
x0 = ((float) fb->_Xmin / fb->Width) * 2.0f - 1.0f;
|
||||
y0 = ((float) fb->_Ymin / fb->Height) * 2.0f - 1.0f;
|
||||
x1 = ((float) fb->_Xmax / fb->Width) * 2.0f - 1.0f;
|
||||
y1 = ((float) fb->_Ymax / fb->Height) * 2.0f - 1.0f;
|
||||
z = -invert_z(ctx->Depth.Clear);
|
||||
} else {
|
||||
_mesa_meta_setup_vertex_objects(&clear->VAO, &clear->VBO, false, 3, 0, 4);
|
||||
|
||||
x0 = (float) fb->_Xmin;
|
||||
y0 = (float) fb->_Ymin;
|
||||
x1 = (float) fb->_Xmax;
|
||||
y1 = (float) fb->_Ymax;
|
||||
z = invert_z(ctx->Depth.Clear);
|
||||
}
|
||||
|
||||
if (fb->_IntegerColor) {
|
||||
assert(glsl);
|
||||
_mesa_UseProgram(clear->IntegerShaderProg);
|
||||
_mesa_Uniform4iv(clear->IntegerColorLocation, 1,
|
||||
ctx->Color.ClearColor.i);
|
||||
} else {
|
||||
} else if (glsl) {
|
||||
_mesa_UseProgram(clear->ShaderProg);
|
||||
_mesa_Uniform4fv(clear->ColorLocation, 1,
|
||||
ctx->Color.ClearColor.f);
|
||||
@@ -1752,7 +1774,10 @@ _mesa_meta_glsl_Clear(struct gl_context *ctx, GLbitfield buffers)
|
||||
|
||||
/* GL_COLOR_BUFFER_BIT */
|
||||
if (buffers & BUFFER_BITS_COLOR) {
|
||||
/* leave colormask, glDrawBuffer state as-is */
|
||||
/* Only draw to the buffers we were asked to clear. */
|
||||
drawbuffers_from_bitfield(buffers & BUFFER_BITS_COLOR);
|
||||
|
||||
/* leave colormask state as-is */
|
||||
|
||||
/* Clears never have the color clamped. */
|
||||
if (ctx->Extensions.ARB_color_buffer_float)
|
||||
@@ -1800,6 +1825,15 @@ _mesa_meta_glsl_Clear(struct gl_context *ctx, GLbitfield buffers)
|
||||
verts[3].y = y1;
|
||||
verts[3].z = z;
|
||||
|
||||
if (!glsl) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
verts[i].r = ctx->Color.ClearColor.f[0];
|
||||
verts[i].g = ctx->Color.ClearColor.f[1];
|
||||
verts[i].b = ctx->Color.ClearColor.f[2];
|
||||
verts[i].a = ctx->Color.ClearColor.f[3];
|
||||
}
|
||||
}
|
||||
|
||||
/* upload new vertex data */
|
||||
_mesa_BufferData(GL_ARRAY_BUFFER_ARB, sizeof(verts), verts,
|
||||
GL_DYNAMIC_DRAW_ARB);
|
||||
@@ -1807,6 +1841,7 @@ _mesa_meta_glsl_Clear(struct gl_context *ctx, GLbitfield buffers)
|
||||
/* draw quad(s) */
|
||||
if (fb->MaxNumLayers > 0) {
|
||||
unsigned layer;
|
||||
assert(glsl);
|
||||
for (layer = 0; layer < fb->MaxNumLayers; layer++) {
|
||||
if (fb->_IntegerColor)
|
||||
_mesa_Uniform1i(clear->IntegerLayerLocation, layer);
|
||||
@@ -2774,7 +2809,7 @@ copytexsubimage_using_blit_framebuffer(struct gl_context *ctx, GLuint dims,
|
||||
|
||||
_mesa_unlock_texture(ctx, texObj);
|
||||
|
||||
_mesa_meta_begin(ctx, MESA_META_ALL);
|
||||
_mesa_meta_begin(ctx, MESA_META_ALL & ~MESA_META_DRAW_BUFFERS);
|
||||
|
||||
_mesa_GenFramebuffers(1, &fbo);
|
||||
_mesa_BindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
|
||||
@@ -2996,7 +3031,8 @@ decompress_texture_image(struct gl_context *ctx,
|
||||
break;
|
||||
}
|
||||
|
||||
_mesa_meta_begin(ctx, MESA_META_ALL & ~MESA_META_PIXEL_STORE);
|
||||
_mesa_meta_begin(ctx, MESA_META_ALL & ~(MESA_META_PIXEL_STORE |
|
||||
MESA_META_DRAW_BUFFERS));
|
||||
|
||||
samplerSave = ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler ?
|
||||
ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler->Name : 0;
|
||||
|
@@ -58,6 +58,7 @@
|
||||
#define MESA_META_MULTISAMPLE 0x100000
|
||||
#define MESA_META_FRAMEBUFFER_SRGB 0x200000
|
||||
#define MESA_META_OCCLUSION_QUERY 0x400000
|
||||
#define MESA_META_DRAW_BUFFERS 0x800000
|
||||
/**\}*/
|
||||
|
||||
/**
|
||||
@@ -180,6 +181,9 @@ struct save_state
|
||||
GLboolean TransformFeedbackNeedsResume;
|
||||
|
||||
GLuint DrawBufferName, ReadBufferName, RenderbufferName;
|
||||
|
||||
/** MESA_META_DRAW_BUFFERS */
|
||||
GLenum ColorDrawBuffers[MAX_DRAW_BUFFERS];
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -659,7 +659,7 @@ _mesa_meta_BlitFramebuffer(struct gl_context *ctx,
|
||||
/* Only scissor affects blit, but we're doing to set a custom scissor if
|
||||
* necessary anyway, so save/clear state.
|
||||
*/
|
||||
_mesa_meta_begin(ctx, MESA_META_ALL);
|
||||
_mesa_meta_begin(ctx, MESA_META_ALL & ~MESA_META_DRAW_BUFFERS);
|
||||
|
||||
/* If the clipping earlier changed the destination rect at all, then
|
||||
* enable the scissor to clip to it.
|
||||
|
@@ -182,7 +182,7 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target,
|
||||
faceTarget = target;
|
||||
}
|
||||
|
||||
_mesa_meta_begin(ctx, MESA_META_ALL);
|
||||
_mesa_meta_begin(ctx, MESA_META_ALL & ~MESA_META_DRAW_BUFFERS);
|
||||
|
||||
/* Choose between glsl version and fixed function version of
|
||||
* GenerateMipmap function.
|
||||
|
@@ -459,6 +459,8 @@ gen7_update_renderbuffer_surface(struct brw_context *brw,
|
||||
const uint8_t mocs = GEN7_MOCS_L3;
|
||||
GLenum gl_target = rb->TexImage ?
|
||||
rb->TexImage->TexObject->Target : GL_TEXTURE_2D;
|
||||
if (gl_target == GL_TEXTURE_1D_ARRAY)
|
||||
depth = MAX2(rb->Height, 1);
|
||||
|
||||
uint32_t surf_index =
|
||||
brw->wm.prog_data->binding_table.render_target_start + unit;
|
||||
|
@@ -422,6 +422,7 @@ gen8_generator::IF(unsigned predicate)
|
||||
{
|
||||
gen8_instruction *inst = next_inst(BRW_OPCODE_IF);
|
||||
gen8_set_dst(brw, inst, vec1(retype(brw_null_reg(), BRW_REGISTER_TYPE_D)));
|
||||
gen8_set_src0(brw, inst, brw_imm_d(0));
|
||||
gen8_set_exec_size(inst, default_state.exec_size);
|
||||
gen8_set_pred_control(inst, predicate);
|
||||
gen8_set_mask_control(inst, BRW_MASK_ENABLE);
|
||||
@@ -435,6 +436,7 @@ gen8_generator::ELSE()
|
||||
{
|
||||
gen8_instruction *inst = next_inst(BRW_OPCODE_ELSE);
|
||||
gen8_set_dst(brw, inst, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
|
||||
gen8_set_src0(brw, inst, brw_imm_d(0));
|
||||
gen8_set_mask_control(inst, BRW_MASK_ENABLE);
|
||||
push_if_stack(inst);
|
||||
return inst;
|
||||
@@ -456,6 +458,7 @@ gen8_generator::ENDIF()
|
||||
|
||||
gen8_instruction *endif_inst = next_inst(BRW_OPCODE_ENDIF);
|
||||
gen8_set_mask_control(endif_inst, BRW_MASK_ENABLE);
|
||||
gen8_set_src0(brw, endif_inst, brw_imm_d(0));
|
||||
patch_IF_ELSE(if_inst, else_inst, endif_inst);
|
||||
|
||||
return endif_inst;
|
||||
@@ -577,8 +580,7 @@ gen8_generator::BREAK()
|
||||
{
|
||||
gen8_instruction *inst = next_inst(BRW_OPCODE_BREAK);
|
||||
gen8_set_dst(brw, inst, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
|
||||
gen8_set_src0(brw, inst, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
|
||||
gen8_set_src1(brw, inst, brw_imm_d(0));
|
||||
gen8_set_src0(brw, inst, brw_imm_d(0));
|
||||
gen8_set_exec_size(inst, default_state.exec_size);
|
||||
return inst;
|
||||
}
|
||||
@@ -588,8 +590,7 @@ gen8_generator::CONTINUE()
|
||||
{
|
||||
gen8_instruction *inst = next_inst(BRW_OPCODE_CONTINUE);
|
||||
gen8_set_dst(brw, inst, brw_ip_reg());
|
||||
gen8_set_src0(brw, inst, brw_ip_reg());
|
||||
gen8_set_src1(brw, inst, brw_imm_d(0));
|
||||
gen8_set_src0(brw, inst, brw_imm_d(0));
|
||||
gen8_set_exec_size(inst, default_state.exec_size);
|
||||
return inst;
|
||||
}
|
||||
@@ -601,8 +602,7 @@ gen8_generator::WHILE()
|
||||
gen8_instruction *while_inst = next_inst(BRW_OPCODE_WHILE);
|
||||
|
||||
gen8_set_dst(brw, while_inst, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
|
||||
gen8_set_src0(brw, while_inst, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
|
||||
gen8_set_src1(brw, while_inst, brw_imm_ud(0));
|
||||
gen8_set_src0(brw, while_inst, brw_imm_d(0));
|
||||
gen8_set_jip(while_inst, 16 * (do_inst - while_inst));
|
||||
gen8_set_exec_size(while_inst, default_state.exec_size);
|
||||
|
||||
@@ -614,7 +614,7 @@ gen8_generator::HALT()
|
||||
{
|
||||
gen8_instruction *inst = next_inst(BRW_OPCODE_HALT);
|
||||
gen8_set_dst(brw, inst, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
|
||||
gen8_set_src0(brw, inst, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
|
||||
gen8_set_src0(brw, inst, brw_imm_d(0));
|
||||
gen8_set_exec_size(inst, default_state.exec_size);
|
||||
gen8_set_mask_control(inst, BRW_MASK_DISABLE);
|
||||
return inst;
|
||||
|
@@ -134,17 +134,20 @@ gen8_update_texture_surface(struct gl_context *ctx,
|
||||
struct intel_mipmap_tree *mt = intelObj->mt;
|
||||
struct gl_texture_image *firstImage = tObj->Image[0][tObj->BaseLevel];
|
||||
struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
|
||||
mesa_format format = intelObj->_Format;
|
||||
|
||||
if (tObj->Target == GL_TEXTURE_BUFFER) {
|
||||
brw_update_buffer_texture_surface(ctx, unit, surf_offset);
|
||||
return;
|
||||
}
|
||||
|
||||
if (tObj->StencilSampling && firstImage->_BaseFormat == GL_DEPTH_STENCIL)
|
||||
if (tObj->StencilSampling && firstImage->_BaseFormat == GL_DEPTH_STENCIL) {
|
||||
mt = mt->stencil_mt;
|
||||
format = MESA_FORMAT_S_UINT8;
|
||||
}
|
||||
|
||||
unsigned tiling_mode, pitch;
|
||||
if (mt->format == MESA_FORMAT_S_UINT8) {
|
||||
if (format == MESA_FORMAT_S_UINT8) {
|
||||
tiling_mode = GEN8_SURFACE_TILING_W;
|
||||
pitch = 2 * mt->pitch;
|
||||
} else {
|
||||
@@ -152,9 +155,14 @@ gen8_update_texture_surface(struct gl_context *ctx,
|
||||
pitch = mt->pitch;
|
||||
}
|
||||
|
||||
uint32_t tex_format = translate_tex_format(brw,
|
||||
mt->format,
|
||||
sampler->sRGBDecode);
|
||||
/* If this is a view with restricted NumLayers, then our effective depth
|
||||
* is not just the miptree depth.
|
||||
*/
|
||||
uint32_t effective_depth =
|
||||
(tObj->Immutable && tObj->Target != GL_TEXTURE_3D) ? tObj->NumLayers
|
||||
: mt->logical_depth0;
|
||||
|
||||
uint32_t tex_format = translate_tex_format(brw, format, sampler->sRGBDecode);
|
||||
|
||||
uint32_t *surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
|
||||
13 * 4, 64, surf_offset);
|
||||
@@ -178,11 +186,15 @@ gen8_update_texture_surface(struct gl_context *ctx,
|
||||
surf[2] = SET_FIELD(mt->logical_width0 - 1, GEN7_SURFACE_WIDTH) |
|
||||
SET_FIELD(mt->logical_height0 - 1, GEN7_SURFACE_HEIGHT);
|
||||
|
||||
surf[3] = SET_FIELD(mt->logical_depth0 - 1, BRW_SURFACE_DEPTH) | (pitch - 1);
|
||||
surf[3] = SET_FIELD(effective_depth - 1, BRW_SURFACE_DEPTH) | (pitch - 1);
|
||||
|
||||
surf[4] = gen7_surface_msaa_bits(mt->num_samples, mt->msaa_layout);
|
||||
surf[4] = gen7_surface_msaa_bits(mt->num_samples, mt->msaa_layout) |
|
||||
SET_FIELD(tObj->MinLayer, GEN7_SURFACE_MIN_ARRAY_ELEMENT) |
|
||||
SET_FIELD(effective_depth - 1,
|
||||
GEN7_SURFACE_RENDER_TARGET_VIEW_EXTENT);
|
||||
|
||||
surf[5] = SET_FIELD(tObj->BaseLevel - mt->first_level, GEN7_SURFACE_MIN_LOD) |
|
||||
surf[5] = SET_FIELD(tObj->MinLevel + tObj->BaseLevel - mt->first_level,
|
||||
GEN7_SURFACE_MIN_LOD) |
|
||||
(intelObj->_MaxLevel - tObj->BaseLevel); /* mip count */
|
||||
|
||||
surf[6] = 0;
|
||||
@@ -281,6 +293,9 @@ gen8_update_renderbuffer_surface(struct brw_context *brw,
|
||||
GLenum gl_target =
|
||||
rb->TexImage ? rb->TexImage->TexObject->Target : GL_TEXTURE_2D;
|
||||
|
||||
if (gl_target == GL_TEXTURE_1D_ARRAY)
|
||||
depth = MAX2(rb->Height, 1);
|
||||
|
||||
uint32_t surf_index =
|
||||
brw->wm.prog_data->binding_table.render_target_start + unit;
|
||||
|
||||
|
@@ -65,6 +65,7 @@ intelDrawBuffer(struct gl_context * ctx, GLenum mode)
|
||||
* (including the fake front) before we start rendering again.
|
||||
*/
|
||||
dri2InvalidateDrawable(brw->driContext->driDrawablePriv);
|
||||
intel_prepare_render(brw);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,6 +81,7 @@ intelReadBuffer(struct gl_context * ctx, GLenum mode)
|
||||
* (including the fake front) before we start reading again.
|
||||
*/
|
||||
dri2InvalidateDrawable(brw->driContext->driReadablePriv);
|
||||
intel_prepare_render(brw);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -284,6 +284,7 @@ intelInitExtensions(struct gl_context *ctx)
|
||||
|
||||
if (brw->gen >= 7) {
|
||||
ctx->Extensions.ARB_conservative_depth = true;
|
||||
ctx->Extensions.ARB_texture_view = true;
|
||||
ctx->Extensions.AMD_vertex_shader_layer = true;
|
||||
if (can_do_pipelined_register_writes(brw)) {
|
||||
ctx->Extensions.ARB_transform_feedback2 = true;
|
||||
@@ -302,10 +303,6 @@ intelInitExtensions(struct gl_context *ctx)
|
||||
ctx->Extensions.ARB_compute_shader = true;
|
||||
}
|
||||
|
||||
if (brw->gen == 7) {
|
||||
ctx->Extensions.ARB_texture_view = true;
|
||||
}
|
||||
|
||||
if (brw->gen >= 8) {
|
||||
ctx->Extensions.ARB_stencil_texturing = true;
|
||||
}
|
||||
|
@@ -234,6 +234,7 @@ intel_set_texture_image_bo(struct gl_context *ctx,
|
||||
0, width, height, pitch);
|
||||
if (intel_image->mt == NULL)
|
||||
return;
|
||||
intel_image->mt->target = target;
|
||||
intel_image->mt->total_width = width;
|
||||
intel_image->mt->total_height = height;
|
||||
intel_image->mt->level[0].slice[0].x_offset = tile_x;
|
||||
|
@@ -1058,6 +1058,8 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
|
||||
if (att->Layered) {
|
||||
if (att_tex_target == GL_TEXTURE_CUBE_MAP)
|
||||
att_layer_count = 6;
|
||||
else if (att_tex_target == GL_TEXTURE_1D_ARRAY)
|
||||
att_layer_count = att->Renderbuffer->Height;
|
||||
else
|
||||
att_layer_count = att->Renderbuffer->Depth;
|
||||
} else {
|
||||
|
Reference in New Issue
Block a user