1bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez/* 2bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * Copyright (C) 2009 Francisco Jerez. 3bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * All Rights Reserved. 4bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * 5bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * Permission is hereby granted, free of charge, to any person obtaining 6bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * a copy of this software and associated documentation files (the 7bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * "Software"), to deal in the Software without restriction, including 8bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * without limitation the rights to use, copy, modify, merge, publish, 9bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * distribute, sublicense, and/or sell copies of the Software, and to 10bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * permit persons to whom the Software is furnished to do so, subject to 11bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * the following conditions: 12bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * 13bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * The above copyright notice and this permission notice (including the 14bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * next paragraph) shall be included in all copies or substantial 15bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * portions of the Software. 16bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * 17bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 21bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * 25bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez */ 26bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 27bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_driver.h" 28bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_context.h" 29bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_fbo.h" 30bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_util.h" 318983855012301c8ebc023edf42ddf5e423189585Viktor Novotný#include "nv04_3d.xml.h" 32bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nv04_driver.h" 33bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 34bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic inline unsigned 35bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezget_rt_format(gl_format format) 36bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 37bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez switch (format) { 38bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case MESA_FORMAT_XRGB8888: 39af17d89966bbf171ee5467a2cb090777802a9434Viktor Novotný return NV04_CONTEXT_SURFACES_3D_FORMAT_COLOR_X8R8G8B8_X8R8G8B8; 40bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case MESA_FORMAT_ARGB8888: 41af17d89966bbf171ee5467a2cb090777802a9434Viktor Novotný return NV04_CONTEXT_SURFACES_3D_FORMAT_COLOR_A8R8G8B8; 42bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez case MESA_FORMAT_RGB565: 43af17d89966bbf171ee5467a2cb090777802a9434Viktor Novotný return NV04_CONTEXT_SURFACES_3D_FORMAT_COLOR_R5G6B5; 44bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez default: 45bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez assert(0); 46bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 47bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 48bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 49bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezvoid 50f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv04_emit_framebuffer(struct gl_context *ctx, int emit) 51bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 522e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs struct nouveau_pushbuf *push = context_push(ctx); 53bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct gl_framebuffer *fb = ctx->DrawBuffer; 54bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez struct nouveau_surface *s; 55bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez uint32_t rt_format = NV04_CONTEXT_SURFACES_3D_FORMAT_TYPE_PITCH; 56bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez uint32_t rt_pitch = 0, zeta_pitch = 0; 57bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez unsigned bo_flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_RDWR; 58bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 59bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez if (fb->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) 60bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return; 61bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 622e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_RESET(push, BUFCTX_FB); 632e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 64bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Render target */ 655befb6f810fb88ed1e51ec26b79b647cd15b1433Francisco Jerez if (fb->_ColorDrawBuffers[0]) { 66bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez s = &to_nouveau_renderbuffer( 67bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez fb->_ColorDrawBuffers[0])->surface; 68bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 69bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez rt_format |= get_rt_format(s->format); 70bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez zeta_pitch = rt_pitch = s->pitch; 71bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 722e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs BEGIN_NV04(push, NV04_SF3D(OFFSET_COLOR), 1); 732e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_MTHDl(push, NV04_SF3D(OFFSET_COLOR), BUFCTX_FB, 74bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez s->bo, 0, bo_flags); 75bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 76bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 77bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* depth/stencil */ 78a782db5570a45008f153396070eae153305a7953Brian Paul if (fb->Attachment[BUFFER_DEPTH].Renderbuffer) { 79bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez s = &to_nouveau_renderbuffer( 80a782db5570a45008f153396070eae153305a7953Brian Paul fb->Attachment[BUFFER_DEPTH].Renderbuffer)->surface; 81bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 82bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez zeta_pitch = s->pitch; 83bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 842e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs BEGIN_NV04(push, NV04_SF3D(OFFSET_ZETA), 1); 852e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_MTHDl(push, NV04_SF3D(OFFSET_ZETA), BUFCTX_FB, 86bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez s->bo, 0, bo_flags); 87bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 88bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 892e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs BEGIN_NV04(push, NV04_SF3D(FORMAT), 1); 902e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, rt_format); 912e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs BEGIN_NV04(push, NV04_SF3D(PITCH), 1); 922e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, zeta_pitch << 16 | rt_pitch); 93bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 94bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /* Recompute the scissor state. */ 95bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez context_dirty(ctx, SCISSOR); 96bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 97bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 98bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezvoid 99f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv04_emit_scissor(struct gl_context *ctx, int emit) 100bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{ 1012e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs struct nouveau_pushbuf *push = context_push(ctx); 102bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez int x, y, w, h; 103bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 104bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez get_scissors(ctx->DrawBuffer, &x, &y, &w, &h); 105bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 1062e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs BEGIN_NV04(push, NV04_SF3D(CLIP_HORIZONTAL), 2); 1072e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, w << 16 | x); 1082e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, h << 16 | y); 109bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 110