int etna_set_pipe(struct etna_ctx *ctx, enum etna_pipe pipe) { int status; if(ctx == NULL) return ETNA_INVALID_ADDR; if((status = etna_reserve(ctx, 2)) != ETNA_OK) return status; ETNA_EMIT_LOAD_STATE(ctx, VIVS_GL_FLUSH_CACHE>>2, 1, 0); switch(pipe) { case ETNA_PIPE_2D: ETNA_EMIT(ctx, VIVS_GL_FLUSH_CACHE_PE2D); break; case ETNA_PIPE_3D: ETNA_EMIT(ctx, VIVS_GL_FLUSH_CACHE_DEPTH | VIVS_GL_FLUSH_CACHE_COLOR); break; default: return ETNA_INVALID_VALUE; } etna_stall(ctx, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); if((status = etna_reserve(ctx, 2)) != ETNA_OK) return status; ETNA_EMIT_LOAD_STATE(ctx, VIVS_GL_PIPE_SELECT>>2, 1, 0); ETNA_EMIT(ctx, pipe); #ifdef GCABI_HAS_CONTEXT if(ctx->cur_buf != ETNA_CTX_BUFFER) { GCCTX(ctx)->currentPipe = pipe; } #endif return ETNA_OK; }
int etna_set_pipe(etna_ctx *ctx, etna_pipe pipe) { int status; if(ctx == NULL) return ETNA_INVALID_ADDR; if((status = etna_reserve(ctx, 2)) != ETNA_OK) return status; ETNA_EMIT_LOAD_STATE(ctx, VIVS_GL_FLUSH_CACHE, 1, 0); switch(pipe) { case ETNA_PIPE_2D: ETNA_EMIT(ctx, VIVS_GL_FLUSH_CACHE_PE2D); break; case ETNA_PIPE_3D: ETNA_EMIT(ctx, VIVS_GL_FLUSH_CACHE_DEPTH | VIVS_GL_FLUSH_CACHE_COLOR); break; default: return ETNA_INVALID_VALUE; } etna_stall(ctx, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); if((status = etna_reserve(ctx, 2)) != ETNA_OK) return status; ETNA_EMIT_LOAD_STATE(ctx, VIVS_GL_PIPE_SELECT, 1, 0); ETNA_EMIT(ctx, pipe); ctx->ctx.currentPipe = pipe; return ETNA_OK; }
int etna_stall(struct etna_ctx *ctx, uint32_t from, uint32_t to) { int status; if(ctx == NULL) return ETNA_INVALID_ADDR; if((status = etna_reserve(ctx, 4)) != ETNA_OK) return status; ETNA_EMIT_LOAD_STATE(ctx, VIVS_GL_SEMAPHORE_TOKEN>>2, 1, 0); ETNA_EMIT(ctx, VIVS_GL_SEMAPHORE_TOKEN_FROM(from) | VIVS_GL_SEMAPHORE_TOKEN_TO(to)); if(from == SYNC_RECIPIENT_FE) { /* if the frontend is to be stalled, queue a STALL frontend command */ ETNA_EMIT_STALL(ctx, from, to); } else { /* otherwise, load the STALL token state */ ETNA_EMIT_LOAD_STATE(ctx, VIVS_GL_STALL_TOKEN>>2, 1, 0); ETNA_EMIT(ctx, VIVS_GL_STALL_TOKEN_FROM(from) | VIVS_GL_STALL_TOKEN_TO(to)); } return ETNA_OK; }
int etna_semaphore(struct etna_ctx *ctx, uint32_t from, uint32_t to) { int status; if(ctx == NULL) return ETNA_INVALID_ADDR; if((status = etna_reserve(ctx, 2)) != ETNA_OK) return status; ETNA_EMIT_LOAD_STATE(ctx, VIVS_GL_SEMAPHORE_TOKEN>>2, 1, 0); ETNA_EMIT(ctx, VIVS_GL_SEMAPHORE_TOKEN_FROM(from) | VIVS_GL_SEMAPHORE_TOKEN_TO(to)); return ETNA_OK; }