r300_screen.c revision 54d137e079b9420e8aca55f37307ece45e9b71d8
1/* 2 * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com> 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * on the rights to use, copy, modify, merge, publish, distribute, sub 8 * license, and/or sell copies of the Software, and to permit persons to whom 9 * the Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21 * USE OR OTHER DEALINGS IN THE SOFTWARE. */ 22 23#include "r300_screen.h" 24 25static const char* r300_get_vendor(struct pipe_screen* pscreen) 26{ 27 return "X.Org R300 Project"; 28} 29 30static const char* r300_get_name(struct pipe_screen* pscreen) 31{ 32 struct r300_screen* r300screen = r300_screen(pscreen); 33 34 return chip_families[r300screen->caps->family]; 35} 36 37static int r300_get_param(struct pipe_screen* pscreen, int param) 38{ 39 struct r300_screen* r300screen = r300_screen(pscreen); 40 41 switch (param) { 42 /* XXX cases marked "IN THEORY" are possible on the hardware, 43 * but haven't been implemented yet. */ 44 case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS: 45 /* XXX I'm told this goes up to 16 */ 46 return 8; 47 case PIPE_CAP_NPOT_TEXTURES: 48 /* IN THEORY */ 49 return 0; 50 case PIPE_CAP_S3TC: 51 /* IN THEORY */ 52 return 0; 53 case PIPE_CAP_TWO_SIDED_STENCIL: 54 /* IN THEORY */ 55 /* if (r300screen->is_r500) { 56 * return 1; 57 * } else { 58 * return 0; 59 * } */ 60 return 0; 61 case PIPE_CAP_ANISOTROPIC_FILTER: 62 /* IN THEORY */ 63 return 0; 64 case PIPE_CAP_POINT_SPRITE: 65 /* IN THEORY */ 66 return 0; 67 case PIPE_CAP_OCCLUSION_QUERY: 68 /* IN THEORY */ 69 return 0; 70 case PIPE_CAP_TEXTURE_SHADOW_MAP: 71 /* IN THEORY */ 72 return 0; 73 case PIPE_CAP_GLSL: 74 /* IN THEORY */ 75 return 0; 76 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: 77 /* 12 == 2048x2048 */ 78 return 12; 79 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: 80 /* XXX educated guess */ 81 return 8; 82 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: 83 /* XXX educated guess */ 84 return 11; 85 case PIPE_CAP_MAX_RENDER_TARGETS: 86 /* XXX 4 eventually */ 87 return 1; 88 default: 89 return 0; 90 } 91} 92 93static float r300_get_paramf(struct pipe_screen* pscreen, int param) 94{ 95 switch (param) { 96 case PIPE_CAP_MAX_LINE_WIDTH: 97 case PIPE_CAP_MAX_LINE_WIDTH_AA: 98 /* XXX look this up, lazy ass! */ 99 return 0.0; 100 case PIPE_CAP_MAX_POINT_WIDTH: 101 case PIPE_CAP_MAX_POINT_WIDTH_AA: 102 /* XXX see above */ 103 return 255.0; 104 case PIPE_CAP_MAX_TEXTURE_ANISOTROPY: 105 return 16.0; 106 case PIPE_CAP_MAX_TEXTURE_LOD_BIAS: 107 return 16.0; 108 default: 109 return 0.0; 110 } 111} 112 113static boolean r300_is_format_supported(struct pipe_screen* pscreen, 114 enum pipe_format format, 115 enum pipe_texture_target target, 116 unsigned tex_usage, 117 unsigned geom_flags) 118{ 119 return FALSE; 120} 121 122static void* r300_surface_map(struct pipe_screen* screen, 123 struct pipe_surface* surface, 124 unsigned flags) 125{ 126 char* map = pipe_buffer_map(screen, surface->buffer, flags); 127 128 if (!map) { 129 return NULL; 130 } 131 132 return map + surface->offset; 133} 134 135static void r300_surface_unmap(struct pipe_screen* screen, 136 struct pipe_surface* surface) 137{ 138 pipe_buffer_unmap(screen, surface->buffer); 139} 140 141static void r300_destroy_screen(struct pipe_screen* pscreen) 142{ 143 struct r300_screen* r300screen = r300_screen(pscreen); 144 145 FREE(r300screen->caps); 146 FREE(r300screen); 147} 148 149struct pipe_screen* r300_create_screen(struct pipe_winsys* winsys, uint32_t pci_id) 150{ 151 struct r300_screen* r300screen = CALLOC_STRUCT(r300_screen); 152 struct r300_capabilities* caps = CALLOC_STRUCT(r300_capabilities); 153 154 if (!r300screen || !caps) 155 return NULL; 156 157 r300_parse_chipset(pci_id, caps); 158 159 r300screen->caps = caps; 160 r300screen->screen.winsys = winsys; 161 r300screen->screen.destroy = r300_destroy_screen; 162 r300screen->screen.get_name = r300_get_name; 163 r300screen->screen.get_vendor = r300_get_vendor; 164 r300screen->screen.get_param = r300_get_param; 165 r300screen->screen.get_paramf = r300_get_paramf; 166 r300screen->screen.is_format_supported = r300_is_format_supported; 167 r300screen->screen.surface_map = r300_surface_map; 168 r300screen->screen.surface_unmap = r300_surface_unmap; 169 170 return &r300screen->screen; 171} 172