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