0,0 → 1,92 |
/* |
* Copyright (C) 2009 Francisco Jerez. |
* All Rights Reserved. |
* |
* Permission is hereby granted, free of charge, to any person obtaining |
* a copy of this software and associated documentation files (the |
* "Software"), to deal in the Software without restriction, including |
* without limitation the rights to use, copy, modify, merge, publish, |
* distribute, sublicense, and/or sell copies of the Software, and to |
* permit persons to whom the Software is furnished to do so, subject to |
* the following conditions: |
* |
* The above copyright notice and this permission notice (including the |
* next paragraph) shall be included in all copies or substantial |
* portions of the Software. |
* |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
* IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE |
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
* |
*/ |
|
#include "nouveau_driver.h" |
#include "nouveau_context.h" |
#include "nouveau_util.h" |
|
#include "main/formats.h" |
|
void |
nouveau_surface_alloc(struct gl_context *ctx, struct nouveau_surface *s, |
enum nouveau_surface_layout layout, |
unsigned flags, unsigned format, |
unsigned width, unsigned height) |
{ |
union nouveau_bo_config config = {}; |
int ret, cpp = _mesa_get_format_bytes(format); |
|
nouveau_bo_ref(NULL, &s->bo); |
|
*s = (struct nouveau_surface) { |
.layout = layout, |
.format = format, |
.width = width, |
.height = height, |
.cpp = cpp, |
.pitch = _mesa_format_row_stride(format, width), |
}; |
|
if (layout == TILED) { |
s->pitch = align(s->pitch, 256); |
config.nv04.surf_pitch = s->pitch; |
|
if (cpp == 4) |
config.nv04.surf_flags = NV04_BO_32BPP; |
else if (cpp == 2) |
config.nv04.surf_flags = NV04_BO_16BPP; |
|
if (_mesa_get_format_bits(format, GL_DEPTH_BITS)) |
config.nv04.surf_flags |= NV04_BO_ZETA; |
|
} else { |
s->pitch = align(s->pitch, 64); |
} |
|
ret = nouveau_bo_new(context_dev(ctx), flags, 0, |
get_format_blocksy(format, height) * s->pitch, |
&config, &s->bo); |
assert(!ret); |
} |
|
void |
nouveau_surface_ref(struct nouveau_surface *src, |
struct nouveau_surface *dst) |
{ |
if (src) { |
dst->offset = src->offset; |
dst->layout = src->layout; |
dst->format = src->format; |
dst->width = src->width; |
dst->height = src->height; |
dst->cpp = src->cpp; |
dst->pitch = src->pitch; |
nouveau_bo_ref(src->bo, &dst->bo); |
|
} else { |
nouveau_bo_ref(NULL, &dst->bo); |
} |
} |