Subversion Repositories Kolibri OS

Rev

Rev 4358 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4358 Serge 1
/* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
2
 
3
/*
4
 * Copyright (C) 2013 Rob Clark 
5
 *
6
 * Permission is hereby granted, free of charge, to any person obtaining a
7
 * copy of this software and associated documentation files (the "Software"),
8
 * to deal in the Software without restriction, including without limitation
9
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10
 * and/or sell copies of the Software, and to permit persons to whom the
11
 * Software is furnished to do so, subject to the following conditions:
12
 *
13
 * The above copyright notice and this permission notice (including the next
14
 * paragraph) shall be included in all copies or substantial portions of the
15
 * Software.
16
 *
17
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
 * SOFTWARE.
24
 *
25
 * Authors:
26
 *    Rob Clark 
27
 */
28
 
29
#include "pipe/p_state.h"
30
#include "util/u_string.h"
31
#include "util/u_memory.h"
32
#include "util/u_inlines.h"
33
 
34
#include "fd3_texture.h"
35
#include "fd3_util.h"
36
 
37
static enum a3xx_tex_clamp
38
tex_clamp(unsigned wrap)
39
{
40
	/* hardware probably supports more, but we can't coax all the
41
	 * wrap/clamp modes out of the GLESv2 blob driver.
42
	 *
43
	 * TODO once we have basics working, go back and just try
44
	 * different values and see what happens
45
	 */
46
	switch (wrap) {
47
	case PIPE_TEX_WRAP_REPEAT:
48
		return A3XX_TEX_REPEAT;
49
	case PIPE_TEX_WRAP_CLAMP:
50
	case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
51
	case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
52
		return A3XX_TEX_CLAMP_TO_EDGE;
53
	case PIPE_TEX_WRAP_MIRROR_CLAMP:
54
	case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
55
	case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
56
	case PIPE_TEX_WRAP_MIRROR_REPEAT:
57
		return A3XX_TEX_MIRROR_REPEAT;
58
	default:
59
		DBG("invalid wrap: %u", wrap);
60
		return 0;
61
	}
62
}
63
 
64
static enum a3xx_tex_filter
65
tex_filter(unsigned filter)
66
{
67
	switch (filter) {
68
	case PIPE_TEX_FILTER_NEAREST:
69
		return A3XX_TEX_NEAREST;
70
	case PIPE_TEX_FILTER_LINEAR:
71
		return A3XX_TEX_LINEAR;
72
	default:
73
		DBG("invalid filter: %u", filter);
74
		return 0;
75
	}
76
}
77
 
78
static void *
79
fd3_sampler_state_create(struct pipe_context *pctx,
80
		const struct pipe_sampler_state *cso)
81
{
82
	struct fd3_sampler_stateobj *so = CALLOC_STRUCT(fd3_sampler_stateobj);
83
 
84
	if (!so)
85
		return NULL;
86
 
87
	so->base = *cso;
88
 
89
	so->texsamp0 =
4401 Serge 90
			COND(!cso->normalized_coords, A3XX_TEX_SAMP_0_UNNORM_COORDS) |
4358 Serge 91
			A3XX_TEX_SAMP_0_XY_MAG(tex_filter(cso->mag_img_filter)) |
92
			A3XX_TEX_SAMP_0_XY_MIN(tex_filter(cso->min_img_filter)) |
93
			A3XX_TEX_SAMP_0_WRAP_S(tex_clamp(cso->wrap_s)) |
94
			A3XX_TEX_SAMP_0_WRAP_T(tex_clamp(cso->wrap_t)) |
95
			A3XX_TEX_SAMP_0_WRAP_R(tex_clamp(cso->wrap_r));
96
	so->texsamp1 = 0x00000000;  /* ??? */
97
 
98
	return so;
99
}
100
 
4401 Serge 101
static enum a3xx_tex_type
102
tex_type(unsigned target)
103
{
104
	switch (target) {
105
	default:
106
		assert(0);
107
	case PIPE_BUFFER:
108
	case PIPE_TEXTURE_1D:
109
	case PIPE_TEXTURE_1D_ARRAY:
110
		return A3XX_TEX_1D;
111
	case PIPE_TEXTURE_RECT:
112
	case PIPE_TEXTURE_2D:
113
	case PIPE_TEXTURE_2D_ARRAY:
114
		return A3XX_TEX_2D;
115
	case PIPE_TEXTURE_3D:
116
		return A3XX_TEX_3D;
117
	case PIPE_TEXTURE_CUBE:
118
	case PIPE_TEXTURE_CUBE_ARRAY:
119
		return A3XX_TEX_CUBE;
120
	}
121
}
122
 
4358 Serge 123
static struct pipe_sampler_view *
124
fd3_sampler_view_create(struct pipe_context *pctx, struct pipe_resource *prsc,
125
		const struct pipe_sampler_view *cso)
126
{
127
	struct fd3_pipe_sampler_view *so = CALLOC_STRUCT(fd3_pipe_sampler_view);
128
	struct fd_resource *rsc = fd_resource(prsc);
129
 
130
	if (!so)
131
		return NULL;
132
 
133
	so->base = *cso;
134
	pipe_reference(NULL, &prsc->reference);
135
	so->base.texture = prsc;
136
	so->base.reference.count = 1;
137
	so->base.context = pctx;
138
 
139
	so->tex_resource =  rsc;
140
 
141
	so->texconst0 =
4401 Serge 142
			A3XX_TEX_CONST_0_TYPE(tex_type(prsc->target)) |
4358 Serge 143
			A3XX_TEX_CONST_0_FMT(fd3_pipe2tex(cso->format)) |
144
			fd3_tex_swiz(cso->format, cso->swizzle_r, cso->swizzle_g,
145
						cso->swizzle_b, cso->swizzle_a);
146
	so->texconst1 =
147
			A3XX_TEX_CONST_1_FETCHSIZE(fd3_pipe2fetchsize(cso->format)) |
148
			A3XX_TEX_CONST_1_WIDTH(prsc->width0) |
149
			A3XX_TEX_CONST_1_HEIGHT(prsc->height0);
150
	/* when emitted, A3XX_TEX_CONST_2_INDX() must be OR'd in: */
151
	so->texconst2 =
152
			A3XX_TEX_CONST_2_PITCH(rsc->pitch * rsc->cpp);
153
	so->texconst3 = 0x00000000;  /* ??? */
154
 
155
	return &so->base;
156
}
157
 
158
void
159
fd3_texture_init(struct pipe_context *pctx)
160
{
161
	pctx->create_sampler_state = fd3_sampler_state_create;
162
	pctx->create_sampler_view = fd3_sampler_view_create;
163
}