1c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
2c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Copyright 2012 Francisco Jerez
3c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
4c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Permission is hereby granted, free of charge, to any person obtaining a
5c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// copy of this software and associated documentation files (the "Software"),
6c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// to deal in the Software without restriction, including without limitation
7c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// the rights to use, copy, modify, merge, publish, distribute, sublicense,
8c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// and/or sell copies of the Software, and to permit persons to whom the
9c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Software is furnished to do so, subject to the following conditions:
10c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
11c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// The above copyright notice and this permission notice shall be included in
12c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// all copies or substantial portions of the Software.
13c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
14c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// SOFTWARE.
21c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
22c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
23c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/sampler.hpp"
24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "pipe/p_state.h"
25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezusing namespace clover;
27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_sampler::_cl_sampler(clover::context &ctx, bool norm_mode,
29c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                         cl_addressing_mode addr_mode,
30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                         cl_filter_mode filter_mode) :
31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ctx(ctx), __norm_mode(norm_mode),
32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   __addr_mode(addr_mode), __filter_mode(filter_mode) {
33c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezbool
36c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_sampler::norm_mode() {
37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return __norm_mode;
38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
40c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezcl_addressing_mode
41c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_sampler::addr_mode() {
42c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return __addr_mode;
43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezcl_filter_mode
46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_sampler::filter_mode() {
47c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return __filter_mode;
48c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
49c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
50c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid *
51c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_sampler::bind(clover::command_queue &q) {
52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   struct pipe_sampler_state info {};
53c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   info.normalized_coords = norm_mode();
55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
56c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   info.wrap_s = info.wrap_t = info.wrap_r =
57c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      (addr_mode() == CL_ADDRESS_CLAMP_TO_EDGE ? PIPE_TEX_WRAP_CLAMP_TO_EDGE :
58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez       addr_mode() == CL_ADDRESS_CLAMP ? PIPE_TEX_WRAP_CLAMP_TO_BORDER :
59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez       addr_mode() == CL_ADDRESS_REPEAT ? PIPE_TEX_WRAP_REPEAT :
60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez       addr_mode() == CL_ADDRESS_MIRRORED_REPEAT ? PIPE_TEX_WRAP_MIRROR_REPEAT :
61c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez       PIPE_TEX_WRAP_CLAMP_TO_EDGE);
62c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
63c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   info.min_img_filter = info.mag_img_filter =
64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      (filter_mode() == CL_FILTER_LINEAR ? PIPE_TEX_FILTER_LINEAR :
65c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez       PIPE_TEX_FILTER_NEAREST);
66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
67c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return q.pipe->create_sampler_state(q.pipe, &info);
68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
69c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
70c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid
71c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez_cl_sampler::unbind(clover::command_queue &q, void *st) {
72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   q.pipe->delete_sampler_state(q.pipe, st);
73c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
74