static bool
dest_is_invariant(nir_dest *dest, struct set *invariants)
{
   if (dest->is_ssa) {
      return _mesa_set_search(invariants, &dest->ssa);
   } else {
      return _mesa_set_search(invariants, dest->reg.reg);
   }
}
Пример #2
0
void GLAPIENTRY
_mesa_VDPAUSurfaceAccessNV(GLintptr surface, GLenum access)
{
   struct vdp_surface *surf = (struct vdp_surface *)surface;
   GET_CURRENT_CONTEXT(ctx);

   if (!ctx->vdpDevice || !ctx->vdpGetProcAddress || !ctx->vdpSurfaces) {
      _mesa_error(ctx, GL_INVALID_OPERATION, "VDPAUSurfaceAccessNV");
      return;
   }

   if (!_mesa_set_search(ctx->vdpSurfaces, surf)) {
      _mesa_error(ctx, GL_INVALID_VALUE, "VDPAUSurfaceAccessNV");
      return;
   }

   if (access != GL_READ_ONLY && access != GL_WRITE_ONLY &&
       access != GL_READ_WRITE) {

      _mesa_error(ctx, GL_INVALID_VALUE, "VDPAUSurfaceAccessNV");
      return;
   }

   if (surf->state == GL_SURFACE_MAPPED_NV) {
      _mesa_error(ctx, GL_INVALID_OPERATION, "VDPAUSurfaceAccessNV");
      return;
   }

   surf->access = access;
}
Пример #3
0
void GLAPIENTRY
_mesa_VDPAUGetSurfaceivNV(GLintptr surface, GLenum pname, GLsizei bufSize,
                          GLsizei *length, GLint *values)
{
   struct vdp_surface *surf = (struct vdp_surface *)surface;
   GET_CURRENT_CONTEXT(ctx);

   if (!ctx->vdpDevice || !ctx->vdpGetProcAddress || !ctx->vdpSurfaces) {
      _mesa_error(ctx, GL_INVALID_OPERATION, "VDPAUGetSurfaceivNV");
      return;
   }

   if (!_mesa_set_search(ctx->vdpSurfaces, surf)) {
      _mesa_error(ctx, GL_INVALID_VALUE, "VDPAUGetSurfaceivNV");
      return;
   }

   if (pname != GL_SURFACE_STATE_NV) {
      _mesa_error(ctx, GL_INVALID_ENUM, "VDPAUGetSurfaceivNV");
      return;
   }

   if (bufSize < 1) {
      _mesa_error(ctx, GL_INVALID_VALUE, "VDPAUGetSurfaceivNV");
      return;
   }

   values[0] = surf->state;

   if (length != NULL)
      *length = 1;
}
Пример #4
0
void GLAPIENTRY
_mesa_VDPAUUnregisterSurfaceNV(GLintptr surface)
{
   struct vdp_surface *surf = (struct vdp_surface *)surface;
   struct set_entry *entry;
   int i;
   GET_CURRENT_CONTEXT(ctx);

   if (!ctx->vdpDevice || !ctx->vdpGetProcAddress || !ctx->vdpSurfaces) {
      _mesa_error(ctx, GL_INVALID_OPERATION, "VDPAUUnregisterSurfaceNV");
      return;
   }

   /* according to the spec it's ok when this is zero */
   if (surface == 0)
      return;

   entry = _mesa_set_search(ctx->vdpSurfaces, surf);
   if (!entry) {
      _mesa_error(ctx, GL_INVALID_VALUE, "VDPAUUnregisterSurfaceNV");
      return;
   }

   for (i = 0; i < MAX_TEXTURES; i++) {
      if (surf->textures[i]) {
         surf->textures[i]->Immutable = GL_FALSE;
         _mesa_reference_texobj(&surf->textures[i], NULL);
      }
   }

   _mesa_set_remove(ctx->vdpSurfaces, entry);
   free(surf);
}
Пример #5
0
/* Identical to nir_assign_var_locations_packed except that it assigns
 * locations to the variables that are used 100% directly first and then
 * assigns locations to variables that are used indirectly.
 */
void
nir_assign_var_locations_scalar_direct_first(nir_shader *shader,
                                             struct exec_list *var_list,
                                             unsigned *direct_size,
                                             unsigned *size)
{
   struct set *indirect_set = _mesa_set_create(NULL, _mesa_hash_pointer,
                                               _mesa_key_pointer_equal);

   nir_foreach_overload(shader, overload) {
      if (overload->impl)
         nir_foreach_block(overload->impl, mark_indirect_uses_block,
                           indirect_set);
   }

   unsigned location = 0;

   foreach_list_typed(nir_variable, var, node, var_list) {
      if (var->data.mode == nir_var_uniform && var->interface_type != NULL)
         continue;

      if (_mesa_set_search(indirect_set, var))
         continue;

      var->data.driver_location = location;
      location += type_size(var->type);
   }

   *direct_size = location;

   foreach_list_typed(nir_variable, var, node, var_list) {
      if (var->data.mode == nir_var_uniform && var->interface_type != NULL)
         continue;

      if (!_mesa_set_search(indirect_set, var))
         continue;

      var->data.driver_location = location;
      location += type_size(var->type);
   }

   *size = location;

   _mesa_set_destroy(indirect_set, NULL);
}
Пример #6
0
/**
 * Check if the given sync object is:
 *  - non-null
 *  - not in sync objects hash table
 *  - type is GL_SYNC_FENCE
 *  - not marked as deleted
 */
bool
_mesa_validate_sync(struct gl_context *ctx,
                    const struct gl_sync_object *syncObj)
{
   return (syncObj != NULL)
      && _mesa_set_search(ctx->Shared->SyncObjects, syncObj) != NULL
      && (syncObj->Type == GL_SYNC_FENCE)
      && !syncObj->DeletePending;
}
Пример #7
0
static int
_mesa_validate_sync(struct gl_context *ctx, struct gl_sync_object *syncObj)
{
   return (syncObj != NULL)
      && _mesa_set_search(ctx->Shared->SyncObjects,
                          _mesa_hash_pointer(syncObj),
                          syncObj) != NULL
      && (syncObj->Type == GL_SYNC_FENCE)
      && !syncObj->DeletePending;
}
Пример #8
0
void GLAPIENTRY
_mesa_VDPAUMapSurfacesNV(GLsizei numSurfaces, const GLintptr *surfaces)
{
   GET_CURRENT_CONTEXT(ctx);
   int i;

   if (!ctx->vdpDevice || !ctx->vdpGetProcAddress || !ctx->vdpSurfaces) {
      _mesa_error(ctx, GL_INVALID_OPERATION, "VDPAUUnmapSurfacesNV");
      return;
   }

   for (i = 0; i < numSurfaces; ++i) {
      struct vdp_surface *surf = (struct vdp_surface *)surfaces[i];

      if (!_mesa_set_search(ctx->vdpSurfaces, surf)) {
         _mesa_error(ctx, GL_INVALID_VALUE, "VDPAUSurfaceAccessNV");
         return;
      }

      if (surf->state == GL_SURFACE_MAPPED_NV) {
         _mesa_error(ctx, GL_INVALID_OPERATION, "VDPAUSurfaceAccessNV");
         return;
      }
   }

   for (i = 0; i < numSurfaces; ++i) {
      struct vdp_surface *surf = (struct vdp_surface *)surfaces[i];
      unsigned numTextureNames = surf->output ? 1 : 4;
      unsigned j;

      for (j = 0; j < numTextureNames; ++j) {
         struct gl_texture_object *tex = surf->textures[j];
         struct gl_texture_image *image;

         _mesa_lock_texture(ctx, tex);
         image = _mesa_get_tex_image(ctx, tex, surf->target, 0);
         if (!image) {
            _mesa_error(ctx, GL_OUT_OF_MEMORY, "VDPAUMapSurfacesNV");
            _mesa_unlock_texture(ctx, tex);
            return;
         }

         ctx->Driver.FreeTextureImageBuffer(ctx, image);

         ctx->Driver.VDPAUMapSurface(ctx, surf->target, surf->access,
                                     surf->output, tex, image,
                                     surf->vdpSurface, j);

         _mesa_unlock_texture(ctx, tex);
      }
      surf->state = GL_SURFACE_MAPPED_NV;
   }
}
Пример #9
0
   virtual ir_visitor_status visit(ir_dereference_variable *ir)
   {
      struct set_entry *entry = _mesa_set_search(variables, ir->var);

      /* If a variable is dereferenced at all, remove it from the set of
       * variables that are candidates for removal.
       */
      if (entry != NULL)
         _mesa_set_remove(variables, entry);

      return visit_continue;
   }
Пример #10
0
GLboolean GLAPIENTRY
_mesa_VDPAUIsSurfaceNV(GLintptr surface)
{
   struct vdp_surface *surf = (struct vdp_surface *)surface;
   GET_CURRENT_CONTEXT(ctx);

   if (!ctx->vdpDevice || !ctx->vdpGetProcAddress || !ctx->vdpSurfaces) {
      _mesa_error(ctx, GL_INVALID_OPERATION, "VDPAUIsSurfaceNV");
      return false;
   }

   if (!_mesa_set_search(ctx->vdpSurfaces, surf)) {
      return false;
   }

   return true;
}
Пример #11
0
/**
 * Check if the given sync object is:
 *  - non-null
 *  - not in sync objects hash table
 *  - not marked as deleted
 *
 * Returns the internal gl_sync_object pointer if the sync object is valid
 * or NULL if it isn't.
 *
 * If "incRefCount" is true, the reference count is incremented, which is
 * normally what you want; otherwise, a glDeleteSync from another thread
 * could delete the sync object while you are still working on it.
 */
struct gl_sync_object *
_mesa_get_and_ref_sync(struct gl_context *ctx, GLsync sync, bool incRefCount)
{
   struct gl_sync_object *syncObj = (struct gl_sync_object *) sync;
   simple_mtx_lock(&ctx->Shared->Mutex);
   if (syncObj != NULL
      && _mesa_set_search(ctx->Shared->SyncObjects, syncObj) != NULL
      && !syncObj->DeletePending) {
     if (incRefCount) {
       syncObj->RefCount++;
     }
   } else {
     syncObj = NULL;
   }
   simple_mtx_unlock(&ctx->Shared->Mutex);
   return syncObj;
}
Пример #12
0
void
_mesa_unref_sync_object(struct gl_context *ctx, struct gl_sync_object *syncObj)
{
   struct set_entry *entry;

   mtx_lock(&ctx->Shared->Mutex);
   syncObj->RefCount--;
   if (syncObj->RefCount == 0) {
      entry = _mesa_set_search(ctx->Shared->SyncObjects, syncObj);
      assert (entry != NULL);
      _mesa_set_remove(ctx->Shared->SyncObjects, entry);
      mtx_unlock(&ctx->Shared->Mutex);

      ctx->Driver.DeleteSyncObject(ctx, syncObj);
   } else {
      mtx_unlock(&ctx->Shared->Mutex);
   }
}
Пример #13
0
void
_mesa_unref_sync_object(struct gl_context *ctx, struct gl_sync_object *syncObj)
{
   struct set_entry *entry;

   _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
   syncObj->RefCount--;
   if (syncObj->RefCount == 0) {
      entry = _mesa_set_search(ctx->Shared->SyncObjects,
                               _mesa_hash_pointer(syncObj),
                               syncObj);
      assert (entry != NULL);
      _mesa_set_remove(ctx->Shared->SyncObjects, entry);
      _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);

      ctx->Driver.DeleteSyncObject(ctx, syncObj);
   } else {
      _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
   }
}
Пример #14
0
static bool
var_is_invariant(nir_variable *var, struct set * invariants)
{
   return var->data.invariant || _mesa_set_search(invariants, var);
}