Пример #1
0
/* nsIVariant getDevices (in T_WebCLDeviceType aType); */
NS_IMETHODIMP WebCLPlatform::GetDevices(T_WebCLDeviceType aType, JSContext *cx, nsIVariant **_retval)
{
  D_METHOD_START;
  NS_ENSURE_ARG_POINTER (_retval);
  nsresult rv;

  nsTArray<cl_device_id> devices;
  cl_int err = mWrapper->getDeviceIDs (mInternal, aType, devices);
  ENSURE_LIB_WRAPPER_SUCCESS (mWrapper);
  ENSURE_CL_OP_SUCCESS (err);

  nsCOMPtr<nsIVariant> res;
  rv = WebCL_convertVectorToJSArrayInVariant (cx, devices, types::DEVICE_V,
                                              getter_AddRefs (res), mWrapper);
  NS_ENSURE_SUCCESS (rv, rv);

  NS_ADDREF (*_retval = res);
  return NS_OK;
}
Пример #2
0
/* nsIVariant createKernelsInProgram (); */
NS_IMETHODIMP WebCLProgram::CreateKernelsInProgram(JSContext *cx, nsIVariant **_retval)
{
  D_METHOD_START;
  NS_ENSURE_ARG_POINTER (cx);
  NS_ENSURE_ARG_POINTER (_retval);
  nsresult rv;

  nsTArray<cl_kernel> kernels;
  cl_int err = mWrapper->createKernelsInProgram (mInternal, kernels);
  ENSURE_LIB_WRAPPER_SUCCESS (mWrapper);
  ENSURE_CL_OP_SUCCESS (err);

  nsCOMPtr<nsIVariant> value;
  rv = WebCL_convertVectorToJSArrayInVariant (cx, kernels,
                                              types::KERNEL_V,
                                              getter_AddRefs (value),
                                              mWrapper);
  NS_ENSURE_SUCCESS (rv, rv);

  NS_ADDREF (*_retval = value);

  return NS_OK;
}
Пример #3
0
/* nsIVariant getProgramInfo (in long aName); */
NS_IMETHODIMP WebCLProgram::GetProgramInfo(PRInt32 aName, JSContext *cx, nsIVariant **_retval)
{
  D_METHOD_START;

  NS_ENSURE_ARG_POINTER (_retval);
  nsresult rv;
  cl_int err = CL_SUCCESS;
  int type = getTypeForInfoName (aName);
  if (type == types::UNKNOWN)
  {
    D_LOG (LOG_LEVEL_ERROR, "Info parameter name %d does not have a known type.", aName);
    WebCL_reportJSError (cx, "Info name %d is not supported by %s.",
                         aName, __FUNCTION__);
    return WEBCL_XPCOM_ERROR; //NS_ERROR_FAILURE;
  }

  nsCOMPtr<nsIWritableVariant> variant = do_CreateInstance(NS_VARIANT_CONTRACTID, &rv);
  NS_ENSURE_SUCCESS (rv, rv);

  // TODO NOTE CL_PROGRAM_BINARIES WORKAROUND - THIS PARAMETER SHOULD PROBABLY BE BLOCKED
  if (aName == CL_PROGRAM_BINARIES)
  {
    // CL_PROGRAM_BINARIES does not write it's result directly to the target buffer
    // but to an array pointers to additional buffers of allocated by caller. The sizes
    // of these buffers are queried using CL_PROGRAM_BINARY_SIZES
    nsTArray<size_t> binarySizes;
    mWrapper->getProgramInfo (mInternal, CL_PROGRAM_BINARY_SIZES, binarySizes);
    nsTArray<char*> binaries;
    binaries.SetLength (binarySizes.Length());
    for (size_t i = 0; i < binaries.Length(); ++i)
    {
      binaries[i] = (char*)malloc(sizeof(char) * binarySizes[i]);
      // Allocation failures produce NULL and we expect that OCL library knows
      // how to handle that.
    }

    err = mWrapper->library()->symbols->clGetProgramInfo (mInternal, CL_PROGRAM_BINARIES,
                                                          sizeof(char*) * binaries.Length(),
                                                          binaries.Elements(), NULL);
    if (CL_FAILED (err))
    {
      for (nsTArray<char*>::index_type i = 0; i < binaries.Length(); ++i)
      {
        free (binaries[i]);
      }
      D_LOG (LOG_LEVEL_ERROR, "getInfo for %d failed. (error %d)", aName, err);
      WebCL_reportJSError (cx, "%s failed with error %d.", __FUNCTION__, err);
      return WEBCL_XPCOM_ERROR; /*NS_ERROR_FAILURE;*/
    }

    // Convert result to something we can apply our standard mechanism to
    nsTArray<nsCString> results;
    results.SetCapacity (binaries.Length());
    for (size_t i = 0; i < binaries.Length(); ++i)
    {
      results.AppendElement (nsCString(binaries[i]));
      free (binaries[i]);
    }

    rv = WebCL_convertVectorToJSArrayInVariant (cx, results, types::STRING_V,
                                                (nsIVariant**)&variant, mWrapper);
    NS_ENSURE_SUCCESS (rv, rv);
  }
  else
  {
    WEBCL_GETINFO_MEDIATOR_SWITCH (aName, type, mWrapper, getProgramInfo, mInternal,
                                   variant, err, rv);
  }

  NS_ADDREF (*_retval = variant);

  return NS_OK;
}