tu: Implement fallback linear staging blit for CopyImage
[mesa.git] / src / gallium / state_trackers / vdpau / htab.c
index 20f5a171f1962ad9cf7125c6091418030b571bce..f596b2d571fd712e060f936b9c7fa5e64ec881d4 100644 (file)
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
  **************************************************************************/
 
-#include <util/u_handle_table.h>
-#include <os/os_thread.h>
+#include "util/u_handle_table.h"
+#include "os/os_thread.h"
 #include "vdpau_private.h"
 
-#ifdef VL_HANDLES
 static struct handle_table *htab = NULL;
-pipe_static_mutex(htab_lock);
-#endif
+static mtx_t htab_lock = _MTX_INITIALIZER_NP;
 
 boolean vlCreateHTAB(void)
 {
-#ifdef VL_HANDLES
    boolean ret;
+
    /* Make sure handle table handles match VDPAU handles. */
    assert(sizeof(unsigned) <= sizeof(vlHandle));
-   pipe_mutex_lock(htab_lock);
+   mtx_lock(&htab_lock);
    if (!htab)
       htab = handle_table_create();
    ret = htab != NULL;
-   pipe_mutex_unlock(htab_lock);
+   mtx_unlock(&htab_lock);
    return ret;
-#else
-   return TRUE;
-#endif
 }
 
 void vlDestroyHTAB(void)
 {
-#ifdef VL_HANDLES
-   pipe_mutex_lock(htab_lock);
-   if (htab) {
+   mtx_lock(&htab_lock);
+   if (htab && !handle_table_get_first_handle(htab)) {
       handle_table_destroy(htab);
       htab = NULL;
    }
-   pipe_mutex_unlock(htab_lock);
-#endif
+   mtx_unlock(&htab_lock);
 }
 
 vlHandle vlAddDataHTAB(void *data)
 {
-   assert(data);
-#ifdef VL_HANDLES
    vlHandle handle = 0;
-   pipe_mutex_lock(htab_lock);
+
+   assert(data);
+   mtx_lock(&htab_lock);
    if (htab)
       handle = handle_table_add(htab, data);
-   pipe_mutex_unlock(htab_lock);
+   mtx_unlock(&htab_lock);
    return handle;
-#else
-   return (vlHandle)data;
-#endif
 }
 
 void* vlGetDataHTAB(vlHandle handle)
 {
-   assert(handle);
-#ifdef VL_HANDLES
    void *data = NULL;
-   pipe_mutex_lock(htab_lock);
+
+   assert(handle);
+   mtx_lock(&htab_lock);
    if (htab)
       data = handle_table_get(htab, handle);
-   pipe_mutex_unlock(htab_lock);
+   mtx_unlock(&htab_lock);
    return data;
-#else
-   return (void*)handle;
-#endif
 }
 
 void vlRemoveDataHTAB(vlHandle handle)
 {
-#ifdef VL_HANDLES
-   pipe_mutex_lock(htab_lock);
+   mtx_lock(&htab_lock);
    if (htab)
       handle_table_remove(htab, handle);
-   pipe_mutex_unlock(htab_lock);
-#endif
+   mtx_unlock(&htab_lock);
 }