xref: /aosp_15_r20/external/mesa3d/src/mesa/main/texturebindless.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2017 Valve Corporation.
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21*61046927SAndroid Build Coastguard Worker  * DEALINGS IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
25*61046927SAndroid Build Coastguard Worker #include "context.h"
26*61046927SAndroid Build Coastguard Worker #include "enums.h"
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker #include "hash.h"
29*61046927SAndroid Build Coastguard Worker #include "mtypes.h"
30*61046927SAndroid Build Coastguard Worker #include "shaderimage.h"
31*61046927SAndroid Build Coastguard Worker #include "teximage.h"
32*61046927SAndroid Build Coastguard Worker #include "texobj.h"
33*61046927SAndroid Build Coastguard Worker #include "texturebindless.h"
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker #include "util/hash_table.h"
36*61046927SAndroid Build Coastguard Worker #include "util/u_memory.h"
37*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_context.h"
40*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_cb_texture.h"
41*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_texture.h"
42*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_sampler_view.h"
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker /**
45*61046927SAndroid Build Coastguard Worker  * Return the gl_texture_handle_object for a given 64-bit handle.
46*61046927SAndroid Build Coastguard Worker  */
47*61046927SAndroid Build Coastguard Worker static struct gl_texture_handle_object *
lookup_texture_handle(struct gl_context * ctx,GLuint64 id)48*61046927SAndroid Build Coastguard Worker lookup_texture_handle(struct gl_context *ctx, GLuint64 id)
49*61046927SAndroid Build Coastguard Worker {
50*61046927SAndroid Build Coastguard Worker    struct gl_texture_handle_object *texHandleObj;
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker    mtx_lock(&ctx->Shared->HandlesMutex);
53*61046927SAndroid Build Coastguard Worker    texHandleObj = (struct gl_texture_handle_object *)
54*61046927SAndroid Build Coastguard Worker       _mesa_hash_table_u64_search(ctx->Shared->TextureHandles, id);
55*61046927SAndroid Build Coastguard Worker    mtx_unlock(&ctx->Shared->HandlesMutex);
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker    return texHandleObj;
58*61046927SAndroid Build Coastguard Worker }
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker /**
61*61046927SAndroid Build Coastguard Worker  * Return the gl_image_handle_object for a given 64-bit handle.
62*61046927SAndroid Build Coastguard Worker  */
63*61046927SAndroid Build Coastguard Worker static struct gl_image_handle_object *
lookup_image_handle(struct gl_context * ctx,GLuint64 id)64*61046927SAndroid Build Coastguard Worker lookup_image_handle(struct gl_context *ctx, GLuint64 id)
65*61046927SAndroid Build Coastguard Worker {
66*61046927SAndroid Build Coastguard Worker    struct gl_image_handle_object *imgHandleObj;
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker    mtx_lock(&ctx->Shared->HandlesMutex);
69*61046927SAndroid Build Coastguard Worker    imgHandleObj = (struct gl_image_handle_object *)
70*61046927SAndroid Build Coastguard Worker       _mesa_hash_table_u64_search(ctx->Shared->ImageHandles, id);
71*61046927SAndroid Build Coastguard Worker    mtx_unlock(&ctx->Shared->HandlesMutex);
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker    return imgHandleObj;
74*61046927SAndroid Build Coastguard Worker }
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker /**
77*61046927SAndroid Build Coastguard Worker  * Delete a texture handle in the shared state.
78*61046927SAndroid Build Coastguard Worker  */
79*61046927SAndroid Build Coastguard Worker static void
delete_texture_handle(struct gl_context * ctx,GLuint64 id)80*61046927SAndroid Build Coastguard Worker delete_texture_handle(struct gl_context *ctx, GLuint64 id)
81*61046927SAndroid Build Coastguard Worker {
82*61046927SAndroid Build Coastguard Worker    mtx_lock(&ctx->Shared->HandlesMutex);
83*61046927SAndroid Build Coastguard Worker    _mesa_hash_table_u64_remove(ctx->Shared->TextureHandles, id);
84*61046927SAndroid Build Coastguard Worker    mtx_unlock(&ctx->Shared->HandlesMutex);
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker    ctx->pipe->delete_texture_handle(ctx->pipe, id);
87*61046927SAndroid Build Coastguard Worker }
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker /**
90*61046927SAndroid Build Coastguard Worker  * Delete an image handle in the shared state.
91*61046927SAndroid Build Coastguard Worker  */
92*61046927SAndroid Build Coastguard Worker static void
delete_image_handle(struct gl_context * ctx,GLuint64 id)93*61046927SAndroid Build Coastguard Worker delete_image_handle(struct gl_context *ctx, GLuint64 id)
94*61046927SAndroid Build Coastguard Worker {
95*61046927SAndroid Build Coastguard Worker    mtx_lock(&ctx->Shared->HandlesMutex);
96*61046927SAndroid Build Coastguard Worker    _mesa_hash_table_u64_remove(ctx->Shared->ImageHandles, id);
97*61046927SAndroid Build Coastguard Worker    mtx_unlock(&ctx->Shared->HandlesMutex);
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker    ctx->pipe->delete_image_handle(ctx->pipe, id);
100*61046927SAndroid Build Coastguard Worker }
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker /**
103*61046927SAndroid Build Coastguard Worker  * Return TRUE if the texture handle is resident in the current context.
104*61046927SAndroid Build Coastguard Worker  */
105*61046927SAndroid Build Coastguard Worker static inline bool
is_texture_handle_resident(struct gl_context * ctx,GLuint64 handle)106*61046927SAndroid Build Coastguard Worker is_texture_handle_resident(struct gl_context *ctx, GLuint64 handle)
107*61046927SAndroid Build Coastguard Worker {
108*61046927SAndroid Build Coastguard Worker    return _mesa_hash_table_u64_search(ctx->ResidentTextureHandles,
109*61046927SAndroid Build Coastguard Worker                                       handle) != NULL;
110*61046927SAndroid Build Coastguard Worker }
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker /**
113*61046927SAndroid Build Coastguard Worker  * Return TRUE if the image handle is resident in the current context.
114*61046927SAndroid Build Coastguard Worker  */
115*61046927SAndroid Build Coastguard Worker static inline bool
is_image_handle_resident(struct gl_context * ctx,GLuint64 handle)116*61046927SAndroid Build Coastguard Worker is_image_handle_resident(struct gl_context *ctx, GLuint64 handle)
117*61046927SAndroid Build Coastguard Worker {
118*61046927SAndroid Build Coastguard Worker    return _mesa_hash_table_u64_search(ctx->ResidentImageHandles,
119*61046927SAndroid Build Coastguard Worker                                       handle) != NULL;
120*61046927SAndroid Build Coastguard Worker }
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker /**
123*61046927SAndroid Build Coastguard Worker  * Make a texture handle resident/non-resident in the current context.
124*61046927SAndroid Build Coastguard Worker  */
125*61046927SAndroid Build Coastguard Worker static void
make_texture_handle_resident(struct gl_context * ctx,struct gl_texture_handle_object * texHandleObj,bool resident)126*61046927SAndroid Build Coastguard Worker make_texture_handle_resident(struct gl_context *ctx,
127*61046927SAndroid Build Coastguard Worker                              struct gl_texture_handle_object *texHandleObj,
128*61046927SAndroid Build Coastguard Worker                              bool resident)
129*61046927SAndroid Build Coastguard Worker {
130*61046927SAndroid Build Coastguard Worker    struct gl_sampler_object *sampObj = NULL;
131*61046927SAndroid Build Coastguard Worker    struct gl_texture_object *texObj = NULL;
132*61046927SAndroid Build Coastguard Worker    GLuint64 handle = texHandleObj->handle;
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker    if (resident) {
135*61046927SAndroid Build Coastguard Worker       assert(!is_texture_handle_resident(ctx, handle));
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker       _mesa_hash_table_u64_insert(ctx->ResidentTextureHandles, handle,
138*61046927SAndroid Build Coastguard Worker                                   texHandleObj);
139*61046927SAndroid Build Coastguard Worker 
140*61046927SAndroid Build Coastguard Worker       ctx->pipe->make_texture_handle_resident(ctx->pipe, handle, GL_TRUE);
141*61046927SAndroid Build Coastguard Worker 
142*61046927SAndroid Build Coastguard Worker       /* Reference the texture object (and the separate sampler if needed) to
143*61046927SAndroid Build Coastguard Worker        * be sure it won't be deleted until it is not bound anywhere and there
144*61046927SAndroid Build Coastguard Worker        * are no handles using the object that are resident in any context.
145*61046927SAndroid Build Coastguard Worker        */
146*61046927SAndroid Build Coastguard Worker       _mesa_reference_texobj(&texObj, texHandleObj->texObj);
147*61046927SAndroid Build Coastguard Worker       if (texHandleObj->sampObj)
148*61046927SAndroid Build Coastguard Worker          _mesa_reference_sampler_object(ctx, &sampObj, texHandleObj->sampObj);
149*61046927SAndroid Build Coastguard Worker    } else {
150*61046927SAndroid Build Coastguard Worker       assert(is_texture_handle_resident(ctx, handle));
151*61046927SAndroid Build Coastguard Worker 
152*61046927SAndroid Build Coastguard Worker       _mesa_hash_table_u64_remove(ctx->ResidentTextureHandles, handle);
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker       ctx->pipe->make_texture_handle_resident(ctx->pipe, handle, GL_FALSE);
155*61046927SAndroid Build Coastguard Worker 
156*61046927SAndroid Build Coastguard Worker       /* Unreference the texture object but keep the pointer intact, if
157*61046927SAndroid Build Coastguard Worker        * refcount hits zero, the texture and all handles will be deleted.
158*61046927SAndroid Build Coastguard Worker        */
159*61046927SAndroid Build Coastguard Worker       texObj = texHandleObj->texObj;
160*61046927SAndroid Build Coastguard Worker       _mesa_reference_texobj(&texObj, NULL);
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker       /* Unreference the separate sampler object but keep the pointer intact,
163*61046927SAndroid Build Coastguard Worker        * if refcount hits zero, the sampler and all handles will be deleted.
164*61046927SAndroid Build Coastguard Worker        */
165*61046927SAndroid Build Coastguard Worker       if (texHandleObj->sampObj) {
166*61046927SAndroid Build Coastguard Worker          sampObj = texHandleObj->sampObj;
167*61046927SAndroid Build Coastguard Worker          _mesa_reference_sampler_object(ctx, &sampObj, NULL);
168*61046927SAndroid Build Coastguard Worker       }
169*61046927SAndroid Build Coastguard Worker    }
170*61046927SAndroid Build Coastguard Worker }
171*61046927SAndroid Build Coastguard Worker 
172*61046927SAndroid Build Coastguard Worker /**
173*61046927SAndroid Build Coastguard Worker  * Make an image handle resident/non-resident in the current context.
174*61046927SAndroid Build Coastguard Worker  */
175*61046927SAndroid Build Coastguard Worker static void
make_image_handle_resident(struct gl_context * ctx,struct gl_image_handle_object * imgHandleObj,GLenum access,bool resident)176*61046927SAndroid Build Coastguard Worker make_image_handle_resident(struct gl_context *ctx,
177*61046927SAndroid Build Coastguard Worker                            struct gl_image_handle_object *imgHandleObj,
178*61046927SAndroid Build Coastguard Worker                            GLenum access, bool resident)
179*61046927SAndroid Build Coastguard Worker {
180*61046927SAndroid Build Coastguard Worker    struct gl_texture_object *texObj = NULL;
181*61046927SAndroid Build Coastguard Worker    GLuint64 handle = imgHandleObj->handle;
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker    if (resident) {
184*61046927SAndroid Build Coastguard Worker       assert(!is_image_handle_resident(ctx, handle));
185*61046927SAndroid Build Coastguard Worker 
186*61046927SAndroid Build Coastguard Worker       _mesa_hash_table_u64_insert(ctx->ResidentImageHandles, handle,
187*61046927SAndroid Build Coastguard Worker                                   imgHandleObj);
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker       ctx->pipe->make_image_handle_resident(ctx->pipe, handle, access, GL_TRUE);
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker       /* Reference the texture object to be sure it won't be deleted until it
192*61046927SAndroid Build Coastguard Worker        * is not bound anywhere and there are no handles using the object that
193*61046927SAndroid Build Coastguard Worker        * are resident in any context.
194*61046927SAndroid Build Coastguard Worker        */
195*61046927SAndroid Build Coastguard Worker       _mesa_reference_texobj(&texObj, imgHandleObj->imgObj.TexObj);
196*61046927SAndroid Build Coastguard Worker    } else {
197*61046927SAndroid Build Coastguard Worker       assert(is_image_handle_resident(ctx, handle));
198*61046927SAndroid Build Coastguard Worker 
199*61046927SAndroid Build Coastguard Worker       _mesa_hash_table_u64_remove(ctx->ResidentImageHandles, handle);
200*61046927SAndroid Build Coastguard Worker 
201*61046927SAndroid Build Coastguard Worker       ctx->pipe->make_image_handle_resident(ctx->pipe, handle, access, GL_FALSE);
202*61046927SAndroid Build Coastguard Worker 
203*61046927SAndroid Build Coastguard Worker       /* Unreference the texture object but keep the pointer intact, if
204*61046927SAndroid Build Coastguard Worker        * refcount hits zero, the texture and all handles will be deleted.
205*61046927SAndroid Build Coastguard Worker        */
206*61046927SAndroid Build Coastguard Worker       texObj = imgHandleObj->imgObj.TexObj;
207*61046927SAndroid Build Coastguard Worker       _mesa_reference_texobj(&texObj, NULL);
208*61046927SAndroid Build Coastguard Worker    }
209*61046927SAndroid Build Coastguard Worker }
210*61046927SAndroid Build Coastguard Worker 
211*61046927SAndroid Build Coastguard Worker static struct gl_texture_handle_object *
find_texhandleobj(struct gl_texture_object * texObj,struct gl_sampler_object * sampObj)212*61046927SAndroid Build Coastguard Worker find_texhandleobj(struct gl_texture_object *texObj,
213*61046927SAndroid Build Coastguard Worker                   struct gl_sampler_object *sampObj)
214*61046927SAndroid Build Coastguard Worker {
215*61046927SAndroid Build Coastguard Worker    util_dynarray_foreach(&texObj->SamplerHandles,
216*61046927SAndroid Build Coastguard Worker                          struct gl_texture_handle_object *, texHandleObj) {
217*61046927SAndroid Build Coastguard Worker       if ((*texHandleObj)->sampObj == sampObj)
218*61046927SAndroid Build Coastguard Worker          return *texHandleObj;
219*61046927SAndroid Build Coastguard Worker    }
220*61046927SAndroid Build Coastguard Worker    return NULL;
221*61046927SAndroid Build Coastguard Worker }
222*61046927SAndroid Build Coastguard Worker 
223*61046927SAndroid Build Coastguard Worker static GLuint64
new_texture_handle(struct gl_context * ctx,struct gl_texture_object * texObj,struct gl_sampler_object * sampObj)224*61046927SAndroid Build Coastguard Worker new_texture_handle(struct gl_context *ctx, struct gl_texture_object *texObj,
225*61046927SAndroid Build Coastguard Worker                    struct gl_sampler_object *sampObj)
226*61046927SAndroid Build Coastguard Worker {
227*61046927SAndroid Build Coastguard Worker    struct st_context *st = st_context(ctx);
228*61046927SAndroid Build Coastguard Worker    struct pipe_context *pipe = ctx->pipe;
229*61046927SAndroid Build Coastguard Worker    struct pipe_sampler_view *view;
230*61046927SAndroid Build Coastguard Worker    struct pipe_sampler_state sampler = {0};
231*61046927SAndroid Build Coastguard Worker 
232*61046927SAndroid Build Coastguard Worker    if (texObj->Target != GL_TEXTURE_BUFFER) {
233*61046927SAndroid Build Coastguard Worker       if (!st_finalize_texture(ctx, pipe, texObj, 0))
234*61046927SAndroid Build Coastguard Worker          return 0;
235*61046927SAndroid Build Coastguard Worker 
236*61046927SAndroid Build Coastguard Worker       st_convert_sampler(st, texObj, sampObj, 0, &sampler, false, false, true);
237*61046927SAndroid Build Coastguard Worker 
238*61046927SAndroid Build Coastguard Worker       /* TODO: Clarify the interaction of ARB_bindless_texture and EXT_texture_sRGB_decode */
239*61046927SAndroid Build Coastguard Worker       view = st_get_texture_sampler_view_from_stobj(st, texObj, sampObj, 0,
240*61046927SAndroid Build Coastguard Worker                                                     true, false);
241*61046927SAndroid Build Coastguard Worker    } else {
242*61046927SAndroid Build Coastguard Worker       view = st_get_buffer_sampler_view_from_stobj(st, texObj, false);
243*61046927SAndroid Build Coastguard Worker       sampler.unnormalized_coords = 0;
244*61046927SAndroid Build Coastguard Worker    }
245*61046927SAndroid Build Coastguard Worker 
246*61046927SAndroid Build Coastguard Worker    return pipe->create_texture_handle(pipe, view, &sampler);
247*61046927SAndroid Build Coastguard Worker }
248*61046927SAndroid Build Coastguard Worker 
249*61046927SAndroid Build Coastguard Worker static GLuint64
get_texture_handle(struct gl_context * ctx,struct gl_texture_object * texObj,struct gl_sampler_object * sampObj)250*61046927SAndroid Build Coastguard Worker get_texture_handle(struct gl_context *ctx, struct gl_texture_object *texObj,
251*61046927SAndroid Build Coastguard Worker                    struct gl_sampler_object *sampObj)
252*61046927SAndroid Build Coastguard Worker {
253*61046927SAndroid Build Coastguard Worker    bool separate_sampler = &texObj->Sampler != sampObj;
254*61046927SAndroid Build Coastguard Worker    struct gl_texture_handle_object *texHandleObj;
255*61046927SAndroid Build Coastguard Worker    GLuint64 handle;
256*61046927SAndroid Build Coastguard Worker 
257*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
258*61046927SAndroid Build Coastguard Worker     *
259*61046927SAndroid Build Coastguard Worker     * "The handle for each texture or texture/sampler pair is unique; the same
260*61046927SAndroid Build Coastguard Worker     *  handle will be returned if GetTextureHandleARB is called multiple times
261*61046927SAndroid Build Coastguard Worker     *  for the same texture or if GetTextureSamplerHandleARB is called multiple
262*61046927SAndroid Build Coastguard Worker     *  times for the same texture/sampler pair."
263*61046927SAndroid Build Coastguard Worker     */
264*61046927SAndroid Build Coastguard Worker    mtx_lock(&ctx->Shared->HandlesMutex);
265*61046927SAndroid Build Coastguard Worker    texHandleObj = find_texhandleobj(texObj, separate_sampler ? sampObj : NULL);
266*61046927SAndroid Build Coastguard Worker    if (texHandleObj) {
267*61046927SAndroid Build Coastguard Worker       mtx_unlock(&ctx->Shared->HandlesMutex);
268*61046927SAndroid Build Coastguard Worker       return texHandleObj->handle;
269*61046927SAndroid Build Coastguard Worker    }
270*61046927SAndroid Build Coastguard Worker 
271*61046927SAndroid Build Coastguard Worker    /* Request a new texture handle from the driver. */
272*61046927SAndroid Build Coastguard Worker    handle = new_texture_handle(ctx, texObj, sampObj);
273*61046927SAndroid Build Coastguard Worker    if (!handle) {
274*61046927SAndroid Build Coastguard Worker       mtx_unlock(&ctx->Shared->HandlesMutex);
275*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGetTexture*HandleARB()");
276*61046927SAndroid Build Coastguard Worker       return 0;
277*61046927SAndroid Build Coastguard Worker    }
278*61046927SAndroid Build Coastguard Worker 
279*61046927SAndroid Build Coastguard Worker    texHandleObj = CALLOC_STRUCT(gl_texture_handle_object);
280*61046927SAndroid Build Coastguard Worker    if (!texHandleObj) {
281*61046927SAndroid Build Coastguard Worker       mtx_unlock(&ctx->Shared->HandlesMutex);
282*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGetTexture*HandleARB()");
283*61046927SAndroid Build Coastguard Worker       return 0;
284*61046927SAndroid Build Coastguard Worker    }
285*61046927SAndroid Build Coastguard Worker 
286*61046927SAndroid Build Coastguard Worker    /* Store the handle into the texture object. */
287*61046927SAndroid Build Coastguard Worker    texHandleObj->texObj = texObj;
288*61046927SAndroid Build Coastguard Worker    texHandleObj->sampObj = separate_sampler ? sampObj : NULL;
289*61046927SAndroid Build Coastguard Worker    texHandleObj->handle = handle;
290*61046927SAndroid Build Coastguard Worker    util_dynarray_append(&texObj->SamplerHandles,
291*61046927SAndroid Build Coastguard Worker                         struct gl_texture_handle_object *, texHandleObj);
292*61046927SAndroid Build Coastguard Worker 
293*61046927SAndroid Build Coastguard Worker    if (separate_sampler) {
294*61046927SAndroid Build Coastguard Worker       /* Store the handle into the separate sampler if needed. */
295*61046927SAndroid Build Coastguard Worker       util_dynarray_append(&sampObj->Handles,
296*61046927SAndroid Build Coastguard Worker                            struct gl_texture_handle_object *, texHandleObj);
297*61046927SAndroid Build Coastguard Worker    }
298*61046927SAndroid Build Coastguard Worker 
299*61046927SAndroid Build Coastguard Worker    /* When referenced by one or more handles, texture objects are immutable. */
300*61046927SAndroid Build Coastguard Worker    texObj->HandleAllocated = true;
301*61046927SAndroid Build Coastguard Worker    if (texObj->Target == GL_TEXTURE_BUFFER)
302*61046927SAndroid Build Coastguard Worker       texObj->BufferObject->HandleAllocated = true;
303*61046927SAndroid Build Coastguard Worker    sampObj->HandleAllocated = true;
304*61046927SAndroid Build Coastguard Worker 
305*61046927SAndroid Build Coastguard Worker    /* Store the handle in the shared state for all contexts. */
306*61046927SAndroid Build Coastguard Worker    _mesa_hash_table_u64_insert(ctx->Shared->TextureHandles, handle,
307*61046927SAndroid Build Coastguard Worker                                texHandleObj);
308*61046927SAndroid Build Coastguard Worker    mtx_unlock(&ctx->Shared->HandlesMutex);
309*61046927SAndroid Build Coastguard Worker 
310*61046927SAndroid Build Coastguard Worker    return handle;
311*61046927SAndroid Build Coastguard Worker }
312*61046927SAndroid Build Coastguard Worker 
313*61046927SAndroid Build Coastguard Worker static struct gl_image_handle_object *
find_imghandleobj(struct gl_texture_object * texObj,GLint level,GLboolean layered,GLint layer,GLenum format)314*61046927SAndroid Build Coastguard Worker find_imghandleobj(struct gl_texture_object *texObj, GLint level,
315*61046927SAndroid Build Coastguard Worker                   GLboolean layered, GLint layer, GLenum format)
316*61046927SAndroid Build Coastguard Worker {
317*61046927SAndroid Build Coastguard Worker    util_dynarray_foreach(&texObj->ImageHandles,
318*61046927SAndroid Build Coastguard Worker                          struct gl_image_handle_object *, imgHandleObj) {
319*61046927SAndroid Build Coastguard Worker       struct gl_image_unit *u = &(*imgHandleObj)->imgObj;
320*61046927SAndroid Build Coastguard Worker 
321*61046927SAndroid Build Coastguard Worker       if (u->TexObj == texObj && u->Level == level && u->Layered == layered &&
322*61046927SAndroid Build Coastguard Worker           u->Layer == layer && u->Format == format)
323*61046927SAndroid Build Coastguard Worker          return *imgHandleObj;
324*61046927SAndroid Build Coastguard Worker    }
325*61046927SAndroid Build Coastguard Worker    return NULL;
326*61046927SAndroid Build Coastguard Worker }
327*61046927SAndroid Build Coastguard Worker 
328*61046927SAndroid Build Coastguard Worker static GLuint64
get_image_handle(struct gl_context * ctx,struct gl_texture_object * texObj,GLint level,GLboolean layered,GLint layer,GLenum format)329*61046927SAndroid Build Coastguard Worker get_image_handle(struct gl_context *ctx, struct gl_texture_object *texObj,
330*61046927SAndroid Build Coastguard Worker                  GLint level, GLboolean layered, GLint layer, GLenum format)
331*61046927SAndroid Build Coastguard Worker {
332*61046927SAndroid Build Coastguard Worker    struct gl_image_handle_object *imgHandleObj;
333*61046927SAndroid Build Coastguard Worker    struct gl_image_unit imgObj;
334*61046927SAndroid Build Coastguard Worker    GLuint64 handle;
335*61046927SAndroid Build Coastguard Worker 
336*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
337*61046927SAndroid Build Coastguard Worker     *
338*61046927SAndroid Build Coastguard Worker     * "The handle returned for each combination of <texture>, <level>,
339*61046927SAndroid Build Coastguard Worker     * <layered>, <layer>, and <format> is unique; the same handle will be
340*61046927SAndroid Build Coastguard Worker     * returned if GetImageHandleARB is called multiple times with the same
341*61046927SAndroid Build Coastguard Worker     * parameters."
342*61046927SAndroid Build Coastguard Worker     */
343*61046927SAndroid Build Coastguard Worker    mtx_lock(&ctx->Shared->HandlesMutex);
344*61046927SAndroid Build Coastguard Worker    imgHandleObj = find_imghandleobj(texObj, level, layered, layer, format);
345*61046927SAndroid Build Coastguard Worker    if (imgHandleObj) {
346*61046927SAndroid Build Coastguard Worker       mtx_unlock(&ctx->Shared->HandlesMutex);
347*61046927SAndroid Build Coastguard Worker       return imgHandleObj->handle;
348*61046927SAndroid Build Coastguard Worker    }
349*61046927SAndroid Build Coastguard Worker 
350*61046927SAndroid Build Coastguard Worker    imgObj.TexObj = texObj; /* weak reference */
351*61046927SAndroid Build Coastguard Worker    imgObj.Level = level;
352*61046927SAndroid Build Coastguard Worker    imgObj.Access = GL_READ_WRITE;
353*61046927SAndroid Build Coastguard Worker    imgObj.Format = format;
354*61046927SAndroid Build Coastguard Worker    imgObj._ActualFormat = _mesa_get_shader_image_format(format);
355*61046927SAndroid Build Coastguard Worker 
356*61046927SAndroid Build Coastguard Worker    if (_mesa_tex_target_is_layered(texObj->Target)) {
357*61046927SAndroid Build Coastguard Worker       imgObj.Layered = layered;
358*61046927SAndroid Build Coastguard Worker       imgObj.Layer = layer;
359*61046927SAndroid Build Coastguard Worker       imgObj._Layer = (imgObj.Layered ? 0 : imgObj.Layer);
360*61046927SAndroid Build Coastguard Worker    } else {
361*61046927SAndroid Build Coastguard Worker       imgObj.Layered = GL_FALSE;
362*61046927SAndroid Build Coastguard Worker       imgObj.Layer = 0;
363*61046927SAndroid Build Coastguard Worker       imgObj._Layer = 0;
364*61046927SAndroid Build Coastguard Worker    }
365*61046927SAndroid Build Coastguard Worker 
366*61046927SAndroid Build Coastguard Worker    /* Request a new image handle from the driver. */
367*61046927SAndroid Build Coastguard Worker    struct pipe_image_view image;
368*61046927SAndroid Build Coastguard Worker    st_convert_image(st_context(ctx), &imgObj, &image, 0);
369*61046927SAndroid Build Coastguard Worker    handle = ctx->pipe->create_image_handle(ctx->pipe, &image);
370*61046927SAndroid Build Coastguard Worker    if (!handle) {
371*61046927SAndroid Build Coastguard Worker       mtx_unlock(&ctx->Shared->HandlesMutex);
372*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGetImageHandleARB()");
373*61046927SAndroid Build Coastguard Worker       return 0;
374*61046927SAndroid Build Coastguard Worker    }
375*61046927SAndroid Build Coastguard Worker 
376*61046927SAndroid Build Coastguard Worker    imgHandleObj = CALLOC_STRUCT(gl_image_handle_object);
377*61046927SAndroid Build Coastguard Worker    if (!imgHandleObj) {
378*61046927SAndroid Build Coastguard Worker       mtx_unlock(&ctx->Shared->HandlesMutex);
379*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGetImageHandleARB()");
380*61046927SAndroid Build Coastguard Worker       return 0;
381*61046927SAndroid Build Coastguard Worker    }
382*61046927SAndroid Build Coastguard Worker 
383*61046927SAndroid Build Coastguard Worker    /* Store the handle into the texture object. */
384*61046927SAndroid Build Coastguard Worker    memcpy(&imgHandleObj->imgObj, &imgObj, sizeof(struct gl_image_unit));
385*61046927SAndroid Build Coastguard Worker    imgHandleObj->handle = handle;
386*61046927SAndroid Build Coastguard Worker    util_dynarray_append(&texObj->ImageHandles,
387*61046927SAndroid Build Coastguard Worker                         struct gl_image_handle_object *, imgHandleObj);
388*61046927SAndroid Build Coastguard Worker 
389*61046927SAndroid Build Coastguard Worker    /* When referenced by one or more handles, texture objects are immutable. */
390*61046927SAndroid Build Coastguard Worker    texObj->HandleAllocated = true;
391*61046927SAndroid Build Coastguard Worker    if (texObj->Target == GL_TEXTURE_BUFFER)
392*61046927SAndroid Build Coastguard Worker       texObj->BufferObject->HandleAllocated = true;
393*61046927SAndroid Build Coastguard Worker    texObj->Sampler.HandleAllocated = true;
394*61046927SAndroid Build Coastguard Worker 
395*61046927SAndroid Build Coastguard Worker    /* Store the handle in the shared state for all contexts. */
396*61046927SAndroid Build Coastguard Worker    _mesa_hash_table_u64_insert(ctx->Shared->ImageHandles, handle, imgHandleObj);
397*61046927SAndroid Build Coastguard Worker    mtx_unlock(&ctx->Shared->HandlesMutex);
398*61046927SAndroid Build Coastguard Worker 
399*61046927SAndroid Build Coastguard Worker    return handle;
400*61046927SAndroid Build Coastguard Worker }
401*61046927SAndroid Build Coastguard Worker 
402*61046927SAndroid Build Coastguard Worker /**
403*61046927SAndroid Build Coastguard Worker  * Init/free per-context resident handles.
404*61046927SAndroid Build Coastguard Worker  */
405*61046927SAndroid Build Coastguard Worker void
_mesa_init_resident_handles(struct gl_context * ctx)406*61046927SAndroid Build Coastguard Worker _mesa_init_resident_handles(struct gl_context *ctx)
407*61046927SAndroid Build Coastguard Worker {
408*61046927SAndroid Build Coastguard Worker    ctx->ResidentTextureHandles = _mesa_hash_table_u64_create(NULL);
409*61046927SAndroid Build Coastguard Worker    ctx->ResidentImageHandles = _mesa_hash_table_u64_create(NULL);
410*61046927SAndroid Build Coastguard Worker }
411*61046927SAndroid Build Coastguard Worker 
412*61046927SAndroid Build Coastguard Worker void
_mesa_free_resident_handles(struct gl_context * ctx)413*61046927SAndroid Build Coastguard Worker _mesa_free_resident_handles(struct gl_context *ctx)
414*61046927SAndroid Build Coastguard Worker {
415*61046927SAndroid Build Coastguard Worker    _mesa_hash_table_u64_destroy(ctx->ResidentTextureHandles);
416*61046927SAndroid Build Coastguard Worker    _mesa_hash_table_u64_destroy(ctx->ResidentImageHandles);
417*61046927SAndroid Build Coastguard Worker }
418*61046927SAndroid Build Coastguard Worker 
419*61046927SAndroid Build Coastguard Worker /**
420*61046927SAndroid Build Coastguard Worker  * Init/free shared allocated handles.
421*61046927SAndroid Build Coastguard Worker  */
422*61046927SAndroid Build Coastguard Worker void
_mesa_init_shared_handles(struct gl_shared_state * shared)423*61046927SAndroid Build Coastguard Worker _mesa_init_shared_handles(struct gl_shared_state *shared)
424*61046927SAndroid Build Coastguard Worker {
425*61046927SAndroid Build Coastguard Worker    shared->TextureHandles = _mesa_hash_table_u64_create(NULL);
426*61046927SAndroid Build Coastguard Worker    shared->ImageHandles = _mesa_hash_table_u64_create(NULL);
427*61046927SAndroid Build Coastguard Worker    mtx_init(&shared->HandlesMutex, mtx_plain | mtx_recursive);
428*61046927SAndroid Build Coastguard Worker }
429*61046927SAndroid Build Coastguard Worker 
430*61046927SAndroid Build Coastguard Worker void
_mesa_free_shared_handles(struct gl_shared_state * shared)431*61046927SAndroid Build Coastguard Worker _mesa_free_shared_handles(struct gl_shared_state *shared)
432*61046927SAndroid Build Coastguard Worker {
433*61046927SAndroid Build Coastguard Worker    if (shared->TextureHandles)
434*61046927SAndroid Build Coastguard Worker       _mesa_hash_table_u64_destroy(shared->TextureHandles);
435*61046927SAndroid Build Coastguard Worker 
436*61046927SAndroid Build Coastguard Worker    if (shared->ImageHandles)
437*61046927SAndroid Build Coastguard Worker       _mesa_hash_table_u64_destroy(shared->ImageHandles);
438*61046927SAndroid Build Coastguard Worker 
439*61046927SAndroid Build Coastguard Worker    mtx_destroy(&shared->HandlesMutex);
440*61046927SAndroid Build Coastguard Worker }
441*61046927SAndroid Build Coastguard Worker 
442*61046927SAndroid Build Coastguard Worker /**
443*61046927SAndroid Build Coastguard Worker  * Init/free texture/image handles per-texture object.
444*61046927SAndroid Build Coastguard Worker  */
445*61046927SAndroid Build Coastguard Worker void
_mesa_init_texture_handles(struct gl_texture_object * texObj)446*61046927SAndroid Build Coastguard Worker _mesa_init_texture_handles(struct gl_texture_object *texObj)
447*61046927SAndroid Build Coastguard Worker {
448*61046927SAndroid Build Coastguard Worker    util_dynarray_init(&texObj->SamplerHandles, NULL);
449*61046927SAndroid Build Coastguard Worker    util_dynarray_init(&texObj->ImageHandles, NULL);
450*61046927SAndroid Build Coastguard Worker }
451*61046927SAndroid Build Coastguard Worker 
452*61046927SAndroid Build Coastguard Worker void
_mesa_make_texture_handles_non_resident(struct gl_context * ctx,struct gl_texture_object * texObj)453*61046927SAndroid Build Coastguard Worker _mesa_make_texture_handles_non_resident(struct gl_context *ctx,
454*61046927SAndroid Build Coastguard Worker                                         struct gl_texture_object *texObj)
455*61046927SAndroid Build Coastguard Worker {
456*61046927SAndroid Build Coastguard Worker    mtx_lock(&ctx->Shared->HandlesMutex);
457*61046927SAndroid Build Coastguard Worker 
458*61046927SAndroid Build Coastguard Worker    /* Texture handles */
459*61046927SAndroid Build Coastguard Worker    util_dynarray_foreach(&texObj->SamplerHandles,
460*61046927SAndroid Build Coastguard Worker                          struct gl_texture_handle_object *, texHandleObj) {
461*61046927SAndroid Build Coastguard Worker       if (is_texture_handle_resident(ctx, (*texHandleObj)->handle))
462*61046927SAndroid Build Coastguard Worker          make_texture_handle_resident(ctx, *texHandleObj, false);
463*61046927SAndroid Build Coastguard Worker    }
464*61046927SAndroid Build Coastguard Worker 
465*61046927SAndroid Build Coastguard Worker    /* Image handles */
466*61046927SAndroid Build Coastguard Worker    util_dynarray_foreach(&texObj->ImageHandles,
467*61046927SAndroid Build Coastguard Worker                          struct gl_image_handle_object *, imgHandleObj) {
468*61046927SAndroid Build Coastguard Worker       if (is_image_handle_resident(ctx, (*imgHandleObj)->handle))
469*61046927SAndroid Build Coastguard Worker          make_image_handle_resident(ctx, *imgHandleObj, GL_READ_ONLY, false);
470*61046927SAndroid Build Coastguard Worker    }
471*61046927SAndroid Build Coastguard Worker 
472*61046927SAndroid Build Coastguard Worker    mtx_unlock(&ctx->Shared->HandlesMutex);
473*61046927SAndroid Build Coastguard Worker }
474*61046927SAndroid Build Coastguard Worker 
475*61046927SAndroid Build Coastguard Worker void
_mesa_delete_texture_handles(struct gl_context * ctx,struct gl_texture_object * texObj)476*61046927SAndroid Build Coastguard Worker _mesa_delete_texture_handles(struct gl_context *ctx,
477*61046927SAndroid Build Coastguard Worker                              struct gl_texture_object *texObj)
478*61046927SAndroid Build Coastguard Worker {
479*61046927SAndroid Build Coastguard Worker    /* Texture handles */
480*61046927SAndroid Build Coastguard Worker    util_dynarray_foreach(&texObj->SamplerHandles,
481*61046927SAndroid Build Coastguard Worker                          struct gl_texture_handle_object *, texHandleObj) {
482*61046927SAndroid Build Coastguard Worker       struct gl_sampler_object *sampObj = (*texHandleObj)->sampObj;
483*61046927SAndroid Build Coastguard Worker 
484*61046927SAndroid Build Coastguard Worker       if (sampObj) {
485*61046927SAndroid Build Coastguard Worker          /* Delete the handle in the separate sampler object. */
486*61046927SAndroid Build Coastguard Worker          util_dynarray_delete_unordered(&sampObj->Handles,
487*61046927SAndroid Build Coastguard Worker                                         struct gl_texture_handle_object *,
488*61046927SAndroid Build Coastguard Worker                                         *texHandleObj);
489*61046927SAndroid Build Coastguard Worker       }
490*61046927SAndroid Build Coastguard Worker       delete_texture_handle(ctx, (*texHandleObj)->handle);
491*61046927SAndroid Build Coastguard Worker       FREE(*texHandleObj);
492*61046927SAndroid Build Coastguard Worker    }
493*61046927SAndroid Build Coastguard Worker    util_dynarray_fini(&texObj->SamplerHandles);
494*61046927SAndroid Build Coastguard Worker 
495*61046927SAndroid Build Coastguard Worker    /* Image handles */
496*61046927SAndroid Build Coastguard Worker    util_dynarray_foreach(&texObj->ImageHandles,
497*61046927SAndroid Build Coastguard Worker                          struct gl_image_handle_object *, imgHandleObj) {
498*61046927SAndroid Build Coastguard Worker       delete_image_handle(ctx, (*imgHandleObj)->handle);
499*61046927SAndroid Build Coastguard Worker       FREE(*imgHandleObj);
500*61046927SAndroid Build Coastguard Worker    }
501*61046927SAndroid Build Coastguard Worker    util_dynarray_fini(&texObj->ImageHandles);
502*61046927SAndroid Build Coastguard Worker }
503*61046927SAndroid Build Coastguard Worker 
504*61046927SAndroid Build Coastguard Worker /**
505*61046927SAndroid Build Coastguard Worker  * Init/free texture handles per-sampler object.
506*61046927SAndroid Build Coastguard Worker  */
507*61046927SAndroid Build Coastguard Worker void
_mesa_init_sampler_handles(struct gl_sampler_object * sampObj)508*61046927SAndroid Build Coastguard Worker _mesa_init_sampler_handles(struct gl_sampler_object *sampObj)
509*61046927SAndroid Build Coastguard Worker {
510*61046927SAndroid Build Coastguard Worker    util_dynarray_init(&sampObj->Handles, NULL);
511*61046927SAndroid Build Coastguard Worker }
512*61046927SAndroid Build Coastguard Worker 
513*61046927SAndroid Build Coastguard Worker void
_mesa_delete_sampler_handles(struct gl_context * ctx,struct gl_sampler_object * sampObj)514*61046927SAndroid Build Coastguard Worker _mesa_delete_sampler_handles(struct gl_context *ctx,
515*61046927SAndroid Build Coastguard Worker                              struct gl_sampler_object *sampObj)
516*61046927SAndroid Build Coastguard Worker {
517*61046927SAndroid Build Coastguard Worker    util_dynarray_foreach(&sampObj->Handles,
518*61046927SAndroid Build Coastguard Worker                          struct gl_texture_handle_object *, texHandleObj) {
519*61046927SAndroid Build Coastguard Worker       struct gl_texture_object *texObj = (*texHandleObj)->texObj;
520*61046927SAndroid Build Coastguard Worker 
521*61046927SAndroid Build Coastguard Worker       /* Delete the handle in the texture object. */
522*61046927SAndroid Build Coastguard Worker       util_dynarray_delete_unordered(&texObj->SamplerHandles,
523*61046927SAndroid Build Coastguard Worker                                      struct gl_texture_handle_object *,
524*61046927SAndroid Build Coastguard Worker                                      *texHandleObj);
525*61046927SAndroid Build Coastguard Worker 
526*61046927SAndroid Build Coastguard Worker       delete_texture_handle(ctx, (*texHandleObj)->handle);
527*61046927SAndroid Build Coastguard Worker       FREE(*texHandleObj);
528*61046927SAndroid Build Coastguard Worker    }
529*61046927SAndroid Build Coastguard Worker    util_dynarray_fini(&sampObj->Handles);
530*61046927SAndroid Build Coastguard Worker }
531*61046927SAndroid Build Coastguard Worker 
532*61046927SAndroid Build Coastguard Worker static GLboolean
is_sampler_border_color_valid(struct gl_sampler_object * samp)533*61046927SAndroid Build Coastguard Worker is_sampler_border_color_valid(struct gl_sampler_object *samp)
534*61046927SAndroid Build Coastguard Worker {
535*61046927SAndroid Build Coastguard Worker    static const GLfloat valid_float_border_colors[4][4] = {
536*61046927SAndroid Build Coastguard Worker       { 0.0, 0.0, 0.0, 0.0 },
537*61046927SAndroid Build Coastguard Worker       { 0.0, 0.0, 0.0, 1.0 },
538*61046927SAndroid Build Coastguard Worker       { 1.0, 1.0, 1.0, 0.0 },
539*61046927SAndroid Build Coastguard Worker       { 1.0, 1.0, 1.0, 1.0 },
540*61046927SAndroid Build Coastguard Worker    };
541*61046927SAndroid Build Coastguard Worker    static const GLint valid_integer_border_colors[4][4] = {
542*61046927SAndroid Build Coastguard Worker       { 0, 0, 0, 0 },
543*61046927SAndroid Build Coastguard Worker       { 0, 0, 0, 1 },
544*61046927SAndroid Build Coastguard Worker       { 1, 1, 1, 0 },
545*61046927SAndroid Build Coastguard Worker       { 1, 1, 1, 1 },
546*61046927SAndroid Build Coastguard Worker    };
547*61046927SAndroid Build Coastguard Worker    size_t size = sizeof(samp->Attrib.state.border_color.ui);
548*61046927SAndroid Build Coastguard Worker 
549*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
550*61046927SAndroid Build Coastguard Worker     *
551*61046927SAndroid Build Coastguard Worker     * "The error INVALID_OPERATION is generated if the border color (taken from
552*61046927SAndroid Build Coastguard Worker     *  the embedded sampler for GetTextureHandleARB or from the <sampler> for
553*61046927SAndroid Build Coastguard Worker     *  GetTextureSamplerHandleARB) is not one of the following allowed values.
554*61046927SAndroid Build Coastguard Worker     *  If the texture's base internal format is signed or unsigned integer,
555*61046927SAndroid Build Coastguard Worker     *  allowed values are (0,0,0,0), (0,0,0,1), (1,1,1,0), and (1,1,1,1). If
556*61046927SAndroid Build Coastguard Worker     *  the base internal format is not integer, allowed values are
557*61046927SAndroid Build Coastguard Worker     *  (0.0,0.0,0.0,0.0), (0.0,0.0,0.0,1.0), (1.0,1.0,1.0,0.0), and
558*61046927SAndroid Build Coastguard Worker     *  (1.0,1.0,1.0,1.0)."
559*61046927SAndroid Build Coastguard Worker     */
560*61046927SAndroid Build Coastguard Worker    if (!memcmp(samp->Attrib.state.border_color.f, valid_float_border_colors[0], size) ||
561*61046927SAndroid Build Coastguard Worker        !memcmp(samp->Attrib.state.border_color.f, valid_float_border_colors[1], size) ||
562*61046927SAndroid Build Coastguard Worker        !memcmp(samp->Attrib.state.border_color.f, valid_float_border_colors[2], size) ||
563*61046927SAndroid Build Coastguard Worker        !memcmp(samp->Attrib.state.border_color.f, valid_float_border_colors[3], size))
564*61046927SAndroid Build Coastguard Worker       return GL_TRUE;
565*61046927SAndroid Build Coastguard Worker 
566*61046927SAndroid Build Coastguard Worker    if (!memcmp(samp->Attrib.state.border_color.ui, valid_integer_border_colors[0], size) ||
567*61046927SAndroid Build Coastguard Worker        !memcmp(samp->Attrib.state.border_color.ui, valid_integer_border_colors[1], size) ||
568*61046927SAndroid Build Coastguard Worker        !memcmp(samp->Attrib.state.border_color.ui, valid_integer_border_colors[2], size) ||
569*61046927SAndroid Build Coastguard Worker        !memcmp(samp->Attrib.state.border_color.ui, valid_integer_border_colors[3], size))
570*61046927SAndroid Build Coastguard Worker       return GL_TRUE;
571*61046927SAndroid Build Coastguard Worker 
572*61046927SAndroid Build Coastguard Worker    return GL_FALSE;
573*61046927SAndroid Build Coastguard Worker }
574*61046927SAndroid Build Coastguard Worker 
575*61046927SAndroid Build Coastguard Worker GLuint64 GLAPIENTRY
_mesa_GetTextureHandleARB_no_error(GLuint texture)576*61046927SAndroid Build Coastguard Worker _mesa_GetTextureHandleARB_no_error(GLuint texture)
577*61046927SAndroid Build Coastguard Worker {
578*61046927SAndroid Build Coastguard Worker    struct gl_texture_object *texObj;
579*61046927SAndroid Build Coastguard Worker 
580*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
581*61046927SAndroid Build Coastguard Worker 
582*61046927SAndroid Build Coastguard Worker    texObj = _mesa_lookup_texture(ctx, texture);
583*61046927SAndroid Build Coastguard Worker    if (!_mesa_is_texture_complete(texObj, &texObj->Sampler,
584*61046927SAndroid Build Coastguard Worker                                   ctx->Const.ForceIntegerTexNearest))
585*61046927SAndroid Build Coastguard Worker       _mesa_test_texobj_completeness(ctx, texObj);
586*61046927SAndroid Build Coastguard Worker 
587*61046927SAndroid Build Coastguard Worker    return get_texture_handle(ctx, texObj, &texObj->Sampler);
588*61046927SAndroid Build Coastguard Worker }
589*61046927SAndroid Build Coastguard Worker 
590*61046927SAndroid Build Coastguard Worker GLuint64 GLAPIENTRY
_mesa_GetTextureHandleARB(GLuint texture)591*61046927SAndroid Build Coastguard Worker _mesa_GetTextureHandleARB(GLuint texture)
592*61046927SAndroid Build Coastguard Worker {
593*61046927SAndroid Build Coastguard Worker    struct gl_texture_object *texObj = NULL;
594*61046927SAndroid Build Coastguard Worker 
595*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
596*61046927SAndroid Build Coastguard Worker 
597*61046927SAndroid Build Coastguard Worker    if (!_mesa_has_ARB_bindless_texture(ctx)) {
598*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
599*61046927SAndroid Build Coastguard Worker                   "glGetTextureHandleARB(unsupported)");
600*61046927SAndroid Build Coastguard Worker       return 0;
601*61046927SAndroid Build Coastguard Worker    }
602*61046927SAndroid Build Coastguard Worker 
603*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
604*61046927SAndroid Build Coastguard Worker     *
605*61046927SAndroid Build Coastguard Worker     * "The error INVALID_VALUE is generated by GetTextureHandleARB or
606*61046927SAndroid Build Coastguard Worker     *  GetTextureSamplerHandleARB if <texture> is zero or not the name of an
607*61046927SAndroid Build Coastguard Worker     *  existing texture object."
608*61046927SAndroid Build Coastguard Worker     */
609*61046927SAndroid Build Coastguard Worker    if (texture > 0)
610*61046927SAndroid Build Coastguard Worker       texObj = _mesa_lookup_texture(ctx, texture);
611*61046927SAndroid Build Coastguard Worker 
612*61046927SAndroid Build Coastguard Worker    if (!texObj) {
613*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glGetTextureHandleARB(texture)");
614*61046927SAndroid Build Coastguard Worker       return 0;
615*61046927SAndroid Build Coastguard Worker    }
616*61046927SAndroid Build Coastguard Worker 
617*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
618*61046927SAndroid Build Coastguard Worker     *
619*61046927SAndroid Build Coastguard Worker     * "The error INVALID_OPERATION is generated by GetTextureHandleARB or
620*61046927SAndroid Build Coastguard Worker     *  GetTextureSamplerHandleARB if the texture object specified by <texture>
621*61046927SAndroid Build Coastguard Worker     *  is not complete."
622*61046927SAndroid Build Coastguard Worker     */
623*61046927SAndroid Build Coastguard Worker    if (!_mesa_is_texture_complete(texObj, &texObj->Sampler,
624*61046927SAndroid Build Coastguard Worker                                   ctx->Const.ForceIntegerTexNearest)) {
625*61046927SAndroid Build Coastguard Worker       _mesa_test_texobj_completeness(ctx, texObj);
626*61046927SAndroid Build Coastguard Worker       if (!_mesa_is_texture_complete(texObj, &texObj->Sampler,
627*61046927SAndroid Build Coastguard Worker                                      ctx->Const.ForceIntegerTexNearest)) {
628*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_OPERATION,
629*61046927SAndroid Build Coastguard Worker                      "glGetTextureHandleARB(incomplete texture)");
630*61046927SAndroid Build Coastguard Worker          return 0;
631*61046927SAndroid Build Coastguard Worker       }
632*61046927SAndroid Build Coastguard Worker    }
633*61046927SAndroid Build Coastguard Worker 
634*61046927SAndroid Build Coastguard Worker    if (!is_sampler_border_color_valid(&texObj->Sampler)) {
635*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
636*61046927SAndroid Build Coastguard Worker                   "glGetTextureHandleARB(invalid border color)");
637*61046927SAndroid Build Coastguard Worker       return 0;
638*61046927SAndroid Build Coastguard Worker    }
639*61046927SAndroid Build Coastguard Worker 
640*61046927SAndroid Build Coastguard Worker    return get_texture_handle(ctx, texObj, &texObj->Sampler);
641*61046927SAndroid Build Coastguard Worker }
642*61046927SAndroid Build Coastguard Worker 
643*61046927SAndroid Build Coastguard Worker GLuint64 GLAPIENTRY
_mesa_GetTextureSamplerHandleARB_no_error(GLuint texture,GLuint sampler)644*61046927SAndroid Build Coastguard Worker _mesa_GetTextureSamplerHandleARB_no_error(GLuint texture, GLuint sampler)
645*61046927SAndroid Build Coastguard Worker {
646*61046927SAndroid Build Coastguard Worker    struct gl_texture_object *texObj;
647*61046927SAndroid Build Coastguard Worker    struct gl_sampler_object *sampObj;
648*61046927SAndroid Build Coastguard Worker 
649*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
650*61046927SAndroid Build Coastguard Worker 
651*61046927SAndroid Build Coastguard Worker    texObj = _mesa_lookup_texture(ctx, texture);
652*61046927SAndroid Build Coastguard Worker    sampObj = _mesa_lookup_samplerobj(ctx, sampler);
653*61046927SAndroid Build Coastguard Worker 
654*61046927SAndroid Build Coastguard Worker    if (!_mesa_is_texture_complete(texObj, sampObj,
655*61046927SAndroid Build Coastguard Worker                                   ctx->Const.ForceIntegerTexNearest))
656*61046927SAndroid Build Coastguard Worker       _mesa_test_texobj_completeness(ctx, texObj);
657*61046927SAndroid Build Coastguard Worker 
658*61046927SAndroid Build Coastguard Worker    return get_texture_handle(ctx, texObj, sampObj);
659*61046927SAndroid Build Coastguard Worker }
660*61046927SAndroid Build Coastguard Worker 
661*61046927SAndroid Build Coastguard Worker GLuint64 GLAPIENTRY
_mesa_GetTextureSamplerHandleARB(GLuint texture,GLuint sampler)662*61046927SAndroid Build Coastguard Worker _mesa_GetTextureSamplerHandleARB(GLuint texture, GLuint sampler)
663*61046927SAndroid Build Coastguard Worker {
664*61046927SAndroid Build Coastguard Worker    struct gl_texture_object *texObj = NULL;
665*61046927SAndroid Build Coastguard Worker    struct gl_sampler_object *sampObj;
666*61046927SAndroid Build Coastguard Worker 
667*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
668*61046927SAndroid Build Coastguard Worker 
669*61046927SAndroid Build Coastguard Worker    if (!_mesa_has_ARB_bindless_texture(ctx)) {
670*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
671*61046927SAndroid Build Coastguard Worker                   "glGetTextureSamplerHandleARB(unsupported)");
672*61046927SAndroid Build Coastguard Worker       return 0;
673*61046927SAndroid Build Coastguard Worker    }
674*61046927SAndroid Build Coastguard Worker 
675*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
676*61046927SAndroid Build Coastguard Worker     *
677*61046927SAndroid Build Coastguard Worker     * "The error INVALID_VALUE is generated by GetTextureHandleARB or
678*61046927SAndroid Build Coastguard Worker     *  GetTextureSamplerHandleARB if <texture> is zero or not the name of an
679*61046927SAndroid Build Coastguard Worker     *  existing texture object."
680*61046927SAndroid Build Coastguard Worker     */
681*61046927SAndroid Build Coastguard Worker    if (texture > 0)
682*61046927SAndroid Build Coastguard Worker       texObj = _mesa_lookup_texture(ctx, texture);
683*61046927SAndroid Build Coastguard Worker 
684*61046927SAndroid Build Coastguard Worker    if (!texObj) {
685*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE,
686*61046927SAndroid Build Coastguard Worker                   "glGetTextureSamplerHandleARB(texture)");
687*61046927SAndroid Build Coastguard Worker       return 0;
688*61046927SAndroid Build Coastguard Worker    }
689*61046927SAndroid Build Coastguard Worker 
690*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
691*61046927SAndroid Build Coastguard Worker     *
692*61046927SAndroid Build Coastguard Worker     * "The error INVALID_VALUE is generated by GetTextureSamplerHandleARB if
693*61046927SAndroid Build Coastguard Worker     *  <sampler> is zero or is not the name of an existing sampler object."
694*61046927SAndroid Build Coastguard Worker     */
695*61046927SAndroid Build Coastguard Worker    sampObj = _mesa_lookup_samplerobj(ctx, sampler);
696*61046927SAndroid Build Coastguard Worker    if (!sampObj) {
697*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE,
698*61046927SAndroid Build Coastguard Worker                   "glGetTextureSamplerHandleARB(sampler)");
699*61046927SAndroid Build Coastguard Worker       return 0;
700*61046927SAndroid Build Coastguard Worker    }
701*61046927SAndroid Build Coastguard Worker 
702*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
703*61046927SAndroid Build Coastguard Worker     *
704*61046927SAndroid Build Coastguard Worker     * "The error INVALID_OPERATION is generated by GetTextureHandleARB or
705*61046927SAndroid Build Coastguard Worker     *  GetTextureSamplerHandleARB if the texture object specified by <texture>
706*61046927SAndroid Build Coastguard Worker     *  is not complete."
707*61046927SAndroid Build Coastguard Worker     */
708*61046927SAndroid Build Coastguard Worker    if (!_mesa_is_texture_complete(texObj, sampObj,
709*61046927SAndroid Build Coastguard Worker                                   ctx->Const.ForceIntegerTexNearest)) {
710*61046927SAndroid Build Coastguard Worker       _mesa_test_texobj_completeness(ctx, texObj);
711*61046927SAndroid Build Coastguard Worker       if (!_mesa_is_texture_complete(texObj, sampObj,
712*61046927SAndroid Build Coastguard Worker                                      ctx->Const.ForceIntegerTexNearest)) {
713*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_OPERATION,
714*61046927SAndroid Build Coastguard Worker                      "glGetTextureSamplerHandleARB(incomplete texture)");
715*61046927SAndroid Build Coastguard Worker          return 0;
716*61046927SAndroid Build Coastguard Worker       }
717*61046927SAndroid Build Coastguard Worker    }
718*61046927SAndroid Build Coastguard Worker 
719*61046927SAndroid Build Coastguard Worker    if (!is_sampler_border_color_valid(sampObj)) {
720*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
721*61046927SAndroid Build Coastguard Worker                   "glGetTextureSamplerHandleARB(invalid border color)");
722*61046927SAndroid Build Coastguard Worker       return 0;
723*61046927SAndroid Build Coastguard Worker    }
724*61046927SAndroid Build Coastguard Worker 
725*61046927SAndroid Build Coastguard Worker    return get_texture_handle(ctx, texObj, sampObj);
726*61046927SAndroid Build Coastguard Worker }
727*61046927SAndroid Build Coastguard Worker 
728*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MakeTextureHandleResidentARB_no_error(GLuint64 handle)729*61046927SAndroid Build Coastguard Worker _mesa_MakeTextureHandleResidentARB_no_error(GLuint64 handle)
730*61046927SAndroid Build Coastguard Worker {
731*61046927SAndroid Build Coastguard Worker    struct gl_texture_handle_object *texHandleObj;
732*61046927SAndroid Build Coastguard Worker 
733*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
734*61046927SAndroid Build Coastguard Worker 
735*61046927SAndroid Build Coastguard Worker    texHandleObj = lookup_texture_handle(ctx, handle);
736*61046927SAndroid Build Coastguard Worker    make_texture_handle_resident(ctx, texHandleObj, true);
737*61046927SAndroid Build Coastguard Worker }
738*61046927SAndroid Build Coastguard Worker 
739*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MakeTextureHandleResidentARB(GLuint64 handle)740*61046927SAndroid Build Coastguard Worker _mesa_MakeTextureHandleResidentARB(GLuint64 handle)
741*61046927SAndroid Build Coastguard Worker {
742*61046927SAndroid Build Coastguard Worker    struct gl_texture_handle_object *texHandleObj;
743*61046927SAndroid Build Coastguard Worker 
744*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
745*61046927SAndroid Build Coastguard Worker 
746*61046927SAndroid Build Coastguard Worker    if (!_mesa_has_ARB_bindless_texture(ctx)) {
747*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
748*61046927SAndroid Build Coastguard Worker                   "glMakeTextureHandleResidentARB(unsupported)");
749*61046927SAndroid Build Coastguard Worker       return;
750*61046927SAndroid Build Coastguard Worker    }
751*61046927SAndroid Build Coastguard Worker 
752*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
753*61046927SAndroid Build Coastguard Worker     *
754*61046927SAndroid Build Coastguard Worker     * "The error INVALID_OPERATION is generated by MakeTextureHandleResidentARB
755*61046927SAndroid Build Coastguard Worker     *  if <handle> is not a valid texture handle, or if <handle> is already
756*61046927SAndroid Build Coastguard Worker     *  resident in the current GL context."
757*61046927SAndroid Build Coastguard Worker     */
758*61046927SAndroid Build Coastguard Worker    texHandleObj = lookup_texture_handle(ctx, handle);
759*61046927SAndroid Build Coastguard Worker    if (!texHandleObj) {
760*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
761*61046927SAndroid Build Coastguard Worker                   "glMakeTextureHandleResidentARB(handle)");
762*61046927SAndroid Build Coastguard Worker       return;
763*61046927SAndroid Build Coastguard Worker    }
764*61046927SAndroid Build Coastguard Worker 
765*61046927SAndroid Build Coastguard Worker    if (is_texture_handle_resident(ctx, handle)) {
766*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
767*61046927SAndroid Build Coastguard Worker                   "glMakeTextureHandleResidentARB(already resident)");
768*61046927SAndroid Build Coastguard Worker       return;
769*61046927SAndroid Build Coastguard Worker    }
770*61046927SAndroid Build Coastguard Worker 
771*61046927SAndroid Build Coastguard Worker    make_texture_handle_resident(ctx, texHandleObj, true);
772*61046927SAndroid Build Coastguard Worker }
773*61046927SAndroid Build Coastguard Worker 
774*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MakeTextureHandleNonResidentARB_no_error(GLuint64 handle)775*61046927SAndroid Build Coastguard Worker _mesa_MakeTextureHandleNonResidentARB_no_error(GLuint64 handle)
776*61046927SAndroid Build Coastguard Worker {
777*61046927SAndroid Build Coastguard Worker    struct gl_texture_handle_object *texHandleObj;
778*61046927SAndroid Build Coastguard Worker 
779*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
780*61046927SAndroid Build Coastguard Worker 
781*61046927SAndroid Build Coastguard Worker    texHandleObj = lookup_texture_handle(ctx, handle);
782*61046927SAndroid Build Coastguard Worker    make_texture_handle_resident(ctx, texHandleObj, false);
783*61046927SAndroid Build Coastguard Worker }
784*61046927SAndroid Build Coastguard Worker 
785*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MakeTextureHandleNonResidentARB(GLuint64 handle)786*61046927SAndroid Build Coastguard Worker _mesa_MakeTextureHandleNonResidentARB(GLuint64 handle)
787*61046927SAndroid Build Coastguard Worker {
788*61046927SAndroid Build Coastguard Worker    struct gl_texture_handle_object *texHandleObj;
789*61046927SAndroid Build Coastguard Worker 
790*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
791*61046927SAndroid Build Coastguard Worker 
792*61046927SAndroid Build Coastguard Worker    if (!_mesa_has_ARB_bindless_texture(ctx)) {
793*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
794*61046927SAndroid Build Coastguard Worker                   "glMakeTextureHandleNonResidentARB(unsupported)");
795*61046927SAndroid Build Coastguard Worker       return;
796*61046927SAndroid Build Coastguard Worker    }
797*61046927SAndroid Build Coastguard Worker 
798*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
799*61046927SAndroid Build Coastguard Worker     *
800*61046927SAndroid Build Coastguard Worker     * "The error INVALID_OPERATION is generated by
801*61046927SAndroid Build Coastguard Worker     *  MakeTextureHandleNonResidentARB if <handle> is not a valid texture
802*61046927SAndroid Build Coastguard Worker     *  handle, or if <handle> is not resident in the current GL context."
803*61046927SAndroid Build Coastguard Worker     */
804*61046927SAndroid Build Coastguard Worker    texHandleObj = lookup_texture_handle(ctx, handle);
805*61046927SAndroid Build Coastguard Worker    if (!texHandleObj) {
806*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
807*61046927SAndroid Build Coastguard Worker                   "glMakeTextureHandleNonResidentARB(handle)");
808*61046927SAndroid Build Coastguard Worker       return;
809*61046927SAndroid Build Coastguard Worker    }
810*61046927SAndroid Build Coastguard Worker 
811*61046927SAndroid Build Coastguard Worker    if (!is_texture_handle_resident(ctx, handle)) {
812*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
813*61046927SAndroid Build Coastguard Worker                   "glMakeTextureHandleNonResidentARB(not resident)");
814*61046927SAndroid Build Coastguard Worker       return;
815*61046927SAndroid Build Coastguard Worker    }
816*61046927SAndroid Build Coastguard Worker 
817*61046927SAndroid Build Coastguard Worker    make_texture_handle_resident(ctx, texHandleObj, false);
818*61046927SAndroid Build Coastguard Worker }
819*61046927SAndroid Build Coastguard Worker 
820*61046927SAndroid Build Coastguard Worker GLuint64 GLAPIENTRY
_mesa_GetImageHandleARB_no_error(GLuint texture,GLint level,GLboolean layered,GLint layer,GLenum format)821*61046927SAndroid Build Coastguard Worker _mesa_GetImageHandleARB_no_error(GLuint texture, GLint level, GLboolean layered,
822*61046927SAndroid Build Coastguard Worker                                  GLint layer, GLenum format)
823*61046927SAndroid Build Coastguard Worker {
824*61046927SAndroid Build Coastguard Worker    struct gl_texture_object *texObj;
825*61046927SAndroid Build Coastguard Worker 
826*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
827*61046927SAndroid Build Coastguard Worker 
828*61046927SAndroid Build Coastguard Worker    texObj = _mesa_lookup_texture(ctx, texture);
829*61046927SAndroid Build Coastguard Worker    if (!_mesa_is_texture_complete(texObj, &texObj->Sampler,
830*61046927SAndroid Build Coastguard Worker                                   ctx->Const.ForceIntegerTexNearest))
831*61046927SAndroid Build Coastguard Worker       _mesa_test_texobj_completeness(ctx, texObj);
832*61046927SAndroid Build Coastguard Worker 
833*61046927SAndroid Build Coastguard Worker    return get_image_handle(ctx, texObj, level, layered, layer, format);
834*61046927SAndroid Build Coastguard Worker }
835*61046927SAndroid Build Coastguard Worker 
836*61046927SAndroid Build Coastguard Worker GLuint64 GLAPIENTRY
_mesa_GetImageHandleARB(GLuint texture,GLint level,GLboolean layered,GLint layer,GLenum format)837*61046927SAndroid Build Coastguard Worker _mesa_GetImageHandleARB(GLuint texture, GLint level, GLboolean layered,
838*61046927SAndroid Build Coastguard Worker                         GLint layer, GLenum format)
839*61046927SAndroid Build Coastguard Worker {
840*61046927SAndroid Build Coastguard Worker    struct gl_texture_object *texObj = NULL;
841*61046927SAndroid Build Coastguard Worker 
842*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
843*61046927SAndroid Build Coastguard Worker 
844*61046927SAndroid Build Coastguard Worker    if (!_mesa_has_ARB_bindless_texture(ctx) ||
845*61046927SAndroid Build Coastguard Worker        !_mesa_has_ARB_shader_image_load_store(ctx)) {
846*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
847*61046927SAndroid Build Coastguard Worker                   "glGetImageHandleARB(unsupported)");
848*61046927SAndroid Build Coastguard Worker       return 0;
849*61046927SAndroid Build Coastguard Worker    }
850*61046927SAndroid Build Coastguard Worker 
851*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
852*61046927SAndroid Build Coastguard Worker     *
853*61046927SAndroid Build Coastguard Worker     * "The error INVALID_VALUE is generated by GetImageHandleARB if <texture>
854*61046927SAndroid Build Coastguard Worker     *  is zero or not the name of an existing texture object, if the image for
855*61046927SAndroid Build Coastguard Worker     *  <level> does not existing in <texture>, or if <layered> is FALSE and
856*61046927SAndroid Build Coastguard Worker     *  <layer> is greater than or equal to the number of layers in the image at
857*61046927SAndroid Build Coastguard Worker     *  <level>."
858*61046927SAndroid Build Coastguard Worker     */
859*61046927SAndroid Build Coastguard Worker    if (texture > 0)
860*61046927SAndroid Build Coastguard Worker       texObj = _mesa_lookup_texture(ctx, texture);
861*61046927SAndroid Build Coastguard Worker 
862*61046927SAndroid Build Coastguard Worker    if (!texObj) {
863*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glGetImageHandleARB(texture)");
864*61046927SAndroid Build Coastguard Worker       return 0;
865*61046927SAndroid Build Coastguard Worker    }
866*61046927SAndroid Build Coastguard Worker 
867*61046927SAndroid Build Coastguard Worker    if (level < 0 || level >= _mesa_max_texture_levels(ctx, texObj->Target)) {
868*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glGetImageHandleARB(level)");
869*61046927SAndroid Build Coastguard Worker       return 0;
870*61046927SAndroid Build Coastguard Worker    }
871*61046927SAndroid Build Coastguard Worker 
872*61046927SAndroid Build Coastguard Worker    if (!layered && layer > _mesa_get_texture_layers(texObj, level)) {
873*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glGetImageHandleARB(layer)");
874*61046927SAndroid Build Coastguard Worker       return 0;
875*61046927SAndroid Build Coastguard Worker    }
876*61046927SAndroid Build Coastguard Worker 
877*61046927SAndroid Build Coastguard Worker    if (!_mesa_is_shader_image_format_supported(ctx, format)) {
878*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glGetImageHandleARB(format)");
879*61046927SAndroid Build Coastguard Worker       return 0;
880*61046927SAndroid Build Coastguard Worker    }
881*61046927SAndroid Build Coastguard Worker 
882*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
883*61046927SAndroid Build Coastguard Worker     *
884*61046927SAndroid Build Coastguard Worker     * "The error INVALID_OPERATION is generated by GetImageHandleARB if the
885*61046927SAndroid Build Coastguard Worker     *  texture object <texture> is not complete or if <layered> is TRUE and
886*61046927SAndroid Build Coastguard Worker     *  <texture> is not a three-dimensional, one-dimensional array, two
887*61046927SAndroid Build Coastguard Worker     *  dimensional array, cube map, or cube map array texture."
888*61046927SAndroid Build Coastguard Worker     */
889*61046927SAndroid Build Coastguard Worker    if (!_mesa_is_texture_complete(texObj, &texObj->Sampler,
890*61046927SAndroid Build Coastguard Worker                                   ctx->Const.ForceIntegerTexNearest)) {
891*61046927SAndroid Build Coastguard Worker       _mesa_test_texobj_completeness(ctx, texObj);
892*61046927SAndroid Build Coastguard Worker       if (!_mesa_is_texture_complete(texObj, &texObj->Sampler,
893*61046927SAndroid Build Coastguard Worker                                      ctx->Const.ForceIntegerTexNearest)) {
894*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_OPERATION,
895*61046927SAndroid Build Coastguard Worker                      "glGetImageHandleARB(incomplete texture)");
896*61046927SAndroid Build Coastguard Worker          return 0;
897*61046927SAndroid Build Coastguard Worker       }
898*61046927SAndroid Build Coastguard Worker    }
899*61046927SAndroid Build Coastguard Worker 
900*61046927SAndroid Build Coastguard Worker    if (layered && !_mesa_tex_target_is_layered(texObj->Target)) {
901*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
902*61046927SAndroid Build Coastguard Worker                   "glGetImageHandleARB(not layered)");
903*61046927SAndroid Build Coastguard Worker       return 0;
904*61046927SAndroid Build Coastguard Worker    }
905*61046927SAndroid Build Coastguard Worker 
906*61046927SAndroid Build Coastguard Worker    return get_image_handle(ctx, texObj, level, layered, layer, format);
907*61046927SAndroid Build Coastguard Worker }
908*61046927SAndroid Build Coastguard Worker 
909*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MakeImageHandleResidentARB_no_error(GLuint64 handle,GLenum access)910*61046927SAndroid Build Coastguard Worker _mesa_MakeImageHandleResidentARB_no_error(GLuint64 handle, GLenum access)
911*61046927SAndroid Build Coastguard Worker {
912*61046927SAndroid Build Coastguard Worker    struct gl_image_handle_object *imgHandleObj;
913*61046927SAndroid Build Coastguard Worker 
914*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
915*61046927SAndroid Build Coastguard Worker 
916*61046927SAndroid Build Coastguard Worker    imgHandleObj = lookup_image_handle(ctx, handle);
917*61046927SAndroid Build Coastguard Worker    make_image_handle_resident(ctx, imgHandleObj, access, true);
918*61046927SAndroid Build Coastguard Worker }
919*61046927SAndroid Build Coastguard Worker 
920*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MakeImageHandleResidentARB(GLuint64 handle,GLenum access)921*61046927SAndroid Build Coastguard Worker _mesa_MakeImageHandleResidentARB(GLuint64 handle, GLenum access)
922*61046927SAndroid Build Coastguard Worker {
923*61046927SAndroid Build Coastguard Worker    struct gl_image_handle_object *imgHandleObj;
924*61046927SAndroid Build Coastguard Worker 
925*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
926*61046927SAndroid Build Coastguard Worker 
927*61046927SAndroid Build Coastguard Worker    if (!_mesa_has_ARB_bindless_texture(ctx) ||
928*61046927SAndroid Build Coastguard Worker        !_mesa_has_ARB_shader_image_load_store(ctx)) {
929*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
930*61046927SAndroid Build Coastguard Worker                   "glMakeImageHandleResidentARB(unsupported)");
931*61046927SAndroid Build Coastguard Worker       return;
932*61046927SAndroid Build Coastguard Worker    }
933*61046927SAndroid Build Coastguard Worker 
934*61046927SAndroid Build Coastguard Worker    if (access != GL_READ_ONLY &&
935*61046927SAndroid Build Coastguard Worker        access != GL_WRITE_ONLY &&
936*61046927SAndroid Build Coastguard Worker        access != GL_READ_WRITE) {
937*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_ENUM,
938*61046927SAndroid Build Coastguard Worker                   "glMakeImageHandleResidentARB(access)");
939*61046927SAndroid Build Coastguard Worker       return;
940*61046927SAndroid Build Coastguard Worker    }
941*61046927SAndroid Build Coastguard Worker 
942*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
943*61046927SAndroid Build Coastguard Worker     *
944*61046927SAndroid Build Coastguard Worker     * "The error INVALID_OPERATION is generated by MakeImageHandleResidentARB
945*61046927SAndroid Build Coastguard Worker     *  if <handle> is not a valid image handle, or if <handle> is already
946*61046927SAndroid Build Coastguard Worker     *  resident in the current GL context."
947*61046927SAndroid Build Coastguard Worker     */
948*61046927SAndroid Build Coastguard Worker    imgHandleObj = lookup_image_handle(ctx, handle);
949*61046927SAndroid Build Coastguard Worker    if (!imgHandleObj) {
950*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
951*61046927SAndroid Build Coastguard Worker                   "glMakeImageHandleResidentARB(handle)");
952*61046927SAndroid Build Coastguard Worker       return;
953*61046927SAndroid Build Coastguard Worker    }
954*61046927SAndroid Build Coastguard Worker 
955*61046927SAndroid Build Coastguard Worker    if (is_image_handle_resident(ctx, handle)) {
956*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
957*61046927SAndroid Build Coastguard Worker                   "glMakeImageHandleResidentARB(already resident)");
958*61046927SAndroid Build Coastguard Worker       return;
959*61046927SAndroid Build Coastguard Worker    }
960*61046927SAndroid Build Coastguard Worker 
961*61046927SAndroid Build Coastguard Worker    make_image_handle_resident(ctx, imgHandleObj, access, true);
962*61046927SAndroid Build Coastguard Worker }
963*61046927SAndroid Build Coastguard Worker 
964*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MakeImageHandleNonResidentARB_no_error(GLuint64 handle)965*61046927SAndroid Build Coastguard Worker _mesa_MakeImageHandleNonResidentARB_no_error(GLuint64 handle)
966*61046927SAndroid Build Coastguard Worker {
967*61046927SAndroid Build Coastguard Worker    struct gl_image_handle_object *imgHandleObj;
968*61046927SAndroid Build Coastguard Worker 
969*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
970*61046927SAndroid Build Coastguard Worker 
971*61046927SAndroid Build Coastguard Worker    imgHandleObj = lookup_image_handle(ctx, handle);
972*61046927SAndroid Build Coastguard Worker    make_image_handle_resident(ctx, imgHandleObj, GL_READ_ONLY, false);
973*61046927SAndroid Build Coastguard Worker }
974*61046927SAndroid Build Coastguard Worker 
975*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MakeImageHandleNonResidentARB(GLuint64 handle)976*61046927SAndroid Build Coastguard Worker _mesa_MakeImageHandleNonResidentARB(GLuint64 handle)
977*61046927SAndroid Build Coastguard Worker {
978*61046927SAndroid Build Coastguard Worker    struct gl_image_handle_object *imgHandleObj;
979*61046927SAndroid Build Coastguard Worker 
980*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
981*61046927SAndroid Build Coastguard Worker 
982*61046927SAndroid Build Coastguard Worker    if (!_mesa_has_ARB_bindless_texture(ctx) ||
983*61046927SAndroid Build Coastguard Worker        !_mesa_has_ARB_shader_image_load_store(ctx)) {
984*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
985*61046927SAndroid Build Coastguard Worker                   "glMakeImageHandleNonResidentARB(unsupported)");
986*61046927SAndroid Build Coastguard Worker       return;
987*61046927SAndroid Build Coastguard Worker    }
988*61046927SAndroid Build Coastguard Worker 
989*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
990*61046927SAndroid Build Coastguard Worker     *
991*61046927SAndroid Build Coastguard Worker     * "The error INVALID_OPERATION is generated by
992*61046927SAndroid Build Coastguard Worker     *  MakeImageHandleNonResidentARB if <handle> is not a valid image handle,
993*61046927SAndroid Build Coastguard Worker     *  or if <handle> is not resident in the current GL context."
994*61046927SAndroid Build Coastguard Worker     */
995*61046927SAndroid Build Coastguard Worker    imgHandleObj = lookup_image_handle(ctx, handle);
996*61046927SAndroid Build Coastguard Worker    if (!imgHandleObj) {
997*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
998*61046927SAndroid Build Coastguard Worker                   "glMakeImageHandleNonResidentARB(handle)");
999*61046927SAndroid Build Coastguard Worker       return;
1000*61046927SAndroid Build Coastguard Worker    }
1001*61046927SAndroid Build Coastguard Worker 
1002*61046927SAndroid Build Coastguard Worker    if (!is_image_handle_resident(ctx, handle)) {
1003*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
1004*61046927SAndroid Build Coastguard Worker                   "glMakeImageHandleNonResidentARB(not resident)");
1005*61046927SAndroid Build Coastguard Worker       return;
1006*61046927SAndroid Build Coastguard Worker    }
1007*61046927SAndroid Build Coastguard Worker 
1008*61046927SAndroid Build Coastguard Worker    make_image_handle_resident(ctx, imgHandleObj, GL_READ_ONLY, false);
1009*61046927SAndroid Build Coastguard Worker }
1010*61046927SAndroid Build Coastguard Worker 
1011*61046927SAndroid Build Coastguard Worker GLboolean GLAPIENTRY
_mesa_IsTextureHandleResidentARB_no_error(GLuint64 handle)1012*61046927SAndroid Build Coastguard Worker _mesa_IsTextureHandleResidentARB_no_error(GLuint64 handle)
1013*61046927SAndroid Build Coastguard Worker {
1014*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1015*61046927SAndroid Build Coastguard Worker    return is_texture_handle_resident(ctx, handle);
1016*61046927SAndroid Build Coastguard Worker }
1017*61046927SAndroid Build Coastguard Worker 
1018*61046927SAndroid Build Coastguard Worker GLboolean GLAPIENTRY
_mesa_IsTextureHandleResidentARB(GLuint64 handle)1019*61046927SAndroid Build Coastguard Worker _mesa_IsTextureHandleResidentARB(GLuint64 handle)
1020*61046927SAndroid Build Coastguard Worker {
1021*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1022*61046927SAndroid Build Coastguard Worker 
1023*61046927SAndroid Build Coastguard Worker    if (!_mesa_has_ARB_bindless_texture(ctx)) {
1024*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
1025*61046927SAndroid Build Coastguard Worker                   "glIsTextureHandleResidentARB(unsupported)");
1026*61046927SAndroid Build Coastguard Worker       return GL_FALSE;
1027*61046927SAndroid Build Coastguard Worker    }
1028*61046927SAndroid Build Coastguard Worker 
1029*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
1030*61046927SAndroid Build Coastguard Worker     *
1031*61046927SAndroid Build Coastguard Worker     * "The error INVALID_OPERATION will be generated by
1032*61046927SAndroid Build Coastguard Worker     *  IsTextureHandleResidentARB and IsImageHandleResidentARB if <handle> is
1033*61046927SAndroid Build Coastguard Worker     *  not a valid texture or image handle, respectively."
1034*61046927SAndroid Build Coastguard Worker     */
1035*61046927SAndroid Build Coastguard Worker    if (!lookup_texture_handle(ctx, handle)) {
1036*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
1037*61046927SAndroid Build Coastguard Worker                   "glIsTextureHandleResidentARB(handle)");
1038*61046927SAndroid Build Coastguard Worker       return GL_FALSE;
1039*61046927SAndroid Build Coastguard Worker    }
1040*61046927SAndroid Build Coastguard Worker 
1041*61046927SAndroid Build Coastguard Worker    return is_texture_handle_resident(ctx, handle);
1042*61046927SAndroid Build Coastguard Worker }
1043*61046927SAndroid Build Coastguard Worker 
1044*61046927SAndroid Build Coastguard Worker GLboolean GLAPIENTRY
_mesa_IsImageHandleResidentARB_no_error(GLuint64 handle)1045*61046927SAndroid Build Coastguard Worker _mesa_IsImageHandleResidentARB_no_error(GLuint64 handle)
1046*61046927SAndroid Build Coastguard Worker {
1047*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1048*61046927SAndroid Build Coastguard Worker    return is_image_handle_resident(ctx, handle);
1049*61046927SAndroid Build Coastguard Worker }
1050*61046927SAndroid Build Coastguard Worker 
1051*61046927SAndroid Build Coastguard Worker GLboolean GLAPIENTRY
_mesa_IsImageHandleResidentARB(GLuint64 handle)1052*61046927SAndroid Build Coastguard Worker _mesa_IsImageHandleResidentARB(GLuint64 handle)
1053*61046927SAndroid Build Coastguard Worker {
1054*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1055*61046927SAndroid Build Coastguard Worker 
1056*61046927SAndroid Build Coastguard Worker    if (!_mesa_has_ARB_bindless_texture(ctx) ||
1057*61046927SAndroid Build Coastguard Worker        !_mesa_has_ARB_shader_image_load_store(ctx)) {
1058*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
1059*61046927SAndroid Build Coastguard Worker                   "glIsImageHandleResidentARB(unsupported)");
1060*61046927SAndroid Build Coastguard Worker       return GL_FALSE;
1061*61046927SAndroid Build Coastguard Worker    }
1062*61046927SAndroid Build Coastguard Worker 
1063*61046927SAndroid Build Coastguard Worker    /* The ARB_bindless_texture spec says:
1064*61046927SAndroid Build Coastguard Worker     *
1065*61046927SAndroid Build Coastguard Worker     * "The error INVALID_OPERATION will be generated by
1066*61046927SAndroid Build Coastguard Worker     *  IsTextureHandleResidentARB and IsImageHandleResidentARB if <handle> is
1067*61046927SAndroid Build Coastguard Worker     *  not a valid texture or image handle, respectively."
1068*61046927SAndroid Build Coastguard Worker     */
1069*61046927SAndroid Build Coastguard Worker    if (!lookup_image_handle(ctx, handle)) {
1070*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
1071*61046927SAndroid Build Coastguard Worker                   "glIsImageHandleResidentARB(handle)");
1072*61046927SAndroid Build Coastguard Worker       return GL_FALSE;
1073*61046927SAndroid Build Coastguard Worker    }
1074*61046927SAndroid Build Coastguard Worker 
1075*61046927SAndroid Build Coastguard Worker    return is_image_handle_resident(ctx, handle);
1076*61046927SAndroid Build Coastguard Worker }
1077