1848b8605Smrg/*
2848b8605Smrg * Copyright (C) 2012 Rob Clark <robclark@freedesktop.org>
3848b8605Smrg *
4848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
5848b8605Smrg * copy of this software and associated documentation files (the "Software"),
6848b8605Smrg * to deal in the Software without restriction, including without limitation
7848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the
9848b8605Smrg * Software is furnished to do so, subject to the following conditions:
10848b8605Smrg *
11848b8605Smrg * The above copyright notice and this permission notice (including the next
12848b8605Smrg * paragraph) shall be included in all copies or substantial portions of the
13848b8605Smrg * Software.
14848b8605Smrg *
15848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16848b8605Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19848b8605Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20848b8605Smrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21848b8605Smrg * SOFTWARE.
22848b8605Smrg *
23848b8605Smrg * Authors:
24848b8605Smrg *    Rob Clark <robclark@freedesktop.org>
25848b8605Smrg */
26848b8605Smrg
27848b8605Smrg#include "freedreno_surface.h"
28848b8605Smrg#include "freedreno_resource.h"
29848b8605Smrg#include "freedreno_util.h"
30848b8605Smrg
31848b8605Smrg#include "util/u_memory.h"
32848b8605Smrg#include "util/u_inlines.h"
33848b8605Smrg
34848b8605Smrgstruct pipe_surface *
35848b8605Smrgfd_create_surface(struct pipe_context *pctx,
36848b8605Smrg		struct pipe_resource *ptex,
37848b8605Smrg		const struct pipe_surface *surf_tmpl)
38848b8605Smrg{
39848b8605Smrg//	struct fd_resource* tex = fd_resource(ptex);
40848b8605Smrg	struct fd_surface* surface = CALLOC_STRUCT(fd_surface);
41848b8605Smrg
42b8e80941Smrg	if (!surface)
43b8e80941Smrg		return NULL;
44b8e80941Smrg
45b8e80941Smrg
46b8e80941Smrg	struct pipe_surface *psurf = &surface->base;
47b8e80941Smrg	unsigned level = surf_tmpl->u.tex.level;
48848b8605Smrg
49b8e80941Smrg	pipe_reference_init(&psurf->reference, 1);
50b8e80941Smrg	pipe_resource_reference(&psurf->texture, ptex);
51848b8605Smrg
52b8e80941Smrg	psurf->context = pctx;
53b8e80941Smrg	psurf->format = surf_tmpl->format;
54b8e80941Smrg	psurf->width = u_minify(ptex->width0, level);
55b8e80941Smrg	psurf->height = u_minify(ptex->height0, level);
56b8e80941Smrg	psurf->nr_samples = surf_tmpl->nr_samples;
57848b8605Smrg
58b8e80941Smrg	if (ptex->target == PIPE_BUFFER) {
59b8e80941Smrg		psurf->u.buf.first_element = surf_tmpl->u.buf.first_element;
60b8e80941Smrg		psurf->u.buf.last_element = surf_tmpl->u.buf.last_element;
61b8e80941Smrg	} else {
62b8e80941Smrg		debug_assert(surf_tmpl->u.tex.first_layer == surf_tmpl->u.tex.last_layer);
63848b8605Smrg		psurf->u.tex.level = level;
64848b8605Smrg		psurf->u.tex.first_layer = surf_tmpl->u.tex.first_layer;
65848b8605Smrg		psurf->u.tex.last_layer = surf_tmpl->u.tex.last_layer;
66848b8605Smrg	}
67848b8605Smrg
68b8e80941Smrg	// TODO
69b8e80941Smrg	DBG("TODO: %ux%u", psurf->width, psurf->height);
70b8e80941Smrg
71848b8605Smrg	return &surface->base;
72848b8605Smrg}
73848b8605Smrg
74848b8605Smrgvoid
75848b8605Smrgfd_surface_destroy(struct pipe_context *pctx, struct pipe_surface *psurf)
76848b8605Smrg{
77848b8605Smrg	pipe_resource_reference(&psurf->texture, NULL);
78848b8605Smrg	FREE(psurf);
79848b8605Smrg}
80