summaryrefslogtreecommitdiff
path: root/src/mesa/state_tracker
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r--src/mesa/state_tracker/st_atom_shader.c7
-rw-r--r--src/mesa/state_tracker/st_cb_accum.c2
-rw-r--r--src/mesa/state_tracker/st_cb_drawpixels.c4
-rw-r--r--src/mesa/state_tracker/st_cb_fbo.c2
-rw-r--r--src/mesa/state_tracker/st_cb_flush.c4
-rw-r--r--src/mesa/state_tracker/st_cb_readpixels.c2
-rw-r--r--src/mesa/state_tracker/st_context.c14
-rw-r--r--src/mesa/state_tracker/st_context.h1
-rw-r--r--src/mesa/state_tracker/st_draw.c4
-rw-r--r--src/mesa/state_tracker/st_framebuffer.c112
-rw-r--r--src/mesa/state_tracker/st_mesa_to_tgsi.c46
-rw-r--r--src/mesa/state_tracker/st_program.c3
-rw-r--r--src/mesa/state_tracker/st_public.h2
13 files changed, 128 insertions, 75 deletions
diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c
index 33372b0f39..2a182c7d9c 100644
--- a/src/mesa/state_tracker/st_atom_shader.c
+++ b/src/mesa/state_tracker/st_atom_shader.c
@@ -228,12 +228,17 @@ find_translated_vp(struct st_context *st,
xvp->output_to_slot[outAttr] = vpOutSlot;
numVpOuts++;
}
- else if (outAttr == VERT_RESULT_BFC0 ||
+ else if (outAttr == VERT_RESULT_PSIZ ||
+ outAttr == VERT_RESULT_BFC0 ||
outAttr == VERT_RESULT_BFC1) {
/* backface colors go into last slots */
xvp->output_to_slot[outAttr] = numVpOuts++;
}
}
+ /*
+ printf("output_to_slot[%d] = %d\n", outAttr,
+ xvp->output_to_slot[outAttr]);
+ */
}
/* Unneeded vertex program outputs will go to this slot.
diff --git a/src/mesa/state_tracker/st_cb_accum.c b/src/mesa/state_tracker/st_cb_accum.c
index ea0b1187fc..cf2e9db51c 100644
--- a/src/mesa/state_tracker/st_cb_accum.c
+++ b/src/mesa/state_tracker/st_cb_accum.c
@@ -321,7 +321,7 @@ st_Accum(GLcontext *ctx, GLenum op, GLfloat value)
const GLint height = ctx->DrawBuffer->_Ymax - ypos;
/* make sure color bufs aren't cached */
- pipe->flush(pipe, 0);
+ pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE);
switch (op) {
case GL_ADD:
diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index e70a5b49e1..2db12c653b 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -849,7 +849,7 @@ draw_stencil_pixels(GLcontext *ctx, GLint x, GLint y,
GLint skipPixels;
ubyte *stmap;
- pipe->flush(pipe, 0);
+ pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE);
/* map the stencil buffer */
stmap = pipe_surface_map(ps);
@@ -1208,7 +1208,7 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,
uint format;
/* make sure rendering has completed */
- pipe->flush(pipe, 0x0);
+ pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE);
st_validate_state(st);
diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
index c40f75417f..bc0f26ffb0 100644
--- a/src/mesa/state_tracker/st_cb_fbo.c
+++ b/src/mesa/state_tracker/st_cb_fbo.c
@@ -365,7 +365,7 @@ st_finish_render_texture(GLcontext *ctx,
assert(strb);
- ctx->st->pipe->flush(ctx->st->pipe, 0x0);
+ ctx->st->pipe->flush(ctx->st->pipe, PIPE_FLUSH_RENDER_CACHE);
/*
printf("FINISH RENDER TO TEXTURE surf=%p\n", strb->surface);
diff --git a/src/mesa/state_tracker/st_cb_flush.c b/src/mesa/state_tracker/st_cb_flush.c
index 95149a3200..9808b1f8f6 100644
--- a/src/mesa/state_tracker/st_cb_flush.c
+++ b/src/mesa/state_tracker/st_cb_flush.c
@@ -83,7 +83,7 @@ void st_flush( struct st_context *st, uint pipeFlushFlags )
*/
static void st_Flush(GLcontext *ctx)
{
- st_flush(ctx->st, 0x0);
+ st_flush(ctx->st, PIPE_FLUSH_RENDER_CACHE);
}
@@ -92,7 +92,7 @@ static void st_Flush(GLcontext *ctx)
*/
static void st_Finish(GLcontext *ctx)
{
- st_flush(ctx->st, PIPE_FLUSH_WAIT);
+ st_flush(ctx->st, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_WAIT);
}
diff --git a/src/mesa/state_tracker/st_cb_readpixels.c b/src/mesa/state_tracker/st_cb_readpixels.c
index 96829fcfa0..b0c9275c6f 100644
--- a/src/mesa/state_tracker/st_cb_readpixels.c
+++ b/src/mesa/state_tracker/st_cb_readpixels.c
@@ -155,7 +155,7 @@ st_readpixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,
}
/* make sure rendering has completed */
- pipe->flush(pipe, 0x0);
+ pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE);
if (pack->BufferObj && pack->BufferObj->Name) {
/* reading into a PBO */
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index 524e06fb00..1d26da474e 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -28,6 +28,8 @@
#include "main/imports.h"
#include "main/context.h"
#include "main/extensions.h"
+#include "main/matrix.h"
+#include "main/buffers.h"
#include "vbo/vbo.h"
#include "shader/shader_api.h"
#include "st_public.h"
@@ -163,7 +165,19 @@ void st_make_current(struct st_context *st,
struct st_framebuffer *read)
{
if (st) {
+ GLboolean firstTime = st->ctx->FirstTimeCurrent;
_mesa_make_current(st->ctx, &draw->Base, &read->Base);
+ /* Need to initialize viewport here since draw->Base->Width/Height
+ * will still be zero at this point.
+ * This could be improved, but would require rather extensive work
+ * elsewhere (allocate rb surface storage sooner)
+ */
+ if (firstTime) {
+ GLuint w = draw->InitWidth, h = draw->InitHeight;
+ _mesa_set_viewport(st->ctx, 0, 0, w, h);
+ _mesa_set_scissor(st->ctx, 0, 0, w, h);
+
+ }
}
else {
_mesa_make_current(NULL, NULL, NULL);
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index c3919d474c..0f40f3ceee 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -191,6 +191,7 @@ struct st_framebuffer
{
GLframebuffer Base;
void *Private;
+ GLuint InitWidth, InitHeight;
};
diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c
index a3e061d604..b3d463043d 100644
--- a/src/mesa/state_tracker/st_draw.c
+++ b/src/mesa/state_tracker/st_draw.c
@@ -287,7 +287,7 @@ st_draw_vbo(GLcontext *ctx,
/* common-case setup */
vbuffer[attr].pitch = arrays[mesaAttr]->StrideB; /* in bytes */
- vbuffer[attr].max_index = 0; /* need this? */
+ vbuffer[attr].max_index = max_index;
velement.vertex_buffer_index = attr;
velement.nr_components = arrays[mesaAttr]->Size;
velement.src_format = pipe_vertex_format(arrays[mesaAttr]->Type,
@@ -545,7 +545,7 @@ st_feedback_draw_vbo(GLcontext *ctx,
/* common-case setup */
vbuffer[attr].pitch = arrays[mesaAttr]->StrideB; /* in bytes */
- vbuffer[attr].max_index = 0; /* need this? */
+ vbuffer[attr].max_index = max_index;
velement.vertex_buffer_index = attr;
velement.nr_components = arrays[mesaAttr]->Size;
velement.src_format = pipe_vertex_format(arrays[mesaAttr]->Type,
diff --git a/src/mesa/state_tracker/st_framebuffer.c b/src/mesa/state_tracker/st_framebuffer.c
index b81a894ef1..7ddc74e355 100644
--- a/src/mesa/state_tracker/st_framebuffer.c
+++ b/src/mesa/state_tracker/st_framebuffer.c
@@ -33,84 +33,84 @@
#include "st_public.h"
#include "st_context.h"
#include "st_cb_fbo.h"
+#include "pipe/p_defines.h"
struct st_framebuffer *
st_create_framebuffer( const __GLcontextModes *visual,
- boolean createRenderbuffers, /* XXX remove? */
enum pipe_format colorFormat,
enum pipe_format depthFormat,
enum pipe_format stencilFormat,
+ uint width, uint height,
void *private)
{
struct st_framebuffer *stfb = CALLOC_STRUCT(st_framebuffer);
if (stfb) {
_mesa_initialize_framebuffer(&stfb->Base, visual);
- if (createRenderbuffers) {
- {
- /* fake frontbuffer */
- /* XXX allocation should only happen in the unusual case
- it's actually needed */
- struct gl_renderbuffer *rb
- = st_new_renderbuffer_fb(colorFormat);
- _mesa_add_renderbuffer(&stfb->Base, BUFFER_FRONT_LEFT, rb);
- }
+ {
+ /* fake frontbuffer */
+ /* XXX allocation should only happen in the unusual case
+ it's actually needed */
+ struct gl_renderbuffer *rb
+ = st_new_renderbuffer_fb(colorFormat);
+ _mesa_add_renderbuffer(&stfb->Base, BUFFER_FRONT_LEFT, rb);
+ }
- if (visual->doubleBufferMode) {
- struct gl_renderbuffer *rb
- = st_new_renderbuffer_fb(colorFormat);
- _mesa_add_renderbuffer(&stfb->Base, BUFFER_BACK_LEFT, rb);
- }
+ if (visual->doubleBufferMode) {
+ struct gl_renderbuffer *rb
+ = st_new_renderbuffer_fb(colorFormat);
+ _mesa_add_renderbuffer(&stfb->Base, BUFFER_BACK_LEFT, rb);
+ }
+
+ if (visual->depthBits == 24 && visual->stencilBits == 8) {
+ /* combined depth/stencil buffer */
+ struct gl_renderbuffer *depthStencilRb
+ = st_new_renderbuffer_fb(depthFormat);
+ /* note: bind RB to two attachment points */
+ _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthStencilRb);
+ _mesa_add_renderbuffer(&stfb->Base, BUFFER_STENCIL, depthStencilRb);
+ }
+ else {
+ /* separate depth and/or stencil */
- if (visual->depthBits == 24 && visual->stencilBits == 8) {
- /* combined depth/stencil buffer */
- struct gl_renderbuffer *depthStencilRb
+ if (visual->depthBits == 32) {
+ /* 32-bit depth buffer */
+ struct gl_renderbuffer *depthRb
= st_new_renderbuffer_fb(depthFormat);
- /* note: bind RB to two attachment points */
- _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthStencilRb);
- _mesa_add_renderbuffer(&stfb->Base, BUFFER_STENCIL, depthStencilRb);
+ _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthRb);
}
- else {
- /* separate depth and/or stencil */
-
- if (visual->depthBits == 32) {
- /* 32-bit depth buffer */
- struct gl_renderbuffer *depthRb
- = st_new_renderbuffer_fb(depthFormat);
- _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthRb);
- }
- else if (visual->depthBits == 24) {
- /* 24-bit depth buffer, ignore stencil bits */
- struct gl_renderbuffer *depthRb
- = st_new_renderbuffer_fb(depthFormat);
- _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthRb);
- }
- else if (visual->depthBits > 0) {
- /* 16-bit depth buffer */
- struct gl_renderbuffer *depthRb
- = st_new_renderbuffer_fb(depthFormat);
- _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthRb);
- }
-
- if (visual->stencilBits > 0) {
- /* 8-bit stencil */
- struct gl_renderbuffer *stencilRb
- = st_new_renderbuffer_fb(stencilFormat);
- _mesa_add_renderbuffer(&stfb->Base, BUFFER_STENCIL, stencilRb);
- }
+ else if (visual->depthBits == 24) {
+ /* 24-bit depth buffer, ignore stencil bits */
+ struct gl_renderbuffer *depthRb
+ = st_new_renderbuffer_fb(depthFormat);
+ _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthRb);
+ }
+ else if (visual->depthBits > 0) {
+ /* 16-bit depth buffer */
+ struct gl_renderbuffer *depthRb
+ = st_new_renderbuffer_fb(depthFormat);
+ _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthRb);
}
- if (visual->accumRedBits > 0) {
- /* 16-bit/channel accum */
- struct gl_renderbuffer *accumRb
- = st_new_renderbuffer_fb(PIPE_FORMAT_R16G16B16A16_SNORM);
- _mesa_add_renderbuffer(&stfb->Base, BUFFER_ACCUM, accumRb);
+ if (visual->stencilBits > 0) {
+ /* 8-bit stencil */
+ struct gl_renderbuffer *stencilRb
+ = st_new_renderbuffer_fb(stencilFormat);
+ _mesa_add_renderbuffer(&stfb->Base, BUFFER_STENCIL, stencilRb);
}
}
- stfb->Base.Initialized = GL_TRUE;
+ if (visual->accumRedBits > 0) {
+ /* 16-bit/channel accum */
+ struct gl_renderbuffer *accumRb
+ = st_new_renderbuffer_fb(PIPE_FORMAT_R16G16B16A16_SNORM);
+ _mesa_add_renderbuffer(&stfb->Base, BUFFER_ACCUM, accumRb);
+ }
+ stfb->Base.Initialized = GL_TRUE;
+ stfb->InitWidth = width;
+ stfb->InitHeight = height;
stfb->Private = private;
}
return stfb;
@@ -171,7 +171,7 @@ st_notify_swapbuffers(struct st_framebuffer *stfb)
GET_CURRENT_CONTEXT(ctx);
if (ctx && ctx->DrawBuffer == &stfb->Base) {
- st_flush(ctx->st, 0x0);
+ st_flush(ctx->st, PIPE_FLUSH_RENDER_CACHE);
}
}
diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c
index c8b76978f1..325aa20173 100644
--- a/src/mesa/state_tracker/st_mesa_to_tgsi.c
+++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c
@@ -47,7 +47,9 @@
*/
static GLuint
map_register_file(
- enum register_file file )
+ enum register_file file,
+ GLuint index,
+ const GLuint immediateMapping[] )
{
switch( file ) {
case PROGRAM_UNDEFINED:
@@ -56,10 +58,20 @@ map_register_file(
return TGSI_FILE_TEMPORARY;
//case PROGRAM_LOCAL_PARAM:
//case PROGRAM_ENV_PARAM:
+
+ /* Because of the longstanding problem with mesa arb shaders
+ * where constants, immediates and state variables are all
+ * bundled together as PROGRAM_STATE_VAR, we can't tell from the
+ * mesa register file whether this is a CONSTANT or an
+ * IMMEDIATE, hence we need all the other information.
+ */
case PROGRAM_STATE_VAR:
case PROGRAM_NAMED_PARAM:
case PROGRAM_UNIFORM:
- return TGSI_FILE_CONSTANT;
+ if (immediateMapping[index] != ~0)
+ return TGSI_FILE_IMMEDIATE;
+ else
+ return TGSI_FILE_CONSTANT;
case PROGRAM_CONSTANT:
return TGSI_FILE_IMMEDIATE;
case PROGRAM_INPUT:
@@ -180,7 +192,8 @@ compile_instruction(
const GLuint outputMapping[],
const GLuint immediateMapping[],
GLuint preamble_size,
- GLuint processor )
+ GLuint processor,
+ GLboolean *insideSubroutine)
{
GLuint i;
struct tgsi_full_dst_register *fulldst;
@@ -193,7 +206,7 @@ compile_instruction(
fullinst->Instruction.NumSrcRegs = _mesa_num_inst_src_regs( inst->Opcode );
fulldst = &fullinst->FullDstRegisters[0];
- fulldst->DstRegister.File = map_register_file( inst->DstReg.File );
+ fulldst->DstRegister.File = map_register_file( inst->DstReg.File, 0, NULL );
fulldst->DstRegister.Index = map_register_file_index(
fulldst->DstRegister.File,
inst->DstReg.Index,
@@ -207,7 +220,9 @@ compile_instruction(
GLuint j;
fullsrc = &fullinst->FullSrcRegisters[i];
- fullsrc->SrcRegister.File = map_register_file( inst->SrcReg[i].File );
+ fullsrc->SrcRegister.File = map_register_file( inst->SrcReg[i].File,
+ inst->SrcReg[i].Index,
+ immediateMapping );
fullsrc->SrcRegister.Index = map_register_file_index(
fullsrc->SrcRegister.File,
inst->SrcReg[i].Index,
@@ -283,6 +298,7 @@ compile_instruction(
break;
case OPCODE_BGNSUB:
fullinst->Instruction.Opcode = TGSI_OPCODE_BGNSUB;
+ *insideSubroutine = GL_TRUE;
break;
case OPCODE_BRA:
fullinst->Instruction.Opcode = TGSI_OPCODE_BRA;
@@ -334,6 +350,7 @@ compile_instruction(
break;
case OPCODE_ENDSUB:
fullinst->Instruction.Opcode = TGSI_OPCODE_ENDSUB;
+ *insideSubroutine = GL_FALSE;
break;
case OPCODE_EX2:
fullinst->Instruction.Opcode = TGSI_OPCODE_EX2;
@@ -412,7 +429,16 @@ compile_instruction(
fullinst->Instruction.Opcode = TGSI_OPCODE_RCP;
break;
case OPCODE_RET:
- fullinst->Instruction.Opcode = TGSI_OPCODE_RET;
+ /* If RET is used inside main (not a real subroutine) we may want
+ * to execute END instead of RET. TBD...
+ */
+ if (1 /* *insideSubroutine */) {
+ fullinst->Instruction.Opcode = TGSI_OPCODE_RET;
+ }
+ else {
+ /* inside main() pseudo-function */
+ fullinst->Instruction.Opcode = TGSI_OPCODE_END;
+ }
break;
case OPCODE_RSQ:
fullinst->Instruction.Opcode = TGSI_OPCODE_RSQ;
@@ -499,7 +525,7 @@ compile_instruction(
fulldst->DstRegister.WriteMask &= TGSI_WRITEMASK_XYZ;
break;
case OPCODE_END:
- fullinst->Instruction.Opcode = TGSI_OPCODE_RET;
+ fullinst->Instruction.Opcode = TGSI_OPCODE_END;
break;
default:
assert( 0 );
@@ -682,6 +708,7 @@ tgsi_translate_mesa_program(
GLuint preamble_size = 0;
GLuint immediates[1000];
GLuint numImmediates = 0;
+ GLboolean insideSubroutine = GL_FALSE;
assert(procType == TGSI_PROCESSOR_FRAGMENT ||
procType == TGSI_PROCESSOR_VERTEX);
@@ -800,6 +827,8 @@ tgsi_translate_mesa_program(
}
/* immediates/literals */
+ memset(immediates, ~0, sizeof(immediates));
+
for (i = 0; program->Parameters && i < program->Parameters->NumParameters;
i++) {
if (program->Parameters->Parameters[i].Type == PROGRAM_CONSTANT) {
@@ -879,7 +908,8 @@ tgsi_translate_mesa_program(
outputMapping,
immediates,
preamble_size,
- procType );
+ procType,
+ &insideSubroutine);
ti += tgsi_build_full_instruction(
&fullinst,
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 6802bb3b06..1852228b29 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -167,6 +167,7 @@ st_translate_vertex_program(struct st_context *st,
switch (attr) {
case VERT_RESULT_HPOS:
+ assert(slot == 0);
vs.output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
vs.output_semantic_index[slot] = 0;
break;
@@ -218,6 +219,8 @@ st_translate_vertex_program(struct st_context *st,
}
}
+ assert(vs.output_semantic_name[0] == TGSI_SEMANTIC_POSITION);
+
if (outputMapping) {
/* find max output slot referenced to compute vs.num_outputs */
diff --git a/src/mesa/state_tracker/st_public.h b/src/mesa/state_tracker/st_public.h
index 558b20f1e8..ed5ef1f159 100644
--- a/src/mesa/state_tracker/st_public.h
+++ b/src/mesa/state_tracker/st_public.h
@@ -55,10 +55,10 @@ void st_copy_context_state(struct st_context *dst, struct st_context *src,
uint mask);
struct st_framebuffer *st_create_framebuffer( const __GLcontextModes *visual,
- boolean createRenderbuffers,
enum pipe_format colorFormat,
enum pipe_format depthFormat,
enum pipe_format stencilFormat,
+ uint width, uint height,
void *privateData);
void st_resize_framebuffer( struct st_framebuffer *stfb,