void r300_texture_setup_format_state(struct r300_screen *screen,
struct r300_resource *tex,
+ enum pipe_format format,
unsigned level,
+ unsigned width0_override,
+ unsigned height0_override,
struct r300_texture_format_state *out)
{
struct pipe_resource *pt = &tex->b.b.b;
unsigned width, height, depth;
unsigned txwidth, txheight, txdepth;
- width = u_minify(desc->width0, level);
- height = u_minify(desc->height0, level);
+ width = u_minify(width0_override, level);
+ height = u_minify(height0_override, level);
depth = u_minify(desc->depth0, level);
txwidth = (width - 1) & 0x7ff;
R300_TX_DEPTH(txdepth);
if (desc->uses_stride_addressing) {
+ unsigned stride =
+ r300_stride_to_width(format, desc->stride_in_bytes[level]);
/* rectangles love this */
out->format0 |= R300_TX_PITCH_EN;
- out->format2 = (desc->stride_in_pixels[level] - 1) & 0x1fff;
+ out->format2 = (stride - 1) & 0x1fff;
}
if (pt->target == PIPE_TEXTURE_CUBE) {
{
struct r300_resource *tex = r300_resource(surf->base.texture);
unsigned level = surf->base.u.tex.level;
+ unsigned stride =
+ r300_stride_to_width(surf->base.format, tex->tex.stride_in_bytes[level]);
/* Set framebuffer state. */
if (util_format_is_depth_or_stencil(surf->base.format)) {
surf->pitch =
- tex->tex.stride_in_pixels[level] |
+ stride |
R300_DEPTHMACROTILE(tex->tex.macrotile[level]) |
R300_DEPTHMICROTILE(tex->tex.microtile);
surf->format = r300_translate_zsformat(surf->base.format);
surf->pitch_hiz = tex->tex.hiz_stride_in_pixels[level];
} else {
surf->pitch =
- tex->tex.stride_in_pixels[level] |
+ stride |
r300_translate_colorformat(surf->base.format) |
R300_COLOR_TILE(tex->tex.macrotile[level]) |
R300_COLOR_MICROTILE(tex->tex.microtile);
}
}
-void r300_resource_set_properties(struct pipe_screen *screen,
- struct pipe_resource *tex,
- const struct pipe_resource *new_properties)
-{
- struct r300_screen *rscreen = r300_screen(screen);
- struct r300_resource *res = r300_resource(tex);
-
- SCREEN_DBG(rscreen, DBG_TEX,
- "r300: texture_set_properties: %s -> %s\n",
- util_format_short_name(tex->format),
- util_format_short_name(new_properties->format));
-
- r300_texture_desc_init(rscreen, res, new_properties);
- r300_texture_setup_format_state(rscreen, res, 0, &res->tx_format);
-}
-
static void r300_texture_destroy(struct pipe_screen *screen,
struct pipe_resource* texture)
{
struct pipe_resource *texture,
struct winsys_handle *whandle)
{
- struct radeon_winsys *rws = (struct radeon_winsys *)screen->winsys;
+ struct radeon_winsys *rws = r300_screen(screen)->rws;
struct r300_resource* tex = (struct r300_resource*)texture;
if (!tex) {
return NULL;
}
+ if (base->nr_samples > 1)
+ return NULL;
+
pipe_reference_init(&tex->b.b.b.reference, 1);
tex->b.b.b.screen = &rscreen->screen;
tex->b.b.b.usage = base->usage;
RADEON_DOMAIN_VRAM | RADEON_DOMAIN_GTT;
tex->buf = buffer;
- r300_resource_set_properties(&rscreen->screen, &tex->b.b.b, base);
+ r300_texture_desc_init(rscreen, tex, base);
/* Create the backing buffer if needed. */
if (!tex->buf) {
const struct pipe_resource *base,
struct winsys_handle *whandle)
{
- struct radeon_winsys *rws = (struct radeon_winsys*)screen->winsys;
struct r300_screen *rscreen = r300_screen(screen);
+ struct radeon_winsys *rws = rscreen->rws;
struct pb_buffer *buffer;
enum radeon_bo_layout microtile, macrotile;
unsigned stride;
if (!buffer)
return NULL;
- rws->buffer_get_tiling(buffer, µtile, ¯otile);
+ rws->buffer_get_tiling(buffer, µtile, ¯otile, NULL, NULL, NULL, NULL, NULL);
/* Enforce a microtiled zbuffer. */
if (util_format_is_depth_or_stencil(base->format) &&
/* Not required to implement u_resource_vtbl, consider moving to another file:
*/
-struct pipe_surface* r300_create_surface(struct pipe_context * ctx,
+struct pipe_surface* r300_create_surface_custom(struct pipe_context * ctx,
struct pipe_resource* texture,
- const struct pipe_surface *surf_tmpl)
+ const struct pipe_surface *surf_tmpl,
+ unsigned width0_override,
+ unsigned height0_override)
{
struct r300_resource* tex = r300_resource(texture);
struct r300_surface* surface = CALLOC_STRUCT(r300_surface);
pipe_resource_reference(&surface->base.texture, texture);
surface->base.context = ctx;
surface->base.format = surf_tmpl->format;
- surface->base.width = u_minify(texture->width0, level);
- surface->base.height = u_minify(texture->height0, level);
+ surface->base.width = u_minify(width0_override, level);
+ surface->base.height = u_minify(height0_override, level);
surface->base.usage = surf_tmpl->usage;
surface->base.u.tex.level = level;
surface->base.u.tex.first_layer = surf_tmpl->u.tex.first_layer;
surface->cbzb_width = align(surface->base.width, 64);
/* Height must be aligned to the size of a tile. */
- tile_height = r300_get_pixel_alignment(tex->b.b.b.format,
+ tile_height = r300_get_pixel_alignment(surface->base.format,
tex->b.b.b.nr_samples,
tex->tex.microtile,
tex->tex.macrotile[level],
return &surface->base;
}
+struct pipe_surface* r300_create_surface(struct pipe_context * ctx,
+ struct pipe_resource* texture,
+ const struct pipe_surface *surf_tmpl)
+{
+ return r300_create_surface_custom(ctx, texture, surf_tmpl,
+ texture->width0,
+ texture->height0);
+}
+
/* Not required to implement u_resource_vtbl, consider moving to another file:
*/
void r300_surface_destroy(struct pipe_context *ctx, struct pipe_surface* s)