1 /* 2 * Copyright (C) 2009 Francisco Jerez. 3 * All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining 6 * a copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sublicense, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the 14 * next paragraph) shall be included in all copies or substantial 15 * portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 * 25 */ 26 27 #include "nouveau_driver.h" 28 #include "nouveau_context.h" 29 #include "nouveau_util.h" 30 31 #include "main/formats.h" 32 33 void 34 nouveau_surface_alloc(struct gl_context *ctx, struct nouveau_surface *s, 35 enum nouveau_surface_layout layout, 36 unsigned flags, unsigned format, 37 unsigned width, unsigned height) 38 { 39 union nouveau_bo_config config = {}; 40 int ret, cpp = _mesa_get_format_bytes(format); 41 42 nouveau_bo_ref(NULL, &s->bo); 43 44 *s = (struct nouveau_surface) { 45 .layout = layout, 46 .format = format, 47 .width = width, 48 .height = height, 49 .cpp = cpp, 50 .pitch = _mesa_format_row_stride(format, width), 51 }; 52 53 if (layout == TILED) { 54 s->pitch = align(s->pitch, 256); 55 config.nv04.surf_pitch = s->pitch; 56 57 if (cpp == 4) 58 config.nv04.surf_flags = NV04_BO_32BPP; 59 else if (cpp == 2) 60 config.nv04.surf_flags = NV04_BO_16BPP; 61 62 if (_mesa_get_format_bits(format, GL_DEPTH_BITS)) 63 config.nv04.surf_flags |= NV04_BO_ZETA; 64 65 } else { 66 s->pitch = align(s->pitch, 64); 67 } 68 69 ret = nouveau_bo_new(context_dev(ctx), flags, 0, 70 get_format_blocksy(format, height) * s->pitch, 71 &config, &s->bo); 72 assert(!ret); 73 } 74 75 void 76 nouveau_surface_ref(struct nouveau_surface *src, 77 struct nouveau_surface *dst) 78 { 79 if (src) { 80 dst->offset = src->offset; 81 dst->layout = src->layout; 82 dst->format = src->format; 83 dst->width = src->width; 84 dst->height = src->height; 85 dst->cpp = src->cpp; 86 dst->pitch = src->pitch; 87 nouveau_bo_ref(src->bo, &dst->bo); 88 89 } else { 90 nouveau_bo_ref(NULL, &dst->bo); 91 } 92 } 93