1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2007-2010 The Nouveau Project. 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a copy of this software and associated documentation files (the 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sublicense, and/or sell copies of the Software, and to 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_driver.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv_object.xml.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv_m2mf.xml.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv01_2d.xml.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv04_3d.xml.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_context.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_util.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv04_driver.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgswzsurf_format(gl_format format) 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_A8: 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_L8: 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_I8: 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGB332: 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV04_SWIZZLED_SURFACE_FORMAT_COLOR_Y8; 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGB565: 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGB565_REV: 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB4444: 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB4444_REV: 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB1555: 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGBA5551: 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB1555_REV: 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_AL88: 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_AL88_REV: 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_YCBCR: 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_YCBCR_REV: 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_Z16: 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV04_SWIZZLED_SURFACE_FORMAT_COLOR_R5G6B5; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGBA8888: 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGBA8888_REV: 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_XRGB8888: 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB8888: 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB8888_REV: 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_S8_Z24: 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_Z24_S8: 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_Z32: 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV04_SWIZZLED_SURFACE_FORMAT_COLOR_A8R8G8B8; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsurf2d_format(gl_format format) 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_A8: 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_L8: 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_I8: 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGB332: 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV04_CONTEXT_SURFACES_2D_FORMAT_Y8; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGB565: 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGB565_REV: 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB4444: 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB4444_REV: 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB1555: 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGBA5551: 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB1555_REV: 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_AL88: 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_AL88_REV: 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_YCBCR: 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_YCBCR_REV: 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_Z16: 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV04_CONTEXT_SURFACES_2D_FORMAT_R5G6B5; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGBA8888: 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGBA8888_REV: 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_XRGB8888: 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB8888: 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB8888_REV: 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_S8_Z24: 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_Z24_S8: 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_Z32: 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV04_CONTEXT_SURFACES_2D_FORMAT_Y32; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgrect_format(gl_format format) 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_A8: 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_L8: 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_I8: 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGB332: 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV04_GDI_RECTANGLE_TEXT_COLOR_FORMAT_A8R8G8B8; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGB565: 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGB565_REV: 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB4444: 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB4444_REV: 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB1555: 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGBA5551: 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB1555_REV: 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_AL88: 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_AL88_REV: 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_YCBCR: 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_YCBCR_REV: 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_Z16: 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV04_GDI_RECTANGLE_TEXT_COLOR_FORMAT_A16R5G6B5; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGBA8888: 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGBA8888_REV: 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_XRGB8888: 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB8888: 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB8888_REV: 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_S8_Z24: 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_Z24_S8: 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_Z32: 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV04_GDI_RECTANGLE_TEXT_COLOR_FORMAT_A8R8G8B8; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsifm_format(gl_format format) 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_A8: 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_L8: 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_I8: 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGB332: 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV03_SCALED_IMAGE_FROM_MEMORY_COLOR_FORMAT_AY8; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGB565: 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGB565_REV: 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB4444: 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB4444_REV: 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB1555: 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGBA5551: 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB1555_REV: 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_AL88: 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_AL88_REV: 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_YCBCR: 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_YCBCR_REV: 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_Z16: 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV03_SCALED_IMAGE_FROM_MEMORY_COLOR_FORMAT_R5G6B5; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGBA8888: 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGBA8888_REV: 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_XRGB8888: 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB8888: 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB8888_REV: 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_S8_Z24: 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_Z24_S8: 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_Z32: 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV03_SCALED_IMAGE_FROM_MEMORY_COLOR_FORMAT_A8R8G8B8; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv04_surface_copy_swizzle(struct gl_context *ctx, 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_surface *dst, 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_surface *src, 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dx, int dy, int sx, int sy, 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int w, int h) 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf_refn refs[] = { 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { src->bo, NOUVEAU_BO_RD | NOUVEAU_BO_VRAM | NOUVEAU_BO_GART }, 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { dst->bo, NOUVEAU_BO_WR | NOUVEAU_BO_VRAM }, 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = context_push(ctx); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_object *swzsurf = hw->swzsurf; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv04_fifo *fifo = hw->chan->data; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Max width & height may not be the same on all HW, but must be POT */ 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned max_w = 1024; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned max_h = 1024; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sub_w = w > max_w ? max_w : w; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sub_h = h > max_h ? max_h : h; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x, y; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Swizzled surfaces must be POT */ 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(_mesa_is_pow_two(dst->width) && 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_is_pow_two(dst->height)); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (context_chipset(ctx) < 0x10) { 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_SUBC(SURF, OBJECT), 1); 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, swzsurf->handle); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (y = 0; y < h; y += sub_h) { 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sub_h = MIN2(sub_h, h - y); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (x = 0; x < w; x += sub_w) { 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sub_w = MIN2(sub_w, w - x); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nouveau_pushbuf_space(push, 64, 4, 0) || 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_pushbuf_refn (push, refs, 2)) 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV04_SSWZ(DMA_IMAGE), 1); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, fifo->vram); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV04_SSWZ(FORMAT), 2); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, swzsurf_format(dst->format) | 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org log2i(dst->width) << 16 | 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org log2i(dst->height) << 24); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_RELOC(push, dst->bo, dst->offset, NOUVEAU_BO_LOW, 0, 0); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV03_SIFM(DMA_IMAGE), 1); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_RELOC(push, src->bo, 0, NOUVEAU_BO_OR, fifo->vram, fifo->gart); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV05_SIFM(SURFACE), 1); 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, swzsurf->handle); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV03_SIFM(COLOR_FORMAT), 8); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, sifm_format(src->format)); 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV03_SCALED_IMAGE_FROM_MEMORY_OPERATION_SRCCOPY); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (y + dy) << 16 | (x + dx)); 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, sub_h << 16 | sub_w); 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (y + dy) << 16 | (x + dx)); 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, sub_h << 16 | sub_w); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1 << 20); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1 << 20); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV03_SIFM(SIZE), 4); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, align(sub_h, 2) << 16 | align(sub_w, 2)); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, src->pitch | 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV03_SCALED_IMAGE_FROM_MEMORY_FORMAT_ORIGIN_CENTER | 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV03_SCALED_IMAGE_FROM_MEMORY_FORMAT_FILTER_POINT_SAMPLE); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_RELOC(push, src->bo, src->offset + (y + sy) * src->pitch + 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (x + sx) * src->cpp, NOUVEAU_BO_LOW, 0, 0); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (context_chipset(ctx) < 0x10) { 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_SUBC(SURF, OBJECT), 1); 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, hw->surf3d->handle); 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv04_surface_copy_m2mf(struct gl_context *ctx, 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_surface *dst, 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_surface *src, 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dx, int dy, int sx, int sy, 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int w, int h) 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf_refn refs[] = { 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { src->bo, NOUVEAU_BO_RD | NOUVEAU_BO_VRAM | NOUVEAU_BO_GART }, 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { dst->bo, NOUVEAU_BO_WR | NOUVEAU_BO_VRAM | NOUVEAU_BO_GART }, 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = context_push(ctx); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv04_fifo *fifo = hw->chan->data; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dst_offset = dst->offset + dy * dst->pitch + dx * dst->cpp; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned src_offset = src->offset + sy * src->pitch + sx * src->cpp; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (h) { 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int count = (h > 2047) ? 2047 : h; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nouveau_pushbuf_space(push, 16, 4, 0) || 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_pushbuf_refn (push, refs, 2)) 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV03_M2MF(DMA_BUFFER_IN), 2); 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_RELOC(push, src->bo, 0, NOUVEAU_BO_OR, fifo->vram, fifo->gart); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_RELOC(push, dst->bo, 0, NOUVEAU_BO_OR, fifo->vram, fifo->gart); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV03_M2MF(OFFSET_IN), 8); 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_RELOC(push, src->bo, src->offset, NOUVEAU_BO_LOW, 0, 0); 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_RELOC(push, dst->bo, dst->offset, NOUVEAU_BO_LOW, 0, 0); 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, src->pitch); 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, dst->pitch); 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, w * src->cpp); 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, count); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0x0101); 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_offset += src->pitch * count; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_offset += dst->pitch * count; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org h -= count; 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef unsigned (*get_offset_t)(struct nouveau_surface *s, 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x, unsigned y); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_linear_offset(struct nouveau_surface *s, unsigned x, unsigned y) 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x * s->cpp + y * s->pitch; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_swizzled_offset(struct nouveau_surface *s, unsigned x, unsigned y) 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned k = log2i(MIN2(s->width, s->height)); 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned u = (x & 0x001) << 0 | 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (x & 0x002) << 1 | 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (x & 0x004) << 2 | 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (x & 0x008) << 3 | 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (x & 0x010) << 4 | 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (x & 0x020) << 5 | 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (x & 0x040) << 6 | 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (x & 0x080) << 7 | 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (x & 0x100) << 8 | 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (x & 0x200) << 9 | 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (x & 0x400) << 10 | 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (x & 0x800) << 11; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned v = (y & 0x001) << 1 | 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (y & 0x002) << 2 | 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (y & 0x004) << 3 | 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (y & 0x008) << 4 | 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (y & 0x010) << 5 | 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (y & 0x020) << 6 | 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (y & 0x040) << 7 | 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (y & 0x080) << 8 | 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (y & 0x100) << 9 | 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (y & 0x200) << 10 | 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (y & 0x400) << 11 | 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (y & 0x800) << 12; 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return s->cpp * (((u | v) & ~(~0 << 2*k)) | 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (x & (~0 << k)) << k | 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (y & (~0 << k)) << k); 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv04_surface_copy_cpu(struct gl_context *ctx, 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_surface *dst, 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_surface *src, 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dx, int dy, int sx, int sy, 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int w, int h) 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int x, y; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_offset_t get_dst = (dst->layout == SWIZZLED ? 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_swizzled_offset : get_linear_offset); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_offset_t get_src = (src->layout == SWIZZLED ? 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_swizzled_offset : get_linear_offset); 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *dp, *sp; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bo_map(dst->bo, NOUVEAU_BO_WR, context_client(ctx)); 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bo_map(src->bo, NOUVEAU_BO_RD, context_client(ctx)); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dp = dst->bo->map + dst->offset; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp = src->bo->map + src->offset; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (y = 0; y < h; y++) { 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (x = 0; x < w; x++) { 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dp + get_dst(dst, dx + x, dy + y), 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp + get_src(src, sx + x, sy + y), dst->cpp); 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv04_surface_copy(struct gl_context *ctx, 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_surface *dst, 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_surface *src, 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dx, int dy, int sx, int sy, 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int w, int h) 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_format_compressed(src->format)) { 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sx = get_format_blocksx(src->format, sx); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sy = get_format_blocksy(src->format, sy); 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dx = get_format_blocksx(dst->format, dx); 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dy = get_format_blocksy(dst->format, dy); 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org w = get_format_blocksx(src->format, w); 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org h = get_format_blocksy(src->format, h); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Linear texture copy. */ 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((src->layout == LINEAR && dst->layout == LINEAR) || 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->width <= 2 || dst->height <= 1) { 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv04_surface_copy_m2mf(ctx, dst, src, dx, dy, sx, sy, w, h); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Swizzle using sifm+swzsurf. */ 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src->layout == LINEAR && dst->layout == SWIZZLED && 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->cpp != 1 && !(dst->offset & 63)) { 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv04_surface_copy_swizzle(ctx, dst, src, dx, dy, sx, sy, w, h); 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Fallback to CPU copy. */ 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv04_surface_copy_cpu(ctx, dst, src, dx, dy, sx, sy, w, h); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv04_surface_fill(struct gl_context *ctx, 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_surface *dst, 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned mask, unsigned value, 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dx, int dy, int w, int h) 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf_refn refs[] = { 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { dst->bo, NOUVEAU_BO_WR | NOUVEAU_BO_VRAM | NOUVEAU_BO_GART }, 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = context_push(ctx); 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw; 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv04_fifo *fifo = hw->chan->data; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nouveau_pushbuf_space(push, 64, 4, 0) || 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_pushbuf_refn (push, refs, 1)) 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV04_SF2D(DMA_IMAGE_SOURCE), 2); 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_RELOC(push, dst->bo, 0, NOUVEAU_BO_OR, fifo->vram, fifo->gart); 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_RELOC(push, dst->bo, 0, NOUVEAU_BO_OR, fifo->vram, fifo->gart); 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV04_SF2D(FORMAT), 4); 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, surf2d_format(dst->format)); 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (dst->pitch << 16) | dst->pitch); 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_RELOC(push, dst->bo, dst->offset, NOUVEAU_BO_LOW, 0, 0); 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_RELOC(push, dst->bo, dst->offset, NOUVEAU_BO_LOW, 0, 0); 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_PATT(COLOR_FORMAT), 1); 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, rect_format(dst->format)); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_PATT(MONOCHROME_COLOR1), 1); 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, mask | ~0ll << (8 * dst->cpp)); 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV04_GDI(COLOR_FORMAT), 1); 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, rect_format(dst->format)); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV04_GDI(COLOR1_A), 1); 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, value); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV04_GDI(UNCLIPPED_RECTANGLE_POINT(0)), 2); 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (dx << 16) | dy); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, ( w << 16) | h); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv04_surface_takedown(struct gl_context *ctx) 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_object_del(&hw->swzsurf); 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_object_del(&hw->sifm); 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_object_del(&hw->rect); 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_object_del(&hw->rop); 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_object_del(&hw->patt); 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_object_del(&hw->surf2d); 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_object_del(&hw->m2mf); 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_object_del(&hw->ntfy); 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv04_surface_init(struct gl_context *ctx) 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = context_push(ctx); 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_object *chan = hw->chan; 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned handle = 0x88000000, class; 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ret; 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Notifier object. */ 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_object_new(chan, handle++, NOUVEAU_NOTIFIER_CLASS, 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &(struct nv04_notify) { 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .length = 32, 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, sizeof(struct nv04_notify), &hw->ntfy); 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Memory to memory format. */ 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_object_new(chan, handle++, NV03_M2MF_CLASS, 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 0, &hw->m2mf); 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_SUBC(M2MF, OBJECT), 1); 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, hw->m2mf->handle); 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV03_M2MF(DMA_NOTIFY), 1); 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, hw->ntfy->handle); 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Context surfaces 2D. */ 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (context_chipset(ctx) < 0x10) 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class = NV04_SURFACE_2D_CLASS; 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class = NV10_SURFACE_2D_CLASS; 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_object_new(chan, handle++, class, NULL, 0, &hw->surf2d); 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_SUBC(SF2D, OBJECT), 1); 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, hw->surf2d->handle); 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Raster op. */ 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_object_new(chan, handle++, NV03_ROP_CLASS, 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 0, &hw->rop); 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_SUBC(PATT, OBJECT), 1); 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, hw->rop->handle); 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_ROP(DMA_NOTIFY), 1); 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, hw->ntfy->handle); 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_ROP(ROP), 1); 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0xca); /* DPSDxax in the GDI speech. */ 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Image pattern. */ 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_object_new(chan, handle++, NV04_PATTERN_CLASS, 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 0, &hw->patt); 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_SUBC(PATT, OBJECT), 1); 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, hw->patt->handle); 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_PATT(DMA_NOTIFY), 1); 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, hw->ntfy->handle); 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_PATT(MONOCHROME_FORMAT), 3); 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV04_IMAGE_PATTERN_MONOCHROME_FORMAT_LE); 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV04_IMAGE_PATTERN_MONOCHROME_SHAPE_8X8); 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV04_IMAGE_PATTERN_PATTERN_SELECT_MONO); 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_PATT(MONOCHROME_COLOR0), 4); 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, ~0); 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, ~0); 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* GDI rectangle text. */ 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_object_new(chan, handle++, NV04_GDI_CLASS, 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 0, &hw->rect); 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_SUBC(GDI, OBJECT), 1); 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, hw->rect->handle); 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV04_GDI(DMA_NOTIFY), 1); 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, hw->ntfy->handle); 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV04_GDI(SURFACE), 1); 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, hw->surf2d->handle); 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV04_GDI(ROP), 1); 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, hw->rop->handle); 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV04_GDI(PATTERN), 1); 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, hw->patt->handle); 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV04_GDI(OPERATION), 1); 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV04_GDI_RECTANGLE_TEXT_OPERATION_ROP_AND); 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV04_GDI(MONOCHROME_FORMAT), 1); 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV04_GDI_RECTANGLE_TEXT_MONOCHROME_FORMAT_LE); 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Swizzled surface. */ 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (context_chipset(ctx) < 0x20) 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class = NV04_SURFACE_SWZ_CLASS; 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class = NV20_SURFACE_SWZ_CLASS; 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_object_new(chan, handle++, class, NULL, 0, &hw->swzsurf); 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_SUBC(SURF, OBJECT), 1); 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, hw->swzsurf->handle); 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Scaled image from memory. */ 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (context_chipset(ctx) < 0x10) 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class = NV04_SIFM_CLASS; 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class = NV10_SIFM_CLASS; 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_object_new(chan, handle++, class, NULL, 0, &hw->sifm); 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV01_SUBC(SIFM, OBJECT), 1); 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, hw->sifm->handle); 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (context_chipset(ctx) >= 0x10) { 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV05_SIFM(COLOR_CONVERSION), 1); 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV05_SCALED_IMAGE_FROM_MEMORY_COLOR_CONVERSION_TRUNCATE); 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfail: 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv04_surface_takedown(ctx); 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 614