1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 Christoph Bumiller 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 shall be included in 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all copies or substantial portions of the Software. 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format_s3tc.h" 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h" 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_context.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_screen.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau/nv_object.xml.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <errno.h> 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef NOUVEAU_GETPARAM_GRAPH_UNITS 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define NOUVEAU_GETPARAM_GRAPH_UNITS 13 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* affected by LOCAL_WARPS_LOG_ALLOC / LOCAL_WARPS_NO_CLAMP */ 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LOCAL_WARPS_ALLOC 32 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* affected by STACK_WARPS_LOG_ALLOC / STACK_WARPS_NO_CLAMP */ 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define STACK_WARPS_ALLOC 32 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define THREADS_IN_WARP 32 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ONE_TEMP_SIZE (4/*vector*/ * sizeof(float)) 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_screen_is_format_supported(struct pipe_screen *pscreen, 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format format, 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_texture_target target, 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sample_count, 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned bindings) 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sample_count > 8) 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(0x117 & (1 << sample_count))) /* 0, 1, 2, 4 or 8 */ 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sample_count == 8 && util_format_get_blocksizebits(format) >= 128) 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!util_format_is_supported(format, bindings)) 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z16_UNORM: 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50_screen(pscreen)->tesla->oclass < NVA0_3D_CLASS) 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8A8_UNORM: 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8X8_UNORM: 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* HACK: GL requires equal formats for MS resolve and window is BGRA */ 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bindings & PIPE_BIND_RENDER_TARGET) 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* transfers & shared are always supported */ 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bindings &= ~(PIPE_BIND_TRANSFER_READ | 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_TRANSFER_WRITE | 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_SHARED); 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (nv50_format_table[format].usage & bindings) == bindings; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint16_t class_3d = nouveau_screen(pscreen)->class_3d; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (param) { 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_MAX_COMBINED_SAMPLERS: 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 64; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 14; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 12; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 14; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS: 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 512; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_MIN_TEXEL_OFFSET: 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -8; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_MAX_TEXEL_OFFSET: 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 7; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_TEXTURE_MIRROR_CLAMP: 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_TEXTURE_SWIZZLE: 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_TEXTURE_SHADOW_MAP: 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_NPOT_TEXTURES: 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_ANISOTROPIC_FILTER: 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_SCALED_RESOLVE: 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_SEAMLESS_CUBE_MAP: 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nv50_screen(pscreen)->tesla->oclass >= NVA0_3D_CLASS; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE: 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_TWO_SIDED_STENCIL: 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_DEPTH_CLIP_DISABLE: 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE: 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_POINT_SPRITE: 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_SM3: 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_GLSL_FEATURE_LEVEL: 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 130; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_MAX_RENDER_TARGETS: 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS: 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_FRAGMENT_COLOR_CLAMPED: 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_VERTEX_COLOR_UNCLAMPED: 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_VERTEX_COLOR_CLAMPED: 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_QUERY_TIMESTAMP: 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_TIMER_QUERY: 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_OCCLUSION_QUERY: 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS: 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 4; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS: 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS: 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 64; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME: 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (class_3d >= NVA0_3D_CLASS) ? 1 : 0; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_BLEND_EQUATION_SEPARATE: 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_INDEP_BLEND_ENABLE: 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_INDEP_BLEND_FUNC: 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nv50_screen(pscreen)->tesla->oclass >= NVA3_3D_CLASS; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT: 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER: 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT: 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER: 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_SHADER_STENCIL_EXPORT: 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_PRIMITIVE_RESTART: 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_TGSI_INSTANCEID: 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR: 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_MIXED_COLORBUFFER_FORMATS: 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_CONDITIONAL_RENDER: 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_TEXTURE_BARRIER: 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_START_INSTANCE: 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_TGSI_CAN_COMPACT_VARYINGS: 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS: 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; /* state trackers will know better */ 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_USER_CONSTANT_BUFFERS: 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_USER_INDEX_BUFFERS: 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_USER_VERTEX_BUFFERS: 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT: 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 256; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY: 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY: 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY: 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("unknown PIPE_CAP %d\n", param); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader, 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_shader_cap param) 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (shader) { 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_VERTEX: 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_GEOMETRY: 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_FRAGMENT: 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (param) { 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_MAX_INSTRUCTIONS: 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS: 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS: 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS: 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 16384; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH: 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 4; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_MAX_INPUTS: 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shader == PIPE_SHADER_VERTEX) 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 32; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0x300 / 16; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_MAX_CONSTS: 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 65536 / 16; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_MAX_CONST_BUFFERS: 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV50_MAX_PIPE_CONSTBUFS; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_MAX_ADDRS: 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR: 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR: 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return shader != PIPE_SHADER_FRAGMENT; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR: 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR: 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_MAX_PREDS: 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_MAX_TEMPS: 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nv50_screen(pscreen)->max_tls_space / ONE_TEMP_SIZE; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED: 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_SUBROUTINES: 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; /* please inline, or provide function declarations */ 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_INTEGERS: 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 32; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("unknown PIPE_SHADER_CAP %d\n", param); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic float 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param) 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (param) { 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAPF_MAX_LINE_WIDTH: 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAPF_MAX_LINE_WIDTH_AA: 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 10.0f; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAPF_MAX_POINT_WIDTH: 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAPF_MAX_POINT_WIDTH_AA: 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 64.0f; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY: 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 16.0f; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS: 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 4.0f; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("unknown PIPE_CAP %d\n", param); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0.0f; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_screen_destroy(struct pipe_screen *pscreen) 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_screen *screen = nv50_screen(pscreen); 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (screen->base.fence.current) { 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_fence_wait(screen->base.fence.current); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_fence_ref (NULL, &screen->base.fence.current); 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (screen->base.pushbuf) 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->base.pushbuf->user_priv = NULL; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (screen->blitctx) 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(screen->blitctx); 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bo_ref(NULL, &screen->code); 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bo_ref(NULL, &screen->tls_bo); 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bo_ref(NULL, &screen->stack_bo); 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bo_ref(NULL, &screen->txc); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bo_ref(NULL, &screen->uniforms); 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bo_ref(NULL, &screen->fence.bo); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_heap_destroy(&screen->vp_code_heap); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_heap_destroy(&screen->gp_code_heap); 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_heap_destroy(&screen->fp_code_heap); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (screen->tic.entries) 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(screen->tic.entries); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_object_del(&screen->tesla); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_object_del(&screen->eng2d); 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_object_del(&screen->m2mf); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_object_del(&screen->sync); 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_screen_fini(&screen->base); 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(screen); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_screen_fence_emit(struct pipe_screen *pscreen, u32 *sequence) 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_screen *screen = nv50_screen(pscreen); 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = screen->base.pushbuf; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we need to do it after possible flush in MARK_RING */ 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *sequence = ++screen->base.fence.sequence; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV50_FIFO_PKHDR(NV50_3D(QUERY_ADDRESS_HIGH), 4)); 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, screen->fence.bo->offset); 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->fence.bo->offset); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, *sequence); 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV50_3D_QUERY_GET_MODE_WRITE_UNK0 | 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_3D_QUERY_GET_UNK4 | 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_3D_QUERY_GET_UNIT_CROP | 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_3D_QUERY_GET_TYPE_QUERY | 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_3D_QUERY_GET_QUERY_SELECT_ZERO | 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_3D_QUERY_GET_SHORT); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic u32 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_screen_fence_update(struct pipe_screen *pscreen) 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nv50_screen(pscreen)->fence.map[0]; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_screen_init_hwctx(struct nv50_screen *screen) 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = screen->base.pushbuf; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv04_fifo *fifo; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fifo = (struct nv04_fifo *)screen->base.channel->data; 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, SUBC_M2MF(NV01_SUBCHAN_OBJECT), 1); 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->m2mf->handle); 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, SUBC_M2MF(NV03_M2MF_DMA_NOTIFY), 3); 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->sync->handle); 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, fifo->vram); 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, fifo->vram); 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, SUBC_2D(NV01_SUBCHAN_OBJECT), 1); 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->eng2d->handle); 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_2D(DMA_NOTIFY), 4); 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->sync->handle); 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, fifo->vram); 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, fifo->vram); 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, fifo->vram); 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_2D(OPERATION), 1); 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV50_2D_OPERATION_SRCCOPY); 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_2D(CLIP_ENABLE), 1); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_2D(COLOR_KEY_ENABLE), 1); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, SUBC_2D(0x0888), 1); 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, SUBC_3D(NV01_SUBCHAN_OBJECT), 1); 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->tesla->handle); 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(COND_MODE), 1); 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV50_3D_COND_MODE_ALWAYS); 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(DMA_NOTIFY), 1); 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->sync->handle); 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(DMA_ZETA), 11); 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 11; ++i) 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, fifo->vram); 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(DMA_COLOR(0)), NV50_3D_DMA_COLOR__LEN); 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < NV50_3D_DMA_COLOR__LEN; ++i) 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, fifo->vram); 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(REG_MODE), 1); 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV50_3D_REG_MODE_STRIPED); 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(UNK1400_LANES), 1); 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0xf); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (debug_get_bool_option("NOUVEAU_SHADER_WATCHDOG", TRUE)) { 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(WATCHDOG_TIMER), 1); 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0x18); 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(RT_CONTROL), 1); 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(CSAA_ENABLE), 1); 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(MULTISAMPLE_ENABLE), 1); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(MULTISAMPLE_MODE), 1); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV50_3D_MULTISAMPLE_MODE_MS1); 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(MULTISAMPLE_CTRL), 1); 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(LINE_LAST_PIXEL), 1); 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(BLEND_SEPARATE_ALPHA), 1); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (screen->tesla->oclass >= NVA0_3D_CLASS) { 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, SUBC_3D(NVA0_3D_TEX_MISC), 1); 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NVA0_3D_TEX_MISC_SEAMLESS_CUBE_MAP); 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(SCREEN_Y_CONTROL), 1); 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(WINDOW_OFFSET_X), 2); 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(ZCULL_REGION), 1); 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0x3f); 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(VP_ADDRESS_HIGH), 2); 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, screen->code->offset + (0 << NV50_CODE_BO_SIZE_LOG2)); 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->code->offset + (0 << NV50_CODE_BO_SIZE_LOG2)); 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(FP_ADDRESS_HIGH), 2); 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, screen->code->offset + (1 << NV50_CODE_BO_SIZE_LOG2)); 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->code->offset + (1 << NV50_CODE_BO_SIZE_LOG2)); 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(GP_ADDRESS_HIGH), 2); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, screen->code->offset + (2 << NV50_CODE_BO_SIZE_LOG2)); 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->code->offset + (2 << NV50_CODE_BO_SIZE_LOG2)); 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(LOCAL_ADDRESS_HIGH), 3); 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, screen->tls_bo->offset); 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->tls_bo->offset); 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, util_logbase2(screen->cur_tls_space / 8)); 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(STACK_ADDRESS_HIGH), 3); 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, screen->stack_bo->offset); 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->stack_bo->offset); 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 4); 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(CB_DEF_ADDRESS_HIGH), 3); 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, screen->uniforms->offset + (0 << 16)); 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->uniforms->offset + (0 << 16)); 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (NV50_CB_PVP << 16) | 0x0000); 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(CB_DEF_ADDRESS_HIGH), 3); 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, screen->uniforms->offset + (1 << 16)); 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->uniforms->offset + (1 << 16)); 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (NV50_CB_PGP << 16) | 0x0000); 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(CB_DEF_ADDRESS_HIGH), 3); 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, screen->uniforms->offset + (2 << 16)); 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->uniforms->offset + (2 << 16)); 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (NV50_CB_PFP << 16) | 0x0000); 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(CB_DEF_ADDRESS_HIGH), 3); 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, screen->uniforms->offset + (3 << 16)); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->uniforms->offset + (3 << 16)); 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (NV50_CB_AUX << 16) | 0x0200); 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NI04(push, NV50_3D(SET_PROGRAM_CB), 3); 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (NV50_CB_AUX << 12) | 0xf01); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (NV50_CB_AUX << 12) | 0xf21); 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (NV50_CB_AUX << 12) | 0xf31); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* return { 0.0, 0.0, 0.0, 0.0 } on out-of-bounds vtxbuf access */ 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(CB_ADDR), 1); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, ((1 << 9) << 6) | NV50_CB_AUX); 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NI04(push, NV50_3D(CB_DATA(0)), 4); 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, 0.0f); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, 0.0f); 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, 0.0f); 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, 0.0f); 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(VERTEX_RUNOUT_ADDRESS_HIGH), 2); 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, screen->uniforms->offset + (3 << 16) + (1 << 9)); 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->uniforms->offset + (3 << 16) + (1 << 9)); 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* max TIC (bits 4:8) & TSC bindings, per program type */ 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; ++i) { 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(TEX_LIMITS(i)), 1); 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0x54); 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(TIC_ADDRESS_HIGH), 3); 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, screen->txc->offset); 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->txc->offset); 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV50_TIC_MAX_ENTRIES - 1); 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(TSC_ADDRESS_HIGH), 3); 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, screen->txc->offset + 65536); 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->txc->offset + 65536); 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV50_TSC_MAX_ENTRIES - 1); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(LINKED_TSC), 1); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(CLIP_RECTS_EN), 1); 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(CLIP_RECTS_MODE), 1); 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV50_3D_CLIP_RECTS_MODE_INSIDE_ANY); 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(CLIP_RECT_HORIZ(0)), 8 * 2); 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 8 * 2; ++i) 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, 0); 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(CLIPID_ENABLE), 1); 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(VIEWPORT_TRANSFORM_EN), 1); 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(DEPTH_RANGE_NEAR(0)), 2); 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, 0.0f); 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, 1.0f); 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(VIEW_VOLUME_CLIP_CTRL), 1); 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef NV50_SCISSORS_CLIPPING 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0x0000); 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0x1080); 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(CLEAR_FLAGS), 1); 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV50_3D_CLEAR_FLAGS_CLEAR_RECT_VIEWPORT); 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We use scissors instead of exact view volume clipping, 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * so they're always enabled. 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(SCISSOR_ENABLE(0)), 3); 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 8192 << 16); 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 8192 << 16); 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(RASTERIZE_ENABLE), 1); 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(POINT_RASTER_RULES), 1); 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV50_3D_POINT_RASTER_RULES_OGL); 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(FRAG_COLOR_CLAMP_EN), 1); 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0x11111111); 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(EDGEFLAG), 1); 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_KICK (push); 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int nv50_tls_alloc(struct nv50_screen *screen, unsigned tls_space, 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t *tls_size) 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_device *dev = screen->base.device; 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ret; 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->cur_tls_space = util_next_power_of_two(tls_space / ONE_TEMP_SIZE) * 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ONE_TEMP_SIZE; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nouveau_mesa_debug) 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("allocating space for %u temps\n", 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_next_power_of_two(tls_space / ONE_TEMP_SIZE)); 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *tls_size = screen->cur_tls_space * util_next_power_of_two(screen->TPs) * 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->MPsInTP * LOCAL_WARPS_ALLOC * THREADS_IN_WARP; 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_bo_new(dev, NOUVEAU_BO_VRAM, 1 << 16, 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *tls_size, NULL, &screen->tls_bo); 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) { 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("Failed to allocate local bo: %d\n", ret); 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ret; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint nv50_tls_realloc(struct nv50_screen *screen, unsigned tls_space) 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = screen->base.pushbuf; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ret; 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t tls_size; 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tls_space < screen->cur_tls_space) 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tls_space > screen->max_tls_space) { 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fixable by limiting number of warps (LOCAL_WARPS_LOG_ALLOC / 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LOCAL_WARPS_NO_CLAMP) */ 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("Unsupported number of temporaries (%u > %u). Fixable if someone cares.\n", 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (unsigned)(tls_space / ONE_TEMP_SIZE), 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (unsigned)(screen->max_tls_space / ONE_TEMP_SIZE)); 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -ENOMEM; 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bo_ref(NULL, &screen->tls_bo); 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nv50_tls_alloc(screen, tls_space, &tls_size); 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ret; 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(LOCAL_ADDRESS_HIGH), 3); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, screen->tls_bo->offset); 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, screen->tls_bo->offset); 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, util_logbase2(screen->cur_tls_space / 8)); 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_screen * 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_screen_create(struct nouveau_device *dev) 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_screen *screen; 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_screen *pscreen; 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_object *chan; 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t value; 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t tesla_class; 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned stack_size; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ret; 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen = CALLOC_STRUCT(nv50_screen); 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!screen) 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pscreen = &screen->base.base; 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_screen_init(&screen->base, dev); 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) { 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("nouveau_screen_init failed: %d\n", ret); 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO: Prevent FIFO prefetch before transfer of index buffers and 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * admit them to VRAM. 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->base.vidmem_bindings |= PIPE_BIND_CONSTANT_BUFFER | 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_VERTEX_BUFFER; 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->base.sysmem_bindings |= 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_VERTEX_BUFFER | PIPE_BIND_INDEX_BUFFER; 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->base.pushbuf->user_priv = screen; 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->base.pushbuf->rsvd_kick = 5; 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org chan = screen->base.channel; 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pscreen->destroy = nv50_screen_destroy; 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pscreen->context_create = nv50_create; 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pscreen->is_format_supported = nv50_screen_is_format_supported; 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pscreen->get_param = nv50_screen_get_param; 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pscreen->get_shader_param = nv50_screen_get_shader_param; 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pscreen->get_paramf = nv50_screen_get_paramf; 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_screen_init_resource_functions(pscreen); 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_screen_init_vdec(&screen->base); 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_bo_new(dev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, 0, 4096, 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, &screen->fence.bo); 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) { 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("Failed to allocate fence bo: %d\n", ret); 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bo_map(screen->fence.bo, 0, NULL); 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->fence.map = screen->fence.bo->map; 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->base.fence.emit = nv50_screen_fence_emit; 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->base.fence.update = nv50_screen_fence_update; 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_object_new(chan, 0xbeef0301, NOUVEAU_NOTIFIER_CLASS, 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &(struct nv04_notify){ .length = 32 }, 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(struct nv04_notify), &screen->sync); 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) { 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("Failed to allocate notifier: %d\n", ret); 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_object_new(chan, 0xbeef5039, NV50_M2MF_CLASS, 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 0, &screen->m2mf); 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) { 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("Failed to allocate PGRAPH context for M2MF: %d\n", ret); 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_object_new(chan, 0xbeef502d, NV50_2D_CLASS, 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 0, &screen->eng2d); 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) { 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("Failed to allocate PGRAPH context for 2D: %d\n", ret); 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dev->chipset & 0xf0) { 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x50: 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tesla_class = NV50_3D_CLASS; 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x80: 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x90: 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tesla_class = NV84_3D_CLASS; 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0xa0: 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dev->chipset) { 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0xa0: 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0xaa: 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0xac: 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tesla_class = NVA0_3D_CLASS; 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0xaf: 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tesla_class = NVAF_3D_CLASS; 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tesla_class = NVA3_3D_CLASS; 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("Not a known NV50 chipset: NV%02x\n", dev->chipset); 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->base.class_3d = tesla_class; 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_object_new(chan, 0xbeef5097, tesla_class, 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 0, &screen->tesla); 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) { 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("Failed to allocate PGRAPH context for 3D: %d\n", ret); 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_bo_new(dev, NOUVEAU_BO_VRAM, 1 << 16, 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3 << NV50_CODE_BO_SIZE_LOG2, NULL, &screen->code); 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) { 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("Failed to allocate code bo: %d\n", ret); 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_heap_init(&screen->vp_code_heap, 0, 1 << NV50_CODE_BO_SIZE_LOG2); 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_heap_init(&screen->gp_code_heap, 0, 1 << NV50_CODE_BO_SIZE_LOG2); 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_heap_init(&screen->fp_code_heap, 0, 1 << NV50_CODE_BO_SIZE_LOG2); 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_getparam(dev, NOUVEAU_GETPARAM_GRAPH_UNITS, &value); 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->TPs = util_bitcount(value & 0xffff); 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->MPsInTP = util_bitcount((value >> 24) & 0xf); 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stack_size = util_next_power_of_two(screen->TPs) * screen->MPsInTP * 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STACK_WARPS_ALLOC * 64 * 8; 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_bo_new(dev, NOUVEAU_BO_VRAM, 1 << 16, stack_size, NULL, 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &screen->stack_bo); 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) { 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("Failed to allocate stack bo: %d\n", ret); 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t size_of_one_temp = util_next_power_of_two(screen->TPs) * 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->MPsInTP * LOCAL_WARPS_ALLOC * THREADS_IN_WARP * 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ONE_TEMP_SIZE; 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->max_tls_space = dev->vram_size / size_of_one_temp * ONE_TEMP_SIZE; 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->max_tls_space /= 2; /* half of vram */ 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* hw can address max 64 KiB */ 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->max_tls_space = MIN2(screen->max_tls_space, 64 << 10); 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t tls_size; 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned tls_space = 4/*temps*/ * ONE_TEMP_SIZE; 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nv50_tls_alloc(screen, tls_space, &tls_size); 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nouveau_mesa_debug) 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("TPs = %u, MPsInTP = %u, VRAM = %"PRIu64" MiB, tls_size = %"PRIu64" KiB\n", 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->TPs, screen->MPsInTP, dev->vram_size >> 20, tls_size >> 10); 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_bo_new(dev, NOUVEAU_BO_VRAM, 1 << 16, 4 << 16, NULL, 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &screen->uniforms); 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) { 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("Failed to allocate uniforms bo: %d\n", ret); 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_bo_new(dev, NOUVEAU_BO_VRAM, 1 << 16, 3 << 16, NULL, 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &screen->txc); 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) { 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("Failed to allocate TIC/TSC bo: %d\n", ret); 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->tic.entries = CALLOC(4096, sizeof(void *)); 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->tsc.entries = screen->tic.entries + 2048; 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!nv50_blitctx_create(screen)) 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_screen_init_hwctx(screen); 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_fence_new(&screen->base, &screen->base.fence.current, FALSE); 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pscreen; 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfail: 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_screen_destroy(pscreen); 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_screen_tic_alloc(struct nv50_screen *screen, void *entry) 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i = screen->tic.next; 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (screen->tic.lock[i / 32] & (1 << (i % 32))) 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i = (i + 1) & (NV50_TIC_MAX_ENTRIES - 1); 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->tic.next = (i + 1) & (NV50_TIC_MAX_ENTRIES - 1); 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (screen->tic.entries[i]) 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_tic_entry(screen->tic.entries[i])->id = -1; 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->tic.entries[i] = entry; 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return i; 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_screen_tsc_alloc(struct nv50_screen *screen, void *entry) 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i = screen->tsc.next; 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (screen->tsc.lock[i / 32] & (1 << (i % 32))) 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i = (i + 1) & (NV50_TSC_MAX_ENTRIES - 1); 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->tsc.next = (i + 1) & (NV50_TSC_MAX_ENTRIES - 1); 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (screen->tsc.entries[i]) 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_tsc_entry(screen->tsc.entries[i])->id = -1; 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->tsc.entries[i] = entry; 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return i; 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 815