| @@ -339,8 +339,12 @@ void * __driCreateNewScreen_20050727( __DRInativeDisplay *dpy, int scrn, __DRIsc | |||
| } | |||
| // temporary lock step versioning | |||
| if (drm_expected.patch!=drm_version->patch) | |||
| if (drm_expected.patch!=drm_version->patch) { | |||
| __driUtilMessage("%s: wrong DRM version, expected %d, got %d\n", | |||
| __func__, | |||
| drm_expected.patch, drm_version->patch); | |||
| return NULL; | |||
| } | |||
| psp = __driUtilCreateNewScreen(dpy, scrn, psc, NULL, | |||
| ddx_version, dri_version, drm_version, | |||
| @@ -179,7 +179,7 @@ nvsBuildTextShader(GLcontext *ctx, GLenum target, const char *text) | |||
| strlen(text), | |||
| &nvs->mesa.vp); | |||
| } else if (target == GL_FRAGMENT_PROGRAM_ARB) { | |||
| _mesa_init_fragment_program(ctx, &nvs->mesa.fp, GL_VERTEX_PROGRAM_ARB, 0); | |||
| _mesa_init_fragment_program(ctx, &nvs->mesa.fp, GL_FRAGMENT_PROGRAM_ARB, 0); | |||
| _mesa_parse_arb_fragment_program(ctx, | |||
| GL_FRAGMENT_PROGRAM_ARB, | |||
| text, | |||
| @@ -194,6 +194,16 @@ typedef enum { | |||
| NVS_TEX_TARGET_UNKNOWN = 0 | |||
| } nvsTexTarget; | |||
| typedef enum { | |||
| NVS_SCALE_1X = 0, | |||
| NVS_SCALE_2X = 1, | |||
| NVS_SCALE_4X = 2, | |||
| NVS_SCALE_8X = 3, | |||
| NVS_SCALE_INV_2X = 5, | |||
| NVS_SCALE_INV_4X = 6, | |||
| NVS_SCALE_INV_8X = 7, | |||
| } nvsScale; | |||
| /* Arith/TEX instructions */ | |||
| typedef struct nvs_instruction { | |||
| nvsFragmentHeader header; | |||
| @@ -203,6 +213,7 @@ typedef struct nvs_instruction { | |||
| nvsRegister dest; | |||
| unsigned int mask; | |||
| nvsScale dest_scale; | |||
| nvsRegister src[3]; | |||
| @@ -307,6 +318,7 @@ struct _nvsFunc { | |||
| void (*InitInstruction) (nvsFunc *); | |||
| int (*SupportsOpcode) (nvsFunc *, nvsOpcode); | |||
| int (*SupportsResultScale) (nvsFunc *, nvsScale); | |||
| void (*SetOpcode) (nvsFunc *, unsigned int opcode, | |||
| int slot); | |||
| void (*SetCCUpdate) (nvsFunc *); | |||
| @@ -314,6 +326,7 @@ struct _nvsFunc { | |||
| nvsSwzComp *swizzle); | |||
| void (*SetResult) (nvsFunc *, nvsRegister *, | |||
| unsigned int mask, int slot); | |||
| void (*SetResultScale) (nvsFunc *, nvsScale); | |||
| void (*SetSource) (nvsFunc *, nvsRegister *, int pos); | |||
| void (*SetTexImageUnit) (nvsFunc *, int unit); | |||
| void (*SetSaturate) (nvsFunc *); | |||
| @@ -402,6 +402,7 @@ pass0_emit(nouveauShader *nvs, nvsFragmentHeader *parent, int fpos, | |||
| sif->saturate = saturate; | |||
| sif->dest = dst; | |||
| sif->mask = mask; | |||
| sif->dest_scale = NVS_SCALE_1X; | |||
| sif->src[0] = src0; | |||
| sif->src[1] = src1; | |||
| sif->src[2] = src2; | |||
| @@ -667,25 +668,13 @@ pass0_emulate_instruction(nouveauShader *nvs, | |||
| } | |||
| break; | |||
| case OPCODE_RSQ: | |||
| if (rec->const_half.file != NVS_FILE_CONST) { | |||
| GLfloat const_half[4] = { 0.5, 0.0, 0.0, 0.0 }; | |||
| pass0_make_reg(nvs, &rec->const_half, NVS_FILE_CONST, | |||
| _mesa_add_unnamed_constant( | |||
| nvs->mesa.vp.Base.Parameters, | |||
| const_half, 4)); | |||
| COPY_4V(nvs->params[rec->const_half.index].val, | |||
| const_half); | |||
| } | |||
| pass0_make_reg(nvs, &temp, NVS_FILE_TEMP, -1); | |||
| ARITHu(NVS_OP_LG2, temp, SMASK_X, 0, | |||
| nvsAbs(nvsSwizzle(src[0], X, X, X, X)), | |||
| nvr_unused, nvr_unused); | |||
| ARITHu(NVS_OP_MUL, temp, SMASK_X, 0, | |||
| nvsSwizzle(temp, X, X, X, X), | |||
| nvsNegate(rec->const_half), | |||
| nvr_unused); | |||
| nvsinst->dest_scale = NVS_SCALE_INV_2X; | |||
| ARITH (NVS_OP_EX2, dest, mask, sat, | |||
| nvsSwizzle(temp, X, X, X, X), | |||
| nvsNegate(nvsSwizzle(temp, X, X, X, X)), | |||
| nvr_unused, nvr_unused); | |||
| break; | |||
| case OPCODE_SCS: | |||
| @@ -135,6 +135,10 @@ pass2_add_instruction(nvsPtr nvs, nvsInstruction *inst, | |||
| reg = pass2_mangle_reg(nvs, inst, inst->dest); | |||
| shader->SetResult(shader, ®, inst->mask, slot); | |||
| if (inst->dest_scale != NVS_SCALE_1X) { | |||
| shader->SetResultScale(shader, inst->dest_scale); | |||
| } | |||
| } | |||
| static int | |||
| @@ -14,6 +14,10 @@ nouveau_notifier_new(GLcontext *ctx, GLuint handle) | |||
| nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); | |||
| nouveau_notifier *notifier; | |||
| #ifdef NOUVEAU_RING_DEBUG | |||
| return NULL; | |||
| #endif | |||
| notifier = CALLOC_STRUCT(nouveau_notifier_t); | |||
| if (!notifier) | |||
| return NULL; | |||
| @@ -53,6 +57,10 @@ nouveau_notifier_reset(nouveau_notifier *notifier) | |||
| { | |||
| volatile GLuint *n = notifier->mem->map; | |||
| #ifdef NOUVEAU_RING_DEBUG | |||
| return; | |||
| #endif | |||
| n[NV_NOTIFY_TIME_0 /4] = 0x00000000; | |||
| n[NV_NOTIFY_TIME_1 /4] = 0x00000000; | |||
| n[NV_NOTIFY_RETURN_VALUE/4] = 0x00000000; | |||
| @@ -67,6 +75,10 @@ nouveau_notifier_wait_status(nouveau_notifier *notifier, GLuint status, | |||
| volatile GLuint *n = notifier->mem->map; | |||
| unsigned int time = 0; | |||
| #ifdef NOUVEAU_RING_DEBUG | |||
| return GL_TRUE; | |||
| #endif | |||
| while (time <= timeout) { | |||
| if (n[NV_NOTIFY_STATE/4] & NV_NOTIFY_STATE_ERROR_CODE_MASK) { | |||
| MESSAGE("Notifier returned error: 0x%04x\n", | |||
| @@ -114,6 +126,10 @@ GLboolean nouveauSyncInitFuncs(GLcontext *ctx) | |||
| { | |||
| nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); | |||
| #ifdef NOUVEAU_RING_DEBUG | |||
| return GL_TRUE; | |||
| #endif | |||
| nmesa->syncNotifier = nouveau_notifier_new(ctx, NvSyncNotify); | |||
| if (!nmesa->syncNotifier) { | |||
| MESSAGE("Failed to create channel sync notifier\n"); | |||
| @@ -11,6 +11,30 @@ struct _op_xlat NVFP_TX_BOP[64]; | |||
| * - These extend the NV30 routines, which are almost identical. NV40 | |||
| * just has branching hacked into the instruction set. | |||
| */ | |||
| static int | |||
| NV40FPSupportsResultScale(nvsFunc *shader, nvsScale scale) | |||
| { | |||
| switch (scale) { | |||
| case NVS_SCALE_1X: | |||
| case NVS_SCALE_2X: | |||
| case NVS_SCALE_4X: | |||
| case NVS_SCALE_8X: | |||
| case NVS_SCALE_INV_2X: | |||
| case NVS_SCALE_INV_4X: | |||
| case NVS_SCALE_INV_8X: | |||
| return 1; | |||
| default: | |||
| return 0; | |||
| } | |||
| } | |||
| static void | |||
| NV40FPSetResultScale(nvsFunc *shader, nvsScale scale) | |||
| { | |||
| shader->inst[2] &= ~NV40_FP_OP_DST_SCALE_MASK; | |||
| shader->inst[2] |= ((unsigned int)scale << NV40_FP_OP_DST_SCALE_SHIFT); | |||
| } | |||
| static void | |||
| NV40FPSetBranchTarget(nvsFunc *shader, int addr) | |||
| { | |||
| @@ -179,6 +203,9 @@ NV40FPInitShaderFuncs(nvsFunc * shader) | |||
| MOD_OPCODE(NVFP_TX_BOP, NV40_FP_OP_BRA_OPCODE_REP , NVS_OP_REP , -1, -1, -1); | |||
| MOD_OPCODE(NVFP_TX_BOP, NV40_FP_OP_BRA_OPCODE_RET , NVS_OP_RET , -1, -1, -1); | |||
| shader->SupportsResultScale = NV40FPSupportsResultScale; | |||
| shader->SetResultScale = NV40FPSetResultScale; | |||
| /* fragment.facing */ | |||
| shader->GetSourceID = NV40FPGetSourceID; | |||
| @@ -399,8 +399,8 @@ | |||
| /* high order bits of SRC1 */ | |||
| #define NV40_FP_OP_OPCODE_IS_BRANCH (1<<31) | |||
| #define NV40_FP_OP_SRC_SCALE_SHIFT 28 | |||
| #define NV40_FP_OP_SRC_SCALE_MASK (3 << 28) | |||
| #define NV40_FP_OP_DST_SCALE_SHIFT 28 | |||
| #define NV40_FP_OP_DST_SCALE_MASK (3 << 28) | |||
| /* SRC1 LOOP */ | |||
| #define NV40_FP_OP_LOOP_INCR_SHIFT 19 | |||