diff options
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_blit.c | 18 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_blit.h | 1 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_context.c | 5 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_tex.h | 2 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_texcopy.c | 3 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_texstate.c | 9 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r600/r600_cmdbuf.c | 15 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r600/r600_cmdbuf.h | 16 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r600/r600_context.c | 16 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r600/r700_assembler.c | 123 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r600/r700_assembler.h | 2 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r600/r700_chip.c | 34 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r600/r700_fragprog.c | 98 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r600/r700_fragprog.h | 2 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r600/r700_shaderinst.h | 7 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_common_context.h | 3 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_dma.c | 1 | 
17 files changed, 256 insertions, 99 deletions
diff --git a/src/mesa/drivers/dri/r300/r300_blit.c b/src/mesa/drivers/dri/r300/r300_blit.c index 10e1b3c912..ca6dd3bcf8 100644 --- a/src/mesa/drivers/dri/r300/r300_blit.c +++ b/src/mesa/drivers/dri/r300/r300_blit.c @@ -141,7 +141,7 @@ static void r300_emit_tx_setup(struct r300_context *r300,      assert(width <= 2048);      assert(height <= 2048); -    assert(r300TranslateTexFormat(mesa_format) != 0); +    assert(r300TranslateTexFormat(mesa_format) >= 0);      assert(offset % 32 == 0);      BEGIN_BATCH(17); @@ -315,8 +315,8 @@ static void r300_emit_rs_setup(struct r300_context *r300)      OUT_BATCH_REGVAL(R300_RS_IP_0,                       R300_RS_TEX_PTR(0) |                       R300_RS_SEL_S(R300_RS_SEL_C0) | -                     R300_RS_SEL_R(R300_RS_SEL_C1) | -                     R300_RS_SEL_T(R300_RS_SEL_K0) | +                     R300_RS_SEL_T(R300_RS_SEL_C1) | +                     R300_RS_SEL_R(R300_RS_SEL_K0) |                       R300_RS_SEL_Q(R300_RS_SEL_K1));      END_BATCH();  } @@ -428,6 +428,7 @@ static void emit_cb_setup(struct r300_context *r300,                            struct radeon_bo *bo,                            intptr_t offset,                            gl_format mesa_format, +                          unsigned pitch,                            unsigned width,                            unsigned height)  { @@ -448,7 +449,7 @@ static void emit_cb_setup(struct r300_context *r300,      r300_emit_cb_setup(r300, bo, offset, mesa_format,                         _mesa_get_format_bytes(mesa_format), -                       _mesa_format_row_stride(mesa_format, width)); +                       _mesa_format_row_stride(mesa_format, pitch));      BEGIN_BATCH_NO_AUTOSTATE(5);      OUT_BATCH_REGSEQ(R300_SC_SCISSORS_TL, 2); @@ -468,18 +469,14 @@ GLboolean r300_blit(struct r300_context *r300,                      struct radeon_bo *dst_bo,                      intptr_t dst_offset,                      gl_format dst_mesaformat, +                    unsigned dst_pitch,                      unsigned dst_width,                      unsigned dst_height)  { -    //assert(src_width == dst_width); -    //assert(src_height == dst_height); -      if (src_bo == dst_bo) {          return GL_FALSE;      } -    //return GL_FALSE; -      if (0) {          fprintf(stderr, "src: width %d, height %d, pitch %d vs %d, format %s\n",                  src_width, src_height, src_pitch, @@ -511,14 +508,13 @@ GLboolean r300_blit(struct r300_context *r300,      emit_pvs_setup(r300, r300->blit.vp_code.body.d, 2);      emit_vap_setup(r300, dst_width, dst_height); -    emit_cb_setup(r300, dst_bo, dst_offset, dst_mesaformat, dst_width, dst_height); +    emit_cb_setup(r300, dst_bo, dst_offset, dst_mesaformat, dst_pitch, dst_width, dst_height);      emit_draw_packet(r300, dst_width, dst_height);      r300EmitCacheFlush(r300);      radeonFlush(r300->radeon.glCtx); -    //r300ResetHwState(r300);      return GL_TRUE;  }
\ No newline at end of file diff --git a/src/mesa/drivers/dri/r300/r300_blit.h b/src/mesa/drivers/dri/r300/r300_blit.h index 29c5aa9514..28ffd4ea42 100644 --- a/src/mesa/drivers/dri/r300/r300_blit.h +++ b/src/mesa/drivers/dri/r300/r300_blit.h @@ -40,6 +40,7 @@ GLboolean r300_blit(struct r300_context *r300,                      struct radeon_bo *dst_bo,                      intptr_t dst_offset,                      gl_format dst_mesaformat, +                    unsigned dst_pitch,                      unsigned dst_width,                      unsigned dst_height); diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c index 05005f61c3..3c6ec2a34a 100644 --- a/src/mesa/drivers/dri/r300/r300_context.c +++ b/src/mesa/drivers/dri/r300/r300_context.c @@ -486,7 +486,6 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,  	r300_init_vtbl(&r300->radeon);  	_mesa_init_driver_functions(&functions); -	r300_init_texcopy_functions(&functions);  	r300InitIoctlFuncs(&functions);  	r300InitStateFuncs(&functions);  	r300InitTextureFuncs(&functions); @@ -494,6 +493,10 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,  	radeonInitQueryObjFunctions(&functions);  	radeonInitBufferObjectFuncs(&functions); +	if (r300->radeon.radeonScreen->kernel_mm) { +		r300_init_texcopy_functions(&functions); +	} +  	if (!radeonInitContext(&r300->radeon, &functions,  			       glVisual, driContextPriv,  			       sharedContextPrivate)) { diff --git a/src/mesa/drivers/dri/r300/r300_tex.h b/src/mesa/drivers/dri/r300/r300_tex.h index beb10072e9..6ede0fe25c 100644 --- a/src/mesa/drivers/dri/r300/r300_tex.h +++ b/src/mesa/drivers/dri/r300/r300_tex.h @@ -51,6 +51,6 @@ extern GLboolean r300ValidateBuffers(GLcontext * ctx);  extern void r300InitTextureFuncs(struct dd_function_table *functions); -uint32_t r300TranslateTexFormat(gl_format mesaFormat); +int32_t r300TranslateTexFormat(gl_format mesaFormat);  #endif				/* __r300_TEX_H__ */ diff --git a/src/mesa/drivers/dri/r300/r300_texcopy.c b/src/mesa/drivers/dri/r300/r300_texcopy.c index 5e3a724d4e..7702a1d67d 100644 --- a/src/mesa/drivers/dri/r300/r300_texcopy.c +++ b/src/mesa/drivers/dri/r300/r300_texcopy.c @@ -63,7 +63,6 @@ do_copy_texsubimage(GLcontext *ctx,      assert(timg->mt->bo);      assert(timg->base.Width >= dstx + width);      assert(timg->base.Height >= dsty + height); -    //assert(tobj->mt == timg->mt);      intptr_t src_offset = rrb->draw_offset + x * rrb->cpp + y * rrb->pitch;      intptr_t dst_offset = radeon_miptree_image_offset(timg->mt, _mesa_tex_target_to_face(target), level); @@ -87,7 +86,7 @@ do_copy_texsubimage(GLcontext *ctx,      /* blit from src buffer to texture */      return r300_blit(r300, rrb->bo, src_offset, rrb->base.Format, rrb->pitch,                       rrb->base.Width, rrb->base.Height, timg->mt->bo ? timg->mt->bo : timg->bo, dst_offset, -                     timg->base.TexFormat, width, height); +                     timg->base.TexFormat, timg->base.Width, width, height);  }  static void diff --git a/src/mesa/drivers/dri/r300/r300_texstate.c b/src/mesa/drivers/dri/r300/r300_texstate.c index 6db56ba618..d4a728381e 100644 --- a/src/mesa/drivers/dri/r300/r300_texstate.c +++ b/src/mesa/drivers/dri/r300/r300_texstate.c @@ -59,7 +59,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.   * identically.  -- paulus   */ -uint32_t r300TranslateTexFormat(gl_format mesaFormat) +int32_t r300TranslateTexFormat(gl_format mesaFormat)  {  	switch (mesaFormat)  	{ @@ -168,7 +168,7 @@ uint32_t r300TranslateTexFormat(gl_format mesaFormat)  		case MESA_FORMAT_SRGBA_DXT5:  			return R300_EASY_TX_FORMAT(Y, Z, W, X, DXT5) | R300_TX_FORMAT_GAMMA;  		default: -			return 0; +			return -1;  	}  }; @@ -252,12 +252,13 @@ static void setup_hardware_state(r300ContextPtr rmesa, radeonTexObj *t)  		if (firstImage->_BaseFormat == GL_DEPTH_COMPONENT) {  			r300SetDepthTexMode(&t->base);  		} else { -			t->pp_txformat = r300TranslateTexFormat(firstImage->TexFormat); -			if (t->pp_txformat == 0) { +			int32_t txformat = r300TranslateTexFormat(firstImage->TexFormat); +			if (txformat < 0) {  				_mesa_problem(rmesa->radeon.glCtx, "%s: Invalid format %s",  							  __FUNCTION__, _mesa_get_format_name(firstImage->TexFormat));  				_mesa_exit(1);  			} +			t->pp_txformat = (uint32_t) txformat;  		}  	} diff --git a/src/mesa/drivers/dri/r600/r600_cmdbuf.c b/src/mesa/drivers/dri/r600/r600_cmdbuf.c index d27a3245a3..5e1504872d 100644 --- a/src/mesa/drivers/dri/r600/r600_cmdbuf.c +++ b/src/mesa/drivers/dri/r600/r600_cmdbuf.c @@ -52,6 +52,21 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "radeon_mipmap_tree.h"  #include "radeon_reg.h" +struct r600_cs_manager_legacy +{ +    struct radeon_cs_manager    base; +    struct radeon_context       *ctx; +    /* hack for scratch stuff */ +    uint32_t                    pending_age; +    uint32_t                    pending_count; +}; + +struct r600_cs_reloc_legacy { +    struct radeon_cs_reloc  base; +    uint32_t                cindices; +    uint32_t                *indices; +    uint32_t                *reloc_indices; +};  static struct radeon_cs * r600_cs_create(struct radeon_cs_manager *csm, diff --git a/src/mesa/drivers/dri/r600/r600_cmdbuf.h b/src/mesa/drivers/dri/r600/r600_cmdbuf.h index eba43d37b6..dff0009699 100644 --- a/src/mesa/drivers/dri/r600/r600_cmdbuf.h +++ b/src/mesa/drivers/dri/r600/r600_cmdbuf.h @@ -118,22 +118,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #define R600_IT_SET_CTL_CONST                     0x00006F00  #define R600_IT_SURFACE_BASE_UPDATE               0x00007300 -struct r600_cs_manager_legacy -{ -    struct radeon_cs_manager    base; -    struct radeon_context       *ctx; -    /* hack for scratch stuff */ -    uint32_t                    pending_age; -    uint32_t                    pending_count; -}; - -struct r600_cs_reloc_legacy { -    struct radeon_cs_reloc  base; -    uint32_t                cindices; -    uint32_t                *indices; -    uint32_t                *reloc_indices; -}; -  struct radeon_cs_manager * r600_radeon_cs_manager_legacy_ctor(struct radeon_context *ctx);  /** diff --git a/src/mesa/drivers/dri/r600/r600_context.c b/src/mesa/drivers/dri/r600/r600_context.c index 25314eff56..b66fe78ac3 100644 --- a/src/mesa/drivers/dri/r600/r600_context.c +++ b/src/mesa/drivers/dri/r600/r600_context.c @@ -317,20 +317,8 @@ static void r600InitGLExtensions(GLcontext *ctx)  #ifdef R600_ENABLE_GLSL_TEST      driInitExtensions(ctx, gl_20_extension, GL_TRUE); -    //_mesa_enable_2_0_extensions(ctx); -    //1.5 -    ctx->Extensions.ARB_occlusion_query = GL_TRUE; -    ctx->Extensions.ARB_vertex_buffer_object = GL_TRUE; -    ctx->Extensions.EXT_shadow_funcs = GL_TRUE; -    //2.0 -    ctx->Extensions.ARB_draw_buffers = GL_TRUE; -    ctx->Extensions.ARB_point_sprite = GL_TRUE; -    ctx->Extensions.ARB_shader_objects = GL_TRUE; -    ctx->Extensions.ARB_vertex_shader = GL_TRUE; -    ctx->Extensions.ARB_fragment_shader = GL_TRUE; -    ctx->Extensions.EXT_blend_equation_separate = GL_TRUE; -    ctx->Extensions.ATI_separate_stencil = GL_TRUE; - +    _mesa_enable_2_0_extensions(ctx); +          /* glsl compiler has problem if this is not GL_TRUE */      ctx->Shader.EmitCondCodes = GL_TRUE;  #endif /* R600_ENABLE_GLSL_TEST */ diff --git a/src/mesa/drivers/dri/r600/r700_assembler.c b/src/mesa/drivers/dri/r600/r700_assembler.c index e84f524525..e10b23b97f 100644 --- a/src/mesa/drivers/dri/r600/r700_assembler.c +++ b/src/mesa/drivers/dri/r600/r700_assembler.c @@ -539,12 +539,15 @@ int Init_r700_AssemblerBase(SHADER_PIPE_TYPE spt, r700_AssemblerBase* pAsm, R700      pAsm->unNumPresub       = 0;      pAsm->unCurNumILInsts   = 0; +    pAsm->unVetTexBits      = 0; +      return 0;  }  GLboolean IsTex(gl_inst_opcode Opcode)  { -    if( (OPCODE_TEX==Opcode) || (OPCODE_TXP==Opcode) || (OPCODE_TXB==Opcode) ) +    if( (OPCODE_TEX==Opcode) || (OPCODE_TXP==Opcode) || (OPCODE_TXB==Opcode) || +        (OPCODE_DDX==Opcode) || (OPCODE_DDY==Opcode) )      {          return GL_TRUE;      } @@ -1412,43 +1415,65 @@ GLboolean tex_src(r700_AssemblerBase *pAsm)              pAsm->S[0].src.rtype = SRC_REG_TEMPORARY;              break;          case PROGRAM_INPUT: -            switch (pILInst->SrcReg[0].Index) +            if(SPT_VP == pAsm->currentShaderType) +            { +                switch (pILInst->SrcReg[0].Index) +                { +                    case VERT_ATTRIB_TEX0: +                    case VERT_ATTRIB_TEX1: +                    case VERT_ATTRIB_TEX2: +                    case VERT_ATTRIB_TEX3: +                    case VERT_ATTRIB_TEX4: +                    case VERT_ATTRIB_TEX5: +                    case VERT_ATTRIB_TEX6: +                    case VERT_ATTRIB_TEX7: +                        bValidTexCoord = GL_TRUE; +                        pAsm->S[0].src.reg   = +                            pAsm->ucVP_AttributeMap[pILInst->SrcReg[0].Index]; +                        pAsm->S[0].src.rtype = SRC_REG_INPUT; +                        break; +                } +            } +            else              { -                case FRAG_ATTRIB_WPOS: -                case FRAG_ATTRIB_COL0: -                case FRAG_ATTRIB_COL1: -                case FRAG_ATTRIB_FOGC: -                case FRAG_ATTRIB_TEX0: -                case FRAG_ATTRIB_TEX1: -                case FRAG_ATTRIB_TEX2: -                case FRAG_ATTRIB_TEX3: -                case FRAG_ATTRIB_TEX4: -                case FRAG_ATTRIB_TEX5: -                case FRAG_ATTRIB_TEX6: -                case FRAG_ATTRIB_TEX7: -                    bValidTexCoord = GL_TRUE; +                switch (pILInst->SrcReg[0].Index) +                { +                    case FRAG_ATTRIB_WPOS: +                    case FRAG_ATTRIB_COL0: +                    case FRAG_ATTRIB_COL1: +                    case FRAG_ATTRIB_FOGC: +                    case FRAG_ATTRIB_TEX0: +                    case FRAG_ATTRIB_TEX1: +                    case FRAG_ATTRIB_TEX2: +                    case FRAG_ATTRIB_TEX3: +                    case FRAG_ATTRIB_TEX4: +                    case FRAG_ATTRIB_TEX5: +                    case FRAG_ATTRIB_TEX6: +                    case FRAG_ATTRIB_TEX7: +                        bValidTexCoord = GL_TRUE; +                        pAsm->S[0].src.reg   = +                            pAsm->uiFP_AttributeMap[pILInst->SrcReg[0].Index]; +                        pAsm->S[0].src.rtype = SRC_REG_INPUT; +                        break; +                    case FRAG_ATTRIB_FACE: +                        fprintf(stderr, "FRAG_ATTRIB_FACE unsupported\n"); +                        break; +                    case FRAG_ATTRIB_PNTC: +                        fprintf(stderr, "FRAG_ATTRIB_PNTC unsupported\n"); +                        break; +                } + +                if( (pILInst->SrcReg[0].Index >= FRAG_ATTRIB_VAR0) || +                    (pILInst->SrcReg[0].Index < FRAG_ATTRIB_MAX) ) +                { +				    bValidTexCoord = GL_TRUE;                      pAsm->S[0].src.reg   =                          pAsm->uiFP_AttributeMap[pILInst->SrcReg[0].Index];                      pAsm->S[0].src.rtype = SRC_REG_INPUT; -                    break; -                case FRAG_ATTRIB_FACE: -                    fprintf(stderr, "FRAG_ATTRIB_FACE unsupported\n"); -                    break; -                case FRAG_ATTRIB_PNTC: -                    fprintf(stderr, "FRAG_ATTRIB_PNTC unsupported\n"); -                    break; -            } - -            if( (pILInst->SrcReg[0].Index >= FRAG_ATTRIB_VAR0) || -                (pILInst->SrcReg[0].Index < FRAG_ATTRIB_MAX) ) -            { -				bValidTexCoord = GL_TRUE; -                pAsm->S[0].src.reg   = -                    pAsm->uiFP_AttributeMap[pILInst->SrcReg[0].Index]; -                pAsm->S[0].src.rtype = SRC_REG_INPUT; +                }              } -        break; +            break;          }      } @@ -1493,8 +1518,17 @@ GLboolean assemble_tex_instruction(r700_AssemblerBase *pAsm, GLboolean normalize      tex_instruction_ptr->m_Word0.f.tex_inst         = pAsm->D.dst.opcode;      tex_instruction_ptr->m_Word0.f.bc_frac_mode     = 0x0;      tex_instruction_ptr->m_Word0.f.fetch_whole_quad = 0x0; +    tex_instruction_ptr->m_Word0.f.alt_const        = 0; -    tex_instruction_ptr->m_Word0.f.resource_id      = texture_unit_source->reg; +    if(SPT_VP == pAsm->currentShaderType) +    { +        tex_instruction_ptr->m_Word0.f.resource_id      = texture_unit_source->reg + VERT_ATTRIB_MAX; +        pAsm->unVetTexBits |= 1 << texture_unit_source->reg; +    } +    else +    { +        tex_instruction_ptr->m_Word0.f.resource_id      = texture_unit_source->reg; +    }      tex_instruction_ptr->m_Word1.f.lod_bias     = 0x0;      if (normalized) { @@ -1513,7 +1547,6 @@ GLboolean assemble_tex_instruction(r700_AssemblerBase *pAsm, GLboolean normalize      tex_instruction_ptr->m_Word2.f.offset_x   = 0x0;      tex_instruction_ptr->m_Word2.f.offset_y   = 0x0;      tex_instruction_ptr->m_Word2.f.offset_z   = 0x0; -      tex_instruction_ptr->m_Word2.f.sampler_id = texture_unit_source->reg;      // dst @@ -4331,13 +4364,20 @@ GLboolean assemble_TEX(r700_AssemblerBase *pAsm)      } -    if(pAsm->pILInst[pAsm->uiCurInst].Opcode == OPCODE_TXB) +    switch(pAsm->pILInst[pAsm->uiCurInst].Opcode)      { -        pAsm->D.dst.opcode = SQ_TEX_INST_SAMPLE_L; -    } -    else -    { -        pAsm->D.dst.opcode = SQ_TEX_INST_SAMPLE; +        case OPCODE_DDX: +            /* will these need WQM(1) on CF inst ? */ +            pAsm->D.dst.opcode = SQ_TEX_INST_GET_GRADIENTS_H; +            break; +        case OPCODE_DDY: +            pAsm->D.dst.opcode = SQ_TEX_INST_GET_GRADIENTS_V; +            break; +        case OPCODE_TXB: +            pAsm->D.dst.opcode = SQ_TEX_INST_SAMPLE_L; +            break; +        default: +            pAsm->D.dst.opcode = SQ_TEX_INST_SAMPLE;      }      pAsm->is_tex = GL_TRUE; @@ -5650,7 +5690,8 @@ GLboolean AssembleInstr(GLuint uiFirstInst,                  }              }              break; - +        case OPCODE_DDX: +        case OPCODE_DDY:          case OPCODE_TEX:           case OPCODE_TXB:            case OPCODE_TXP:  diff --git a/src/mesa/drivers/dri/r600/r700_assembler.h b/src/mesa/drivers/dri/r600/r700_assembler.h index 6ef945dfda..dbd9860f7d 100644 --- a/src/mesa/drivers/dri/r600/r700_assembler.h +++ b/src/mesa/drivers/dri/r600/r700_assembler.h @@ -485,6 +485,8 @@ typedef struct r700_AssemblerBase      GLuint        unNumPresub;      GLuint        unCurNumILInsts; +    GLuint    unVetTexBits; +  } r700_AssemblerBase;  //Internal use diff --git a/src/mesa/drivers/dri/r600/r700_chip.c b/src/mesa/drivers/dri/r600/r700_chip.c index ee2a0a4c8a..c124e02184 100644 --- a/src/mesa/drivers/dri/r600/r700_chip.c +++ b/src/mesa/drivers/dri/r600/r700_chip.c @@ -45,6 +45,9 @@ static void r700SendTexState(GLcontext *ctx, struct radeon_state_atom *atom)  {  	context_t         *context = R700_CONTEXT(ctx);  	R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw); + +    struct r700_vertex_program *vp = context->selected_vp; +  	struct radeon_bo *bo = NULL;  	unsigned int i;  	BATCH_LOCALS(&context->radeon); @@ -52,7 +55,7 @@ static void r700SendTexState(GLcontext *ctx, struct radeon_state_atom *atom)  	radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);  	for (i = 0; i < R700_TEXTURE_NUMBERUNITS; i++) { -		if (ctx->Texture.Unit[i]._ReallyEnabled) { +		if (ctx->Texture.Unit[i]._ReallyEnabled) {              			radeonTexObj *t = r700->textures[i];  			uint32_t offset;  			if (t) { @@ -71,7 +74,16 @@ static void r700SendTexState(GLcontext *ctx, struct radeon_state_atom *atom)  					BEGIN_BATCH_NO_AUTOSTATE(9 + 4);  					R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE, 7)); -					R600_OUT_BATCH(i * 7); + +                    if( (1<<i) & vp->r700AsmCode.unVetTexBits )                     +                    {   /* vs texture */                                      +                        R600_OUT_BATCH((i + VERT_ATTRIB_MAX + SQ_FETCH_RESOURCE_VS_OFFSET) * FETCH_RESOURCE_STRIDE); +                    } +                    else +                    { +					    R600_OUT_BATCH(i * 7); +                    } +  					R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE0);  					R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE1);  					R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE2); @@ -95,21 +107,35 @@ static void r700SendTexState(GLcontext *ctx, struct radeon_state_atom *atom)  	}  } +#define SAMPLER_STRIDE                 3 +  static void r700SendTexSamplerState(GLcontext *ctx, struct radeon_state_atom *atom)  {  	context_t         *context = R700_CONTEXT(ctx);  	R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);  	unsigned int i; + +    struct r700_vertex_program *vp = context->selected_vp; +  	BATCH_LOCALS(&context->radeon);  	radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);  	for (i = 0; i < R700_TEXTURE_NUMBERUNITS; i++) { -		if (ctx->Texture.Unit[i]._ReallyEnabled) { +		if (ctx->Texture.Unit[i]._ReallyEnabled) {              			radeonTexObj *t = r700->textures[i];  			if (t) {  				BEGIN_BATCH_NO_AUTOSTATE(5);  				R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_SAMPLER, 3)); -				R600_OUT_BATCH(i * 3); + +                if( (1<<i) & vp->r700AsmCode.unVetTexBits )                     +                {   /* vs texture */ +                    R600_OUT_BATCH((i+SQ_TEX_SAMPLER_VS_OFFSET) * SAMPLER_STRIDE); //work 1 +                } +                else +                { +				    R600_OUT_BATCH(i * 3); +                } +  				R600_OUT_BATCH(r700->textures[i]->SQ_TEX_SAMPLER0);  				R600_OUT_BATCH(r700->textures[i]->SQ_TEX_SAMPLER1);  				R600_OUT_BATCH(r700->textures[i]->SQ_TEX_SAMPLER2); diff --git a/src/mesa/drivers/dri/r600/r700_fragprog.c b/src/mesa/drivers/dri/r600/r700_fragprog.c index d15f013710..ca0710b681 100644 --- a/src/mesa/drivers/dri/r600/r700_fragprog.c +++ b/src/mesa/drivers/dri/r600/r700_fragprog.c @@ -34,6 +34,7 @@  #include "main/imports.h"  #include "shader/prog_parameter.h"  #include "shader/prog_statevars.h" +#include "shader/program.h"  #include "r600_context.h"  #include "r600_cmdbuf.h" @@ -42,6 +43,54 @@  #include "r700_debug.h" +void insert_wpos_code(GLcontext *ctx, struct gl_fragment_program *fprog) +{ +    static const gl_state_index winstate[STATE_LENGTH] +         = { STATE_INTERNAL, STATE_FB_SIZE, 0, 0, 0}; +    struct prog_instruction *newInst, *inst; +    GLint  win_size;  /* state reference */ +    GLuint wpos_temp; /* temp register */ +    int i, j; + +    /* PARAM win_size = STATE_FB_SIZE */ +    win_size = _mesa_add_state_reference(fprog->Base.Parameters, winstate); + +    wpos_temp = fprog->Base.NumTemporaries++; + +    /* scan program where WPOS is used and replace with wpos_temp */ +    inst = fprog->Base.Instructions; +    for (i = 0; i < fprog->Base.NumInstructions; i++) { +        for (j=0; j < 3; j++) { +            if(inst->SrcReg[j].File == PROGRAM_INPUT &&  +               inst->SrcReg[j].Index == FRAG_ATTRIB_WPOS) { +                inst->SrcReg[j].File = PROGRAM_TEMPORARY; +                inst->SrcReg[j].Index = wpos_temp; +            } +        } +        inst++; +    } + +    _mesa_insert_instructions(&(fprog->Base), 0, 1); + +    newInst = fprog->Base.Instructions; +    /* invert wpos.y +     * wpos_temp.xyzw = wpos.x-yzw + winsize.0y00 */ +    newInst[0].Opcode = OPCODE_ADD; +    newInst[0].DstReg.File = PROGRAM_TEMPORARY; +    newInst[0].DstReg.Index = wpos_temp; +    newInst[0].DstReg.WriteMask = WRITEMASK_XYZW; + +    newInst[0].SrcReg[0].File = PROGRAM_INPUT; +    newInst[0].SrcReg[0].Index = FRAG_ATTRIB_WPOS; +    newInst[0].SrcReg[0].Swizzle = SWIZZLE_XYZW; +    newInst[0].SrcReg[0].Negate = NEGATE_Y; + +    newInst[0].SrcReg[1].File = PROGRAM_STATE_VAR; +    newInst[0].SrcReg[1].Index = win_size; +    newInst[0].SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_ZERO, SWIZZLE_Y, SWIZZLE_ZERO, SWIZZLE_ZERO); + +} +  //TODO : Validate FP input with VP output.  void Map_Fragment_Program(r700_AssemblerBase         *pAsm,  						  struct gl_fragment_program *mesa_fp, @@ -155,6 +204,12 @@ void Map_Fragment_Program(r700_AssemblerBase         *pAsm,          pAsm->uiFP_AttributeMap[FRAG_ATTRIB_FACE] = pAsm->number_used_registers++;      } +    unBit = 1 << FRAG_ATTRIB_PNTC; +    if(mesa_fp->Base.InputsRead & unBit) +    { +        pAsm->uiFP_AttributeMap[FRAG_ATTRIB_PNTC] = pAsm->number_used_registers++; +    } +  /* Map temporary registers (GPRs) */      pAsm->starting_temp_register_number = pAsm->number_used_registers; @@ -312,7 +367,13 @@ GLboolean r700TranslateFragmentShader(struct r700_fragment_program *fp,      //Init_Program  	Init_r700_AssemblerBase( SPT_FP, &(fp->r700AsmCode), &(fp->r700Shader) ); -	Map_Fragment_Program(&(fp->r700AsmCode), mesa_fp, ctx);  + +    if(mesa_fp->Base.InputsRead & FRAG_BIT_WPOS) +    { +        insert_wpos_code(ctx, mesa_fp); +    } + +    Map_Fragment_Program(&(fp->r700AsmCode), mesa_fp, ctx);       if( GL_FALSE == Find_Instruction_Dependencies_fp(fp, mesa_fp) )  	{ @@ -479,6 +540,21 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)      } +    if (mesa_fp->Base.InputsRead & (1 << FRAG_ATTRIB_PNTC)) +    { +        ui++; +        SETfield(r700->SPI_PS_IN_CONTROL_0.u32All, ui, NUM_INTERP_shift, NUM_INTERP_mask); +        SETbit(r700->SPI_INTERP_CONTROL_0.u32All, PNT_SPRITE_ENA_bit); +        SETfield(r700->SPI_INTERP_CONTROL_0.u32All, SPI_PNT_SPRITE_SEL_S, PNT_SPRITE_OVRD_X_shift, PNT_SPRITE_OVRD_X_mask); +        SETfield(r700->SPI_INTERP_CONTROL_0.u32All, SPI_PNT_SPRITE_SEL_T, PNT_SPRITE_OVRD_Y_shift, PNT_SPRITE_OVRD_Y_mask); +        //SETbit(r700->SPI_INTERP_CONTROL_0.u32All, PNT_SPRITE_TOP_1_bit); +    } +    else +    { +        CLEARbit(r700->SPI_INTERP_CONTROL_0.u32All, PNT_SPRITE_ENA_bit); +    } + +      ui = (unNumOfReg < ui) ? ui : unNumOfReg;      SETfield(r700->ps.SQ_PGM_RESOURCES_PS.u32All, ui, NUM_GPRS_shift, NUM_GPRS_mask); @@ -498,6 +574,10 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)      struct r700_vertex_program_cont *vpc =  		       (struct r700_vertex_program_cont *)ctx->VertexProgram._Current;      GLbitfield OutputsWritten = vpc->mesa_program.Base.OutputsWritten; +     +    for(ui = 0; ui < R700_MAX_SHADER_EXPORTS; ui++) +        r700->SPI_PS_INPUT_CNTL[ui].u32All = 0; +      unBit = 1 << FRAG_ATTRIB_WPOS;      if(mesa_fp->Base.InputsRead & unBit)      { @@ -575,6 +655,22 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)              else                      CLEARbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);      } +    unBit = 1 << FRAG_ATTRIB_PNTC; +    if(mesa_fp->Base.InputsRead & unBit) +    { +            ui = pAsm->uiFP_AttributeMap[FRAG_ATTRIB_PNTC]; +            SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, SEL_CENTROID_bit); +            SETfield(r700->SPI_PS_INPUT_CNTL[ui].u32All, ui, +                     SEMANTIC_shift, SEMANTIC_mask); +            if (r700->SPI_INTERP_CONTROL_0.u32All & FLAT_SHADE_ENA_bit) +                    SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit); +            else +                    CLEARbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit); +            SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, PT_SPRITE_TEX_bit); +    } + + +      for(i=VERT_RESULT_VAR0; i<VERT_RESULT_MAX; i++)  	{ diff --git a/src/mesa/drivers/dri/r600/r700_fragprog.h b/src/mesa/drivers/dri/r600/r700_fragprog.h index e562bfa478..39c59c9201 100644 --- a/src/mesa/drivers/dri/r600/r700_fragprog.h +++ b/src/mesa/drivers/dri/r600/r700_fragprog.h @@ -48,6 +48,8 @@ struct r700_fragment_program  };  /* Internal */ +void insert_wpos_code(GLcontext *ctx, struct gl_fragment_program *fprog); +  void Map_Fragment_Program(r700_AssemblerBase         *pAsm,  			  struct gl_fragment_program *mesa_fp,                            GLcontext *ctx);  diff --git a/src/mesa/drivers/dri/r600/r700_shaderinst.h b/src/mesa/drivers/dri/r600/r700_shaderinst.h index 2829cca0a3..cdb9a570f7 100644 --- a/src/mesa/drivers/dri/r600/r700_shaderinst.h +++ b/src/mesa/drivers/dri/r600/r700_shaderinst.h @@ -42,6 +42,13 @@  #define SQ_FETCH_RESOURCE_VS_OFFSET    0x000000a0  #define SQ_FETCH_RESOURCE_VS_COUNT     0x000000b0 +//richard dec.10 glsl +#define SQ_TEX_SAMPLER_PS_OFFSET       0x00000000 +#define SQ_TEX_SAMPLER_PS_COUNT        0x00000012 +#define SQ_TEX_SAMPLER_VS_OFFSET       0x00000012 +#define SQ_TEX_SAMPLER_VS_COUNT        0x00000012 +//------------------- +  #define SHADERINST_TYPEMASK_CF  0x10  #define SHADERINST_TYPEMASK_ALU 0x20  #define SHADERINST_TYPEMASK_TEX 0x40 diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.h b/src/mesa/drivers/dri/radeon/radeon_common_context.h index 49a9ec5610..0739496e03 100644 --- a/src/mesa/drivers/dri/radeon/radeon_common_context.h +++ b/src/mesa/drivers/dri/radeon/radeon_common_context.h @@ -406,9 +406,6 @@ struct radeon_state {  	struct radeon_depthbuffer_state depth;  	struct radeon_scissor_state scissor;  	struct radeon_stencilbuffer_state stencil; - -	struct radeon_cs_space_check bos[RADEON_MAX_BOS]; -	int validated_bo_count;  };  /** diff --git a/src/mesa/drivers/dri/radeon/radeon_dma.c b/src/mesa/drivers/dri/radeon/radeon_dma.c index b8c65f4ce6..d31e4e47dd 100644 --- a/src/mesa/drivers/dri/radeon/radeon_dma.c +++ b/src/mesa/drivers/dri/radeon/radeon_dma.c @@ -205,7 +205,6 @@ again_alloc:  		   counter on unused buffers for later freeing them from  		   begin of list */  		dma_bo = last_elem(&rmesa->dma.free); -		assert(dma_bo->bo->cref == 1);  		remove_from_list(dma_bo);  		insert_at_head(&rmesa->dma.reserved, dma_bo);  	}  | 
