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 <algorithm>
24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/format.hpp"
26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/memory.hpp"
27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "pipe/p_screen.h"
28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "pipe/p_context.h"
29c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jereznamespace clover {
31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   static const std::map<cl_image_format, pipe_format> formats {
32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_BGRA, CL_UNORM_INT8 }, PIPE_FORMAT_B8G8R8A8_UNORM },
33c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_ARGB, CL_UNORM_INT8 }, PIPE_FORMAT_A8R8G8B8_UNORM },
34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGB, CL_UNORM_SHORT_565 }, PIPE_FORMAT_B5G6R5_UNORM },
35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_LUMINANCE, CL_UNORM_INT8 }, PIPE_FORMAT_L8_UNORM },
36c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_A, CL_UNORM_INT8 }, PIPE_FORMAT_A8_UNORM },
37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_INTENSITY, CL_UNORM_INT8 }, PIPE_FORMAT_I8_UNORM },
38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_LUMINANCE, CL_UNORM_INT16 }, PIPE_FORMAT_L16_UNORM },
39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_R, CL_FLOAT }, PIPE_FORMAT_R32_FLOAT },
40c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RG, CL_FLOAT }, PIPE_FORMAT_R32G32_FLOAT },
41c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGB, CL_FLOAT }, PIPE_FORMAT_R32G32B32_FLOAT },
42c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGBA, CL_FLOAT }, PIPE_FORMAT_R32G32B32A32_FLOAT },
43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_R, CL_UNORM_INT16 }, PIPE_FORMAT_R16_UNORM },
44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RG, CL_UNORM_INT16 }, PIPE_FORMAT_R16G16_UNORM },
45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGB, CL_UNORM_INT16 }, PIPE_FORMAT_R16G16B16_UNORM },
46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGBA, CL_UNORM_INT16 }, PIPE_FORMAT_R16G16B16A16_UNORM },
47c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_R, CL_SNORM_INT16 }, PIPE_FORMAT_R16_SNORM },
48c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RG, CL_SNORM_INT16 }, PIPE_FORMAT_R16G16_SNORM },
49c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGB, CL_SNORM_INT16 }, PIPE_FORMAT_R16G16B16_SNORM },
50c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGBA, CL_SNORM_INT16 }, PIPE_FORMAT_R16G16B16A16_SNORM },
51c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_R, CL_UNORM_INT8 }, PIPE_FORMAT_R8_UNORM },
52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RG, CL_UNORM_INT8 }, PIPE_FORMAT_R8G8_UNORM },
53c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGB, CL_UNORM_INT8 }, PIPE_FORMAT_R8G8B8_UNORM },
54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGBA, CL_UNORM_INT8 }, PIPE_FORMAT_R8G8B8A8_UNORM },
55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_R, CL_SNORM_INT8 }, PIPE_FORMAT_R8_SNORM },
56c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RG, CL_SNORM_INT8 }, PIPE_FORMAT_R8G8_SNORM },
57c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGB, CL_SNORM_INT8 }, PIPE_FORMAT_R8G8B8_SNORM },
58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGBA, CL_SNORM_INT8 }, PIPE_FORMAT_R8G8B8A8_SNORM },
59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_R, CL_HALF_FLOAT }, PIPE_FORMAT_R16_FLOAT },
60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RG, CL_HALF_FLOAT }, PIPE_FORMAT_R16G16_FLOAT },
61c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGB, CL_HALF_FLOAT }, PIPE_FORMAT_R16G16B16_FLOAT },
62c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGBA, CL_HALF_FLOAT }, PIPE_FORMAT_R16G16B16A16_FLOAT },
63c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGBx, CL_UNORM_SHORT_555 }, PIPE_FORMAT_B5G5R5X1_UNORM },
64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGBx, CL_UNORM_INT8 }, PIPE_FORMAT_R8G8B8X8_UNORM },
65c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_A, CL_UNORM_INT16 }, PIPE_FORMAT_A16_UNORM },
66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_INTENSITY, CL_UNORM_INT16 }, PIPE_FORMAT_I16_UNORM },
67c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_LUMINANCE, CL_SNORM_INT8 }, PIPE_FORMAT_L8_SNORM },
68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_INTENSITY, CL_SNORM_INT8 }, PIPE_FORMAT_I8_SNORM },
69c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_A, CL_SNORM_INT16 }, PIPE_FORMAT_A16_SNORM },
70c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_LUMINANCE, CL_SNORM_INT16 }, PIPE_FORMAT_L16_SNORM },
71c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_INTENSITY, CL_SNORM_INT16 }, PIPE_FORMAT_I16_SNORM },
72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_A, CL_HALF_FLOAT }, PIPE_FORMAT_A16_FLOAT },
73c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_LUMINANCE, CL_HALF_FLOAT }, PIPE_FORMAT_L16_FLOAT },
74c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_INTENSITY, CL_HALF_FLOAT }, PIPE_FORMAT_I16_FLOAT },
75c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_A, CL_FLOAT }, PIPE_FORMAT_A32_FLOAT },
76c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_LUMINANCE, CL_FLOAT }, PIPE_FORMAT_L32_FLOAT },
77c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_INTENSITY, CL_FLOAT }, PIPE_FORMAT_I32_FLOAT },
78c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RA, CL_UNORM_INT8 }, PIPE_FORMAT_R8A8_UNORM },
79c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_R, CL_UNSIGNED_INT8 }, PIPE_FORMAT_R8_UINT },
80c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RG, CL_UNSIGNED_INT8 }, PIPE_FORMAT_R8G8_UINT },
81c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGB, CL_UNSIGNED_INT8 }, PIPE_FORMAT_R8G8B8_UINT },
82c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGBA, CL_UNSIGNED_INT8 }, PIPE_FORMAT_R8G8B8A8_UINT },
83c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_R, CL_SIGNED_INT8 }, PIPE_FORMAT_R8_SINT },
84c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RG, CL_SIGNED_INT8 }, PIPE_FORMAT_R8G8_SINT },
85c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGB, CL_SIGNED_INT8 }, PIPE_FORMAT_R8G8B8_SINT },
86c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGBA, CL_SIGNED_INT8 }, PIPE_FORMAT_R8G8B8A8_SINT },
87c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_R, CL_UNSIGNED_INT16 }, PIPE_FORMAT_R16_UINT },
88c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RG, CL_UNSIGNED_INT16 }, PIPE_FORMAT_R16G16_UINT },
89c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGB, CL_UNSIGNED_INT16 }, PIPE_FORMAT_R16G16B16_UINT },
90c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGBA, CL_UNSIGNED_INT16 }, PIPE_FORMAT_R16G16B16A16_UINT },
91c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_R, CL_SIGNED_INT16 }, PIPE_FORMAT_R16_SINT },
92c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RG, CL_SIGNED_INT16 }, PIPE_FORMAT_R16G16_SINT },
93c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGB, CL_SIGNED_INT16 }, PIPE_FORMAT_R16G16B16_SINT },
94c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGBA, CL_SIGNED_INT16 }, PIPE_FORMAT_R16G16B16A16_SINT },
95c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_R, CL_UNSIGNED_INT32 }, PIPE_FORMAT_R32_UINT },
96c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RG, CL_UNSIGNED_INT32 }, PIPE_FORMAT_R32G32_UINT },
97c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGB, CL_UNSIGNED_INT32 }, PIPE_FORMAT_R32G32B32_UINT },
98c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGBA, CL_UNSIGNED_INT32 }, PIPE_FORMAT_R32G32B32A32_UINT },
99c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_R, CL_SIGNED_INT32 }, PIPE_FORMAT_R32_SINT },
100c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RG, CL_SIGNED_INT32 }, PIPE_FORMAT_R32G32_SINT },
101c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGB, CL_SIGNED_INT32 }, PIPE_FORMAT_R32G32B32_SINT },
102c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_RGBA, CL_SIGNED_INT32 }, PIPE_FORMAT_R32G32B32A32_SINT },
103c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_A, CL_UNSIGNED_INT8 }, PIPE_FORMAT_A8_UINT },
104c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_INTENSITY, CL_UNSIGNED_INT8 }, PIPE_FORMAT_I8_UINT },
105c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_LUMINANCE, CL_UNSIGNED_INT8 }, PIPE_FORMAT_L8_UINT },
106c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_A, CL_SIGNED_INT8 }, PIPE_FORMAT_A8_SINT },
107c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_INTENSITY, CL_SIGNED_INT8 }, PIPE_FORMAT_I8_SINT },
108c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_LUMINANCE, CL_SIGNED_INT8 }, PIPE_FORMAT_L8_SINT },
109c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_A, CL_UNSIGNED_INT16 }, PIPE_FORMAT_A16_UINT },
110c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_INTENSITY, CL_UNSIGNED_INT16 }, PIPE_FORMAT_I16_UINT },
111c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_LUMINANCE, CL_UNSIGNED_INT16 }, PIPE_FORMAT_L16_UINT },
112c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_A, CL_SIGNED_INT16 }, PIPE_FORMAT_A16_SINT },
113c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_INTENSITY, CL_SIGNED_INT16 }, PIPE_FORMAT_I16_SINT },
114c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_LUMINANCE, CL_SIGNED_INT16 }, PIPE_FORMAT_L16_SINT },
115c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_A, CL_UNSIGNED_INT32 }, PIPE_FORMAT_A32_UINT },
116c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_INTENSITY, CL_UNSIGNED_INT32 }, PIPE_FORMAT_I32_UINT },
117c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_LUMINANCE, CL_UNSIGNED_INT32 }, PIPE_FORMAT_L32_UINT },
118c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_A, CL_SIGNED_INT32 }, PIPE_FORMAT_A32_SINT },
119c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_INTENSITY, CL_SIGNED_INT32 }, PIPE_FORMAT_I32_SINT },
120c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      { { CL_LUMINANCE, CL_SIGNED_INT32 }, PIPE_FORMAT_L32_SINT }
121c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   };
122c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
123c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   pipe_texture_target
124c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   translate_target(cl_mem_object_type type) {
125c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      switch (type) {
126c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      case CL_MEM_OBJECT_BUFFER:
127c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         return PIPE_BUFFER;
128c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      case CL_MEM_OBJECT_IMAGE2D:
129c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         return PIPE_TEXTURE_2D;
130c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      case CL_MEM_OBJECT_IMAGE3D:
131c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         return PIPE_TEXTURE_3D;
132c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      default:
133c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         throw error(CL_INVALID_VALUE);
134c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      }
135c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   }
136c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
137c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   pipe_format
138c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   translate_format(const cl_image_format &format) {
139c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      auto it = formats.find(format);
140c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
141c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      if (it == formats.end())
142c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         throw error(CL_IMAGE_FORMAT_NOT_SUPPORTED);
143c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
144c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      return it->second;
145c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   }
146c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
147c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   std::set<cl_image_format>
148c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   supported_formats(cl_context ctx, cl_mem_object_type type) {
149c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      std::set<cl_image_format> s;
150c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      pipe_texture_target target = translate_target(type);
151c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      unsigned bindings = (PIPE_BIND_SAMPLER_VIEW |
152c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                           PIPE_BIND_COMPUTE_RESOURCE |
153c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                           PIPE_BIND_TRANSFER_READ |
154c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                           PIPE_BIND_TRANSFER_WRITE);
155c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
156c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      for (auto f : formats) {
157c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         if (std::all_of(ctx->devs.begin(), ctx->devs.end(),
158c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                         [=](const device *dev) {
159c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                            return dev->pipe->is_format_supported(
160c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                               dev->pipe, f.second, target, 1, bindings);
161c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                         }))
162c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez            s.insert(f.first);
163c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      }
164c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
165c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      return s;
166c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   }
167c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
168