Считывание кадрового буфера шейдера

Мне было интересно, есть ли поддержка в новых моделях шейдеров для считывания значения пикселя из целевого буфера кадра. Я предполагаю, что это уже делается на более поздних (непрограммируемых) этапах конвейера рисования, что заставило меня надеяться, что эта функция могла быть добавлена ​​в программируемый конвейер.

Я знаю, что можно рисовать в текстуру связанного кадрового буфера, а затем отправить эту текстуру шейдеру, я просто надеялся на более элегантный способ достижения той же функциональности. защищенный длинный m_RunningCounter защищенный объект m_Lock = новый объект (); public long ...

У меня есть код, который должен быть потокобезопасным, поведение которого похоже на это:


protected long m_RunningValue
protected long m_RunningCounter
protected object m_Lock = new object();

public long RunningValue { get { return Interlocked.Read(m_RunningValue); } }
public long RunningCounter { get { return Interlocked.Read(m_RunningCounter); } }

public void DoCalculation(int newValue, int newQuantity)
{
   lock(m_Lock)
   {
       Interlocked.Add(ref m_RunningValueA, newValue);
       Interlocked.Add(ref m_RunningCounter, newQuantity);
       if(Interlocked.Read(ref newQuantity) == 0)
       { 
         ...m_RunningValue gets further modified here
       }
   }
}

Вычисление должно блокировать и значение, и счетчик, иначе условие гонки может повлиять на блок if (...), однако их вообще не нужно синхронизировать при считывании, то есть, если счетчик и значение изменяются между попытками чтения обоих, это на 100% нормально для меня.

Блокировка чтения предназначена для чтения с безопасностью потоков 64-битного значения.

  1. Безопасно ли такое смешивание блокировок и блокировок? Я читал на других веб-страницах, что их смешивание небезопасно, однако я не могу найти пояснений, означает ли это, что их смешивание - отличный способ внести небольшие ошибки, или если на системном уровне это может повредить задействованные структуры данных.

  2. Стоимость всей этой блокировки (64-битная .NET 4. 0) полностью исключают цель сохранения блокировки ReaderWriterSlim вокруг методов свойства get ()?

6
задан Chuu 7 December 2010 в 23:39
поделиться