r300_screen.c revision 3b37cb49b821dd0c59fd5361ada6c0df9ac07db8
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 return "X.Org R300 Project"; 27} 28 29static const char* r300_get_name(struct pipe_screen* pscreen) { 30 /* XXX lazy */ 31 return "unknown"; 32} 33 34static int r300_get_param(struct pipe_screen* pscreen, int param) { 35 struct r300_screen* r300screen = r300_screen(pscreen); 36 37 switch (param) { 38 /* Cases marked "IN THEORY" are possible on the hardware, 39 * but haven't been implemented yet. */ 40 case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS: 41 /* XXX I'm told this goes up to 16 */ 42 return 8; 43 case PIPE_CAP_NPOT_TEXTURES: 44 /* IN THEORY */ 45 return 0; 46 case PIPE_CAP_S3TC: 47 /* IN THEORY */ 48 return 0; 49 case PIPE_CAP_TWO_SIDED_STENCIL: 50 /* IN THEORY */ 51 return 0; 52 case PIPE_CAP_ANISOTROPIC_FILTER: 53 /* IN THEORY */ 54 return 0; 55 case PIPE_CAP_POINT_SPRITE: 56 /* IN THEORY */ 57 return 0; 58 case PIPE_CAP_OCCLUSION_QUERY: 59 /* IN THEORY */ 60 return 0; 61 case PIPE_CAP_TEXTURE_SHADOW_MAP: 62 /* IN THEORY */ 63 return 0; 64 case PIPE_CAP_GLSL: 65 /* IN THEORY */ 66 return 0; 67 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: 68 /* 12 == 2048x2048 */ 69 if (r300screen->is_r500) { 70 /* R500 can do 4096x4096 */ 71 return 13; 72 } else { 73 return 12; 74 } 75 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: 76 /* XXX educated guess */ 77 return 8; 78 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: 79 /* XXX educated guess */ 80 return 11; 81 case PIPE_CAP_MAX_RENDER_TARGETS: 82 /* XXX 4 eventually */ 83 return 1; 84 default: 85 return 0; 86 } 87} 88 89static float r300_get_paramf(struct pipe_screen* pscreen, int param) { 90 switch (param) { 91 case PIPE_CAP_MAX_LINE_WIDTH: 92 case PIPE_CAP_MAX_LINE_WIDTH_AA: 93 /* XXX look this up, lazy ass! */ 94 return 0.0; 95 case PIPE_CAP_MAX_POINT_WIDTH: 96 case PIPE_CAP_MAX_POINT_WIDTH_AA: 97 /* XXX see above */ 98 return 255.0; 99 case PIPE_CAP_MAX_TEXTURE_ANISOTROPY: 100 return 16.0; 101 case PIPE_CAP_MAX_TEXTURE_LOD_BIAS: 102 /* XXX again... */ 103 return 16.0; 104 default: 105 return 0.0; 106 } 107} 108 109static boolean r300_is_format_supported(struct pipe_screen* pscreen, 110 enum pipe_format format, 111 enum pipe_texture_target target, 112 unsigned tex_usage, 113 unsigned geom_flags) 114{ 115 return FALSE; 116} 117 118static void* r300_surface_map(struct pipe_screen* screen, 119 struct pipe_surface* surface, 120 unsigned flags) 121{ 122 /* XXX is this all we need to do here? */ 123 char* map = pipe_buffer_map(screen, surface->buffer, flags); 124 125 if (!map) { 126 return NULL; 127 } 128 129 return map + surface->offset; 130} 131 132static void r300_surface_unmap(struct pipe_screen* screen, 133 struct pipe_surface* surface) 134{ 135 pipe_buffer_unmap(screen, surface->buffer); 136} 137 138static void r300_destroy_screen(struct pipe_screen* pscreen) { 139 FREE(pscreen); 140} 141 142struct pipe_screen* r300_create_screen(struct pipe_winsys* winsys, uint pci_id) { 143 struct r300_screen* r300screen = CALLOC_STRUCT(r300_screen); 144 145 if (!r300screen) 146 return NULL; 147 148 /* XXX break this into its own function? */ 149 switch (pci_id) { 150 default: 151 debug_printf("%s: unknown PCI ID 0x%x, cannot create screen!\n", 152 __FUNCTION__, pci_id); 153 return NULL; 154 } 155 156 r300screen->pci_id = pci_id; 157 r300screen->screen.winsys = winsys; 158 r300screen->screen.destroy = r300_destroy_screen; 159 r300screen->screen.get_name = r300_get_name; 160 r300screen->screen.get_vendor = r300_get_vendor; 161 r300screen->screen.get_param = r300_get_param; 162 r300screen->screen.get_paramf = r300_get_paramf; 163 r300screen->screen.is_format_supported = r300_is_format_supported; 164 r300screen->screen.surface_map = r300_surface_map; 165 r300screen->screen.surface_unmap = r300_surface_unmap; 166 167 return &r300screen->screen; 168} 169