1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright © 2011 Intel Corporation 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN THE SOFTWARE. 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_context.h" 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_state.h" 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_defines.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_batchbuffer.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/fbobject.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen7_upload_sf_clip_viewport(struct brw_context *brw) 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx = &intel->ctx; 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat depth_scale = 1.0F / ctx->DrawBuffer->_DepthMaxF; 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat y_scale, y_bias; 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer); 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *v = ctx->Viewport._WindowMap.m; 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gen7_sf_clip_viewport *vp; 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp = brw_state_batch(brw, AUB_TRACE_SF_VP_STATE, 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(*vp), 64, &brw->sf.vp_offset); 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Also assign to clip.vp_offset in case something uses it. */ 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->clip.vp_offset = brw->sf.vp_offset; 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Disable guardband clipping (see gen6_viewport_state.c for rationale). */ 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp->guardband.xmin = -1.0; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp->guardband.xmax = 1.0; 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp->guardband.ymin = -1.0; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp->guardband.ymax = 1.0; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* _NEW_BUFFERS */ 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (render_to_fbo) { 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y_scale = 1.0; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y_bias = 0; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y_scale = -1.0; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y_bias = ctx->DrawBuffer->Height; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* _NEW_VIEWPORT */ 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp->viewport.m00 = v[MAT_SX]; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp->viewport.m11 = v[MAT_SY] * y_scale; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp->viewport.m22 = v[MAT_SZ] * depth_scale; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp->viewport.m30 = v[MAT_TX]; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp->viewport.m31 = v[MAT_TY] * y_scale + y_bias; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp->viewport.m32 = v[MAT_TZ] * depth_scale; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(2); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CL << 16 | (2 - 2)); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(brw->sf.vp_offset); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct brw_tracked_state gen7_sf_clip_viewport = { 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .dirty = { 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .mesa = _NEW_VIEWPORT | _NEW_BUFFERS, 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .brw = BRW_NEW_BATCH, 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .cache = 0, 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .emit = gen7_upload_sf_clip_viewport, 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ----------------------------------------------------- */ 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void upload_cc_viewport_state_pointer(struct brw_context *brw) 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(2); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_VIEWPORT_STATE_POINTERS_CC << 16 | (2 - 2)); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(brw->cc.vp_offset); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct brw_tracked_state gen7_cc_viewport_state_pointer = { 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .dirty = { 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .mesa = 0, 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .brw = BRW_NEW_BATCH, 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .cache = CACHE_NEW_CC_VP 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .emit = upload_cc_viewport_state_pointer, 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 104